接下来,我们通过创建一个服务条目示例来了解如何通过Istio CoreDNS实现DNS寻址。前面已经提到,服务条目描述了服务的属性,包括DNS名称、虚拟IP、端口、协议以及端点等。这类服务可能是网格外的API,或者处于网格内部但却不存在于平台的服务注册表中,例如需要和Kubernetes服务沟通的一组基于虚拟机提供的服务。
下面的例子中,使用了通配符定义hosts,并指定了地址address,如下所示:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-svc-serviceentry
spec:
hosts:
- '*.test.global'
addresses:
- 127.255.0.2
ports:
- number: 8080
name: http1
protocol: HTTP
location: MESH_INTERNAL
resolution: DNS
endpoints:
- address: 47.111.38.80
ports:
http1: 15443
保存上述YAML定义为一个文件如serviceentry.yaml,然后执行如下命令就可以创建出一个服务条目实例:
kubectl apply -f serviceentry.yaml
接着,执行如下命令查看容器istiocoredns,可以看到上述服务条目的域名映射关系已经被加载:
kubectl get po -n istio-system | grep istiocoredns istiocoredns-cdc56b67-ngtkr 2/2 Running 0 1h kubectl logs --tail 2 -n istio-system istiocoredns-cdc56b67-ngtkr -c istio-coredns-plugin 2019-01-08T05:27:22.897845Z info Have 1 service entries 2019-01-08T05:27:22.897888Z info adding DNS mapping: .test.global.->[127.255.0.2]
使用镜像tutum/dnsutils创建测试容器:
kubectl run dnsutils -it --image=tutum/dnsutils bash
进入容器命令行之后,执行dig查看相应的域名解析:
root@dnsutils-d485fdbbc-8q6mp:/# dig +short 172.19.0.10 A service1.test.global 127.255.0.2 root@dnsutils-d485fdbbc-8q6mp:/# dig +short 172.19.0.10 A service2.test.global 127.255.0.2