使用服务条目资源(ServiceEntry)能够将条目添加到 Istio 内部维护的服务注册表中。添加服务条目后,Envoy 代理能够将流量发送到该服务,就好像该服务条目是网格中的服务同样。经过配置服务条目,能够管理在网格外部运行的服务的流量。api
此外,能够配置虚拟服务和目标规则,以更精细的方式控制到服务条目的流量,就像为网格中的其余任何服务配置流量同样。app
上面的介绍有点晦涩,不如咱们直接给一个样例出来,该样例包含两个资源文件:网站
client.yaml # istio 要注入的客户端资源文件spa
svc-entry.yaml # 服务条目资源文件3d
svc-entry.yaml 内容以下:代理
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: svc-entry spec: hosts: - "www.baidu.com" ports: - number: 80 name: http protocol: HTTP location: MESH_EXTERNAL resolution: DNS
该服务条目资源定义了一个外部网站 baidu,并将它归入到 Istio 内部维护的服务注册表中。执行以下语句建立 service entry 资源:code
kubectl apply -f svc-entry.yamlblog
client.yaml 客户端资源文件以下:ip
apiVersion: apps/v1 kind: Deployment metadata: name: client spec: replicas: 1 selector: matchLabels: app: client template: metadata: labels: app: client spec: containers: - name: busybox image: busybox imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c", "sleep 3600"]
编辑完,执行以下语句进行 Istio 注入:资源
istioctl kube-inject -f client.yaml | kubectl apply -f -
执行成功后,查看 pod 发现容器个数为 2 个,说明 istio 注入成功:
Istio 注入后,client 就处于 Istio 服务网格之中。
执行以下语句登陆 client:
kubectl exec -it $(kubectl get pods | grep -i client | awk '{print $1}') -- sh
登录 client,访问 www.baidu.com 成功,以下所示:
你可能会迷惑,难道这就是服务条目?不是访问外网吗?
好吧,这还就真是服务条目。为了解除你心中的疑惑,咱们如今来对刚才编写的 ServiceEntry 资源作一些手脚。
调整内容以下所示:
apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: svc-entry spec: hosts: - "www.baidu.com" ports: - number: 80 name: http protocol: HTTP location: MESH_EXTERNAL resolution: STATIC endpoints: - address: 172.20.10.10
添加了域名解析类型为 static,同时给出一个自定义 IP:192.168.182.188。再次 kubectl apply 后登录 client 查看:
再次访问 baidu,发现已经不会成功了,多试验几回,同样不会成功。
出现此问题的缘由是,service entry 一直都在发挥做用,前面没报错的缘由是默认指定的域名解析是基于 DNS 的。而调整后,咱们设置了静态域名解析的方式,并随意给了一个内网 IP 来标识 baidu。kubectl apply service entry 后此配置马上就被应用在网格内(client)的 envoy,那么在网格内访问 baidu 的时候,流量就被路由到了咱们所指定的 192.168.182.188 去了。
执行以下语句删除 service entry,再次登陆 client 访问 baidu,发现岁月静好。
使用 service entry 使用场景有哪些?这里给你一个场景,好比工做过程当中你须要调用外部合做方服务,该服务跟你的集群毫无关系,甚至对方服务能够布置在美国。可是经过服务条目,你能够将对方服务归入到本身的 Istio 网格以内,就像它自己存在你的集群以内同样,就好像你作了内网拦截同样。并且服务条目能够结合虚拟服务(virtual service)、目的地规则(destination rule)作更加精细的流量控制,不只如此,还能够作失败注入、重试等功能。