设置 DNS 代理
DNS 代理是一项可提供以下功能的特性:
- 在多集群设置中跨集群传播
Services的 DNS 条目。 - 为
ServiceEntry填充 DNS 条目。
Kubernetes 仅为本地集群中的 Services 提供 DNS 解析。如果您需要为远程集群中的 Services 提供域名解析,或者要对 ServiceEntry 使用仅限内部使用的主机名,但没有额外的仅限内部使用的 DNS 服务器,则在此类情况下,可以使用 DNS 代理来解析 DNS 域名。
配置 DNS 代理
如需配置 DNS 代理,请按如下方式配置 ISTIO_META_DNS_CAPTURE 标志。 您可以选择集群范围的配置或每个代理范围的配置。
集群范围配置
如需在集群中配置 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...
ServiceEntry 的 IP 自动分配
将 ServiceEntry 与 DNS 代理搭配使用时,您可以选择启用 IP 自动分配。启用后,系统会自动为 spec.addresses 中未指定明确 IP 地址的 ServiceEntry 主机分配内部 IP 地址(来自 240.240.0.0/16 范围)。
启用 IP 自动分配
如需启用 IP 自动分配,请按照控制平面实现的相应说明操作:
TRAFFIC_DIRECTOR
对于 TRAFFIC_DIRECTOR 控制平面实现,请通过设置 ip_auto_allocation: "true" 在 istio-system 命名空间的 asm-options ConfigMap 中配置 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" 来配置 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 自动分配是否正常运行。
在验证之前,请创建不指定 spec.addresses 的 ServiceEntry:
$ 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 代理的 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...