設定 DNS Proxy

DNS Proxy 可提供下列功能:

  1. 多叢集設定中,跨叢集傳播 Services 的 DNS 項目。
  2. 正在填入 ServiceEntry 的 DNS 項目。

Kubernetes 只會解析本機叢集中的 Services。如要在遠端叢集中為 Services 提供名稱解析,或在沒有額外的僅限內部 DNS 伺服器時,搭配 ServiceEntry 使用僅限內部的主機名稱,DNS Proxy 可提供解析這類 DNS 名稱的方法。

設定 DNS Proxy

如要設定 DNS Proxy,請按照下列方式設定 ISTIO_META_DNS_CAPTURE 旗標。 您可以選擇叢集或每個 Proxy 的廣泛設定。

叢集範圍設定

如要在叢集中設定 DNS Proxy,請將 ISTIO_META_DNS_CAPTURE Proxy 中繼資料新增至 ConfigMapMeshConfigConfigMap 的名稱格式為 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
...

接著,從其他叢集使用 curlService 時,應會顯示 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...

ServiceEntry 的 IP 自動分配功能

使用 DNS Proxy 時,您可以選擇啟用 IP 自動分配功能。ServiceEntry啟用後,系統會自動為 spec.addresses 中未指定明確 IP 位址的 ServiceEntry 主機,分配內部 IP 位址 (來自 240.240.0.0/16 範圍)。

啟用 IP 自動分配功能

如要啟用 IP 自動分配功能,請按照控制層實作的相關操作說明進行:

TRAFFIC_DIRECTOR

針對 TRAFFIC_DIRECTOR 控制層實作,在 istio-system 命名空間中設定 asm-options ConfigMap 內的 IP 自動分配,方法是設定 ip_auto_allocation: "true"

以下範例顯示啟用 IP 自動分配功能的 asm-options ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: asm-options
  namespace: istio-system
data:
  # Enable IP auto-allocation for ServiceEntry (Rapid channel)
  ip_auto_allocation: "true"

您也可以使用 kubectl patch 套用這項設定:

kubectl patch configmap/asm-options -n istio-system --type merge \
  -p '{"data":{"ip_auto_allocation":"true"}}'

ISTIOD

如為使用 ISTIOD 控制層實作 (叢集內或代管 ISTIOD) 的叢集,請在 MeshConfig 內將 ISTIO_META_DNS_AUTO_ALLOCATE: "true" 新增至 Proxy 中繼資料,藉此設定 IP 自動分配:

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

驗證 IP 自動分配功能

如要確認 IP 自動分配功能是否正常運作,請按照下列步驟操作。

驗證前,請先建立 ServiceEntry,但不要指定 spec.addresses

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: auto-allocated-service-entry
  namespace: ns1
spec:
  hosts:
  - auto-allocated.internal
  ports:
  - name: http
    number: 80
    protocol: HTTP
  resolution: DNS
EOF

1. 在 status.addresses 中檢查已分配的地址 (僅限 TRAFFIC_DIRECTOR)

TRAFFIC_DIRECTOR 實作中,控制器會分配 VIP 並填入 ServiceEntrystatus.addresses 欄位:

$ kubectl get serviceentry auto-allocated-service-entry -n ns1 -o yaml

輸出內容會在 status.addresses 下方顯示已分配的位址:

status:
  addresses:
  - host: auto-allocated.internal
    value: 240.240.0.1

2. 從 Pod 測試 DNS 解析 (TRAFFIC_DIRECTORISTIOD)

TRAFFIC_DIRECTORISTIOD 實作中,從啟用 DNS Proxy 的 Pod 傳送要求,確認名稱解析會解析為已分配的 VIP:

$ kubectl exec deploy/curl -n ns1 -- curl -sS -v http://auto-allocated.internal

連線嘗試應會解析為自動分配的 VIP (例如 240.240.0.1:80):

*   Trying 240.240.0.1:80...