5.6.5 创建服务条目验证DNS解析

接下来,我们通过创建一个服务条目示例来了解如何通过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