(客户端/服务器使用Istio 0.5.1、kubectl 1.9.1/1.9.0、minikube 0.25.0)
我试图让Istio EgressRules与Kubernetes服务一起工作,但遇到了一些问题。
我试着用三种方式设置EgressRules:
-
指向另一个域的ExternalName服务(如
www.google。com)
-
没有选择器但关联
Endpoint对象(对于具有IP地址但没有DNS的服务
名称)
-
(供比较)没有Kubernetes服务,只有一个EgressRule
我想我可以使用kubernetes服务的FQDN作为基于HTTP的EgressRule目标服务(如
ext-service.default.svc.cluster.local
),这就是我为ExternalName服务以及没有选择器但有关联Endpoints对象的服务所尝试的。
对于前者,我创建了以下内容
yaml
文件:
kind: Service
apiVersion: v1
metadata:
name: ext-service
spec:
type: ExternalName
externalName: www.google.com
---
apiVersion: config.istio.io/v1alpha2
kind: EgressRule
metadata:
name: ext-egress-rule
spec:
destination:
service: ext-service.default.svc.cluster.local
ports:
- port: 443
protocol: https
对于后者,我创建了这个
亚马尔
文件(我刚刚ping了google并抓取了IP地址):
kind: Endpoints
apiVersion: v1
metadata:
name: ext-service
subsets:
- addresses:
- ip: 216.58.198.78
ports:
- port: 443
---
kind: Service
apiVersion: v1
metadata:
name: ext-service
spec:
ports:
- protocol: TCP
port: 443
targetPort: 443
---
apiVersion: config.istio.io/v1alpha2
kind: EgressRule
metadata:
name: ext-service-egress-rule
spec:
destination:
service: ext-service.default.svc.cluster.local
ports:
- port: 443
protocol: https
在这两种情况下,在应用程序代码中,我访问:
http://ext-service.default.svc.cluster.local:443
我的假设是,交通流量如下:
[[ app -> envoy proxy -> (tls origination) -> kubernetes service ]] -> external service
哪里
[[ ... ]]
是服务网格(以及Kubernetes集群)的边界
结果:
我想使用Kubernetes服务(即使是用于外部流量),原因如下:
-
您不能将IP地址用于EgressRule的目标服务。从…起
Egress Rules configuration
:“出口规则的目标…可以是完全限定的或通配符域名”。
-
对于没有域名的外部服务(一些prem legacy/monolith服务上没有DNS名称),我希望应用程序能够通过kube DNS(或与Istio相关的类似名称)访问它们,而不是通过IP地址。
-
(与前一个相关)我喜欢Kubernetes服务提供的额外抽象层,因此我可以在不更改EgressRule的情况下更改底层目的地(除非我弄错了,这不是构建这个的正确方法)。EgressRule是否意味着完全替代Kubernetes服务进行外部通信,而不创建额外的Kubernetes服务?
使用
https://
应用程序中的代码不是一个选项,因为由于kube dns名称与证书上的任何名称都不匹配,因此请求必须禁用TLS验证。它也不会被观察到。
如果我使用以下EgressRule(没有任何Kubernetes服务),通过
http://www.google.com:443
工作正常,获得了我所期望的准确html表示:
apiVersion: config.istio.io/v1alpha2
kind: EgressRule
metadata:
name: google-egress-rule
spec:
destination:
service: www.google.com
ports:
- port: 443
protocol: https
我看到有一个TCP EgressRule,但我不想为每个IP块指定规则。从…起
TCP Egress
:“在TCP出口规则中,与基于HTTP的出口规则相反,目的地由IP或CIDR表示法中的IP块指定。”。
此外,我仍然希望L7而不是L4提供基于HTTP的可观察性,因此我更喜欢基于HTTP的出口。(对于TCP出口,“应用程序发起的HTTPS流量将被Istio视为不透明TCP”)。
任何帮助获得一个Kubernetes服务作为EgressRule的“目的地服务”(或者帮助理解为什么在这种情况下这是不必要的)都是非常感谢的。谢谢