索引总目录:istio从入门到放弃系列
1、介绍
使用服务条目资源(Service Entries)可以将条目添加到 Istio 内部维护的服务注册表中。添加服务条目后,Envoy 代理可以将流量发送到该服务,就好像该服务条目是网格中的服务一样。通过配置服务条目,可以管理在网格外部运行的服务的流量。
此外,可以配置虚拟服务和目标规则,以更精细的方式控制到服务条目的流量,就像为网格中的其他任何服务配置流量一样。
2、创建资源
2.1 创建服务条目资源
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: test-entry
spec:
hosts:
- "www.baidu.com"
ports:
- number: 80
name: http
protocol: HTTP
location: MESH_EXTERNAL
resolution: DNS
该服务条目资源定义了一个外部网站 baidu,并将它纳入到 Istio 内部维护的服务注册表中
kubectl apply -f test-entry.yaml
kubectl get serviceentry.networking.istio.io
2.2 创建客户端资源
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 注入成功:
3、验证服务条目
3.1 进入client容器中访问baidu.com成功
3.2 调整 service entiries 解析类型
调整如下
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: test-entry
spec:
hosts:
- "www.baidu.com"
ports:
- number: 80
name: http
protocol: HTTP
location: MESH_EXTERNAL
resolution: STATIC
endpoints:
- address: 192.168.10.88
再次访问 baidu,发现已经不会成功了,多试验几次,一样不会成功。
出现此问题的原因是,service entry 一直都在发挥作用,前面没报错的原因是默认指定的域名解析是基于 DNS 的。而调整后,我们设置了静态域名解析的方式,并随意给了一个内网 IP 来标识 baidu。修改ServiceEntry配置立刻就被应用在网格内(client)的 envoy,那么在网格内访问 baidu 的时候,流量就被路由到了我们所指定的 192.168.10.88 去了。
删除 service entry,再次登录 client 访问 baidu,发现一切正常
4、service entry 使用场景
比如工作过程中你需要调用外部合作方服务,该服务跟你的集群毫无关系,甚至对方服务可以布置在美国。但是通过服务条目,你可以将对方服务纳入到自己的 Istio 网格之内,就像它本身存在你的集群之内一样,就好像你做了内网拦截一样。而且服务条目可以结合虚拟服务(virtual service)、目的地规则(destination rule)做更加精细的流量控制,不仅如此,还可以做失败注入、重试等功能。
来源:oschina
链接:https://my.oschina.net/u/4409965/blog/4296897