設定 DNS Proxy
DNS Proxy 功能可提供下列功能:
- 在多叢集設定中,跨叢集傳播
Services的 DNS 項目。 - 正在填入
ServiceEntry的 DNS 項目。
Kubernetes 只會為本機叢集中的 Services 提供 DNS 解析服務。當您需要在遠端叢集中為 Services 提供名稱解析,或搭配 ServiceEntry 使用僅限內部的主機名稱,但沒有額外的僅限內部 DNS 伺服器時,DNS Proxy 可提供解析這類 DNS 名稱的方法。
設定 DNS Proxy
如要設定 DNS Proxy,請依下列方式設定 ISTIO_META_DNS_CAPTURE 旗標。 您可以選擇叢集或每個 Proxy 的廣泛設定。
叢集範圍設定
如要在叢集中設定 DNS Proxy,請將 ISTIO_META_DNS_CAPTURE Proxy 中繼資料新增至 MeshConfig 的 ConfigMap。ConfigMap 的名稱格式為 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 時,應該會顯示 ClusterIP,如下所示。Service
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啟用後,系統會自動為 ServiceEntry 主機分配內部 IP 位址 (來自 240.240.0.0/16 範圍),這些主機不會在 spec.addresses 中指定明確的 IP 位址。
啟用 IP 自動分配功能
如要啟用 IP 自動分配功能,請按照控制層實作的指示操作:
TRAFFIC_DIRECTOR
如要實作 TRAFFIC_DIRECTOR 控制層,請在 asm-options ConfigMap istio-system 命名空間中設定 ip_auto_allocation: "true",以自動分配 IP。
以下範例顯示啟用 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 並填入 ServiceEntry 的 status.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 (TRAFFIC_DIRECTOR 和 ISTIOD) 測試 DNS 解析
在 TRAFFIC_DIRECTOR 和 ISTIOD 實作中,從啟用 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...