設定 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 中繼資料新增至 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
從其他叢集傳送至 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...