设置 DNS 代理
DNS 代理是一项可提供以下功能的特性:
- 在多集群设置中跨集群传播
Services
的 DNS 条目。 - 为
ServiceEntry
填充 DNS 条目。
Kubernetes 仅为本地集群中的 Services
提供 DNS 解析。如果您需要为远程集群中的 Services
提供域名解析,或者要对 ServiceEntry
使用仅限内部使用的主机名,但没有额外的仅限内部使用的 DNS 服务器,则在此类情况下,可以使用 DNS 代理来解析 DNS 域名。
配置 DNS 代理
集群范围配置
如需在集群中配置 DNS 代理,请将 ISTIO_META_DNS_CAPTURE
代理元数据添加到 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
按代理配置
如需为某个代理配置 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...