設定 DNS Proxy

DNS Proxy 功能可提供下列功能:

  1. 多叢集設定中,在叢集之間複製 Services 的 DNS 項目。
  2. ServiceEntry 填入 DNS 項目。

Kubernetes 只會為本機叢集中的 Services 提供 DNS 解析。當您需要在遠端叢集中為 Services 提供名稱解析功能,或是在 ServiceEntry 中使用僅限內部的主機名稱,但沒有額外的僅限內部 DNS 伺服器時,DNS Proxy 會提供一種方法,可針對這類情況解析 DNS 名稱。

設定 DNS Proxy

叢集層級設定

如要在叢集中設定 DNS Proxy,請將 ISTIO_META_DNS_CAPTURE Proxy 中繼資料新增至 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

每個 Proxy 設定

如要為 Proxy 設定 DNS Proxy,請新增 ISTIO_META_DNS_CAPTURE Proxy 中繼資料註解,如下所示:

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 的名稱解析

新增 ServiceEntry 與未在 DNS 中註冊的主機名稱。如要驗證名稱解析,以下範例有明確的地址 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 Proxy 的 Pod 中嘗試 DNS 解析。舉例來說,如果您在 Pod 中執行 curl,應會顯示以下 IP 位址:

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