12.5.2 设置DNS

为远程集群中的服务提供DNS解析,则现有应用程序不需要做修改就可以运行,因为应用程序通常期望通过其DNS名称来解析服务并访问所得到的IP地址。Istio本身不使用DNS在服务之间路由请求,同一个Kubernetes集群下的服务会共享一个相同的DNS后缀(例如svc.cluster.local)。Kubernetes DNS为这些服务提供DNS解析能力。为了给远程集群中的服务提供相似的设置,将远程集群中的服务以<name>.<namespace>.global的格式命名。

Istio安装包中附带了一个CoreDNS服务器,该服务器将为这些服务提供DNS解析能力。为了利用这个DNS解析能力,需要配置Kubernetes的DNS服务指向该CoreDNS服务。该CoreDNS服务将作为.global DNS域的DNS服务器。

对于使用kube-dns的集群,请创建以下配置项或更新现有的配置项:


kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {"global": ["$(kubectl get svc -n istio-system istiocoredns -o jsonpath={.spec.clusterIP})"]}
EOF

对于使用CoreDNS的集群,请创建以下配置项或更新现有的配置项:


kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           upstream
           fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        proxy . /etc/resolv.conf
        cache 30
        reload
        loadbalance
    }
    global:53 {
        errors
        cache 30
        proxy . $(kubectl get svc -n istio-system istiocoredns -o jsonpath={.
          spec.clusterIP})
    }
EOF