设置 DNS 代理

DNS 代理是一项可提供以下功能的特性:

  1. 多集群设置中跨集群传播 Services 的 DNS 条目。
  2. ServiceEntry 填充 DNS 条目。

Kubernetes 仅为本地集群中的 Services 提供 DNS 解析。如果您需要为远程集群中的 Services 提供域名解析,或者要对 ServiceEntry 使用仅限内部使用的主机名,但没有额外的仅限内部使用的 DNS 服务器,则在此类情况下,可以使用 DNS 代理来解析 DNS 域名。

配置 DNS 代理

集群范围配置

如需在集群中配置 DNS 代理,请将 ISTIO_META_DNS_CAPTURE 代理元数据添加到 MeshConfigConfigMapConfigMap 的名称采用 istio-<revision_name> 格式。如需了解修订版本的详细信息,请参阅修订版本概览

apiVersion: v1
data:
  mesh: |-
    ...
    defaultConfig:
      proxyMetadata:
        ISTIO_META_DNS_CAPTURE: "true"        
    ...
kind: ConfigMap
metadata:
  name: istio-<revision_name>
  namespace: istio-system

按代理配置

如需为某个代理配置 DNS 代理,请添加 ISTIO_META_DNS_CAPTURE 代理元数据注解,如下所示:

kind: Deployment
metadata:
  name: app1
  namespace: ns1
spec:
...
  template:
    metadata:
      annotations:
        proxy.istio.io/config: |
          proxyMetadata:
            ISTIO_META_DNS_CAPTURE: "true"
...

验证中

跨集群 Service 的域名解析

完成多集群设置后,仅在其中一个集群中部署 Service,以验证跨集群域名解析。

如果您有以下示例 Service ns1/svc1,则可以在 Service 中找到 ClusterIP

$ kubectl get -n ns1 svc1
kind: Service
metadata:
  name: svc1
  namespace: ns1
spec:
...
  ClusterIP: 210.200.1.1
...

然后,如果使用 curl 从其他集群连接到 Service,应会显示如下所示的 ClusterIP

curl -sS -v svc1.ns1.svc.cluster.local
*   Trying 210.200.1.1:80...

ServiceEntry 的域名解析

添加一个主机名未在 DNS 中注册的 ServiceEntry。为了验证域名解析,以下示例使用了明确的地址 192.168.123.123

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: test-service-entry
spec:
  addresses:
  - "192.168.123.123"
  hosts:
  - not-existing-hostname.internal
  ports:
  - name: http
    number: 80
    protocol: HTTP
EOF

然后,在启用了 DNS 代理的 Pod 中尝试 DNS 解析。例如,如果您在该 Pod 中运行 curl,应会显示如下所示的 IP 地址:

curl -sS -v not-existing-hostname.internal
*   Trying 192.168.123.123:80...