部署 NetScaler CPX 作为 Kubernetes 节点的本地 DNS 缓存
Kubernetes 群集中的应用程序 pod 依靠 DNS 与其他应用程序 pod 进行通信。来自 Kubernetes 群集内的应用程序的 DNS 请求由 Kubernetes DNS (kube-dns) 进行处理。由于微服务体系结构的广泛采用,Kubernetes 群集内的 DNS 请求率不断增加。因此,Kubernetes DNS(kube-dns)会负担过重。现在,您可以在每个 Kubernetes 节点上部署 NetScaler CPX 作为本地 DNS 缓存,并将来自节点中应用程序容器的 DNS 请求转发到 NetScaler CPX。因此,您可以更快地解析 DNS 请求,并显著降低 Kubernetes DNS 的负载。
要部署 NetScaler CPX,使用 Kubernetes DaemonSet 实体在 Kubernetes 群集中的每个节点上调度 NetScaler CPX 容器。Kubernetes DaemonSet 确保群集中的每个 Kubernetes 节点上都有一个 NetScaler CPX 实例。 要让应用程序容器将流量引导到 CPX DNS 容器,您需要创建一个终端节点作为 NetScaler CPX 容器的 Kubernetes 服务。此服务的群集 IP 用作应用程序 pod 的 DNS 端点。为了确保应用程序容器使用 NetScaler CPX 服务群集 IP 地址进行 DNS 解析,您需要使用 NetScaler CPX 服务群集 IP 更新每个节点上的 kubelet 配置文件。
引入了以下环境变量以支持部署 NetScaler CPX 作为 NodeLocal DNS 缓存:
-
KUBE_DNS_SVC_IP
:指定kube-dns
服务的群集 IP 地址,这是在 NetScaler CPX 容器上触发配置的必填参数。当 NetScaler CPX 缓存中没有 DNS 查询响应时,NetScaler CPX 容器会将 DNS 查询定向到此 IP 地址。 -
CPX_DNS_SVC_IP
:指定 NetScaler CPX 服务的群集 IP 地址。CPX_DNS_SVC_IP
环境变量用于在节点上配置本地 DNS。配置此变量时,会添加一条iptables
规则,将来自应用程序容器的 DNS 请求定向到节点内的本地 NetScaler CPX 容器。 -
NS_DNS_FORCE_TCP
:此环境变量强制对 DNS 请求使用 TCP,即使查询是通过 UDP 接收的亦如此。 -
NS_DNS_EXT_RESLV_IP
:指定外部名称服务器的 IP 地址,以定向特定域的 DNS 请求。 -
NS_DNS_MATCH_DOMAIN
:指定要匹配的外部域字符串以将查询定向到外部名称服务器。
将 NetScaler CPX 作为 DNS 缓存部署在节点上
部署 NetScaler CPX 作为 Kubernetes 群集的本地 DNS 缓存包括以下任务:
在主节点上:
-
创建以端点作为 NetScaler CPX 容器的 Kubernetes 服务
-
创建 ConfigMap 用于为 NetScaler CPX 容器定义环境变量
-
使用 Kubernetes DaemonSet 在 Kubernetes 群集中的每个节点上安排 NetScaler CPX 容器。
在工作节点上:
- 使用 NetScaler CPX 服务的群集 IP 地址修改 kubelet 配置文件,将 DNS 请求转发给 NetScaler CPX。
Kubernetes 主节点上的配置
在 Kubernetes 主节点上执行以下步骤,将 NetScaler CPX 部署为节点的本地 DNS 缓存:
-
使用
cpx_dns_svc.yaml
文件创建以 NetScaler CPX 容器作为端点的服务。kubectl apply -f cpx_dns_svc.yaml
cpx_dns_svc.yaml
文件按如下所示提供:apiVersion: v1 kind: Service metadata: name: cpx-dns-svc labels: app: cpxd spec: ports: - protocol: UDP port: 53 name: dns - protocol: TCP port: 53 name: dns-tcp selector: app: cpx-daemon
-
获取 NetScaler CPX 服务的 IP 地址。
kubectl get svc cpx-dns-svc
-
获取 Kube DNS 服务的 IP 地址。
kubectl get svc -n kube-system
-
创建 ConfigMap 用于为 NetScaler CPX 容器定义环境变量。这些环境变量用于传递 NetScaler CPX 服务和 Kube DNS 服务的 IP 地址。在此步骤中,使用在文件中指定为数据(键-值对)的环境变量创建了一个示例 ConfigMap
cpx-dns-cache
。kubectl create configmap cpx-dns-cache --from-file <path-to-file>
下面是一个包含环境变量作为键-值对的示例文件。
CPX_DNS_SVC_IP: 10.111.95.145 EULA: "yes" KUBE_DNS_SVC_IP: 10.96.0.10 NS_CPX_LITE: "1" NS_DNS_EXT_RESLV_IP: 10.102.217.142 NS_DNS_MATCH_DOMAIN: citrix.com PLATFORM: CP1000
下面是一个示例 ConfigMap:
apiVersion: v1 data: CPX_DNS_SVC_IP: 10.111.95.145 EULA: "yes" KUBE_DNS_SVC_IP: 10.96.0.10 NS_CPX_LITE: "1" NS_DNS_EXT_RESLV_IP: 10.102.217.142 NS_DNS_MATCH_DOMAIN: citrix.com PLATFORM: CP1000 kind: ConfigMap metadata: creationTimestamp: "2019-10-15T07:45:54Z" name: cpx-dns-cache namespace: default resourceVersion: "8026537" selfLink: /api/v1/namespaces/default/configmaps/cpx-dns-cache uid: 8d06f6ee-133b-4e1a-913c-9963cbf4f48
-
在主节点上为 NetScaler CPX 创建 Kubernetes 守护程序集。
kubectl apply -f cpx_daemonset.yaml
cpx_daemonset.yaml
文件按如下所示提供:apiVersion: apps/v1 kind: DaemonSet metadata: name: cpx-daemon labels: app: cpxd spec: selector: matchLabels: app: cpx-daemon template: metadata: labels: app: cpx-daemon spec: containers: - name: cpxd imagePullPolicy: IfNotPresent image: localhost:5000/dev/cpx volumeMounts: - mountPath: /netns/default/ name: test-vol ports: - containerPort: 53 envFrom: - configMapRef: name: cpx-dns-cache securityContext: privileged: true allowPrivilegeEscalation: true capabilities: add: ["NET_ADMIN"] volumes: - name: test-vol hostPath: path: /proc/1/ns type: Directory
Kubernetes 群集中的工作节点上的配置
在主节点上完成配置后,在工作节点上执行以下步骤:
-
修改 kubelet 配置文件,以便应用程序容器可以使用以下步骤之一使用 NetScaler CPX 服务群集 IP 进行 DNS 解析:
-
按照重新配置节点的 kubelet 中的步骤进行操作,然后按照以下格式修改
--cluster-dns
参数值。--cluster-dns=<CPX_DNS_SVC_IP>,<KUBE_DNS_SVC_IP>
或
-
使用以下步骤编辑
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
文件并修改--cluster-dns
参数。-
编辑 kubelet 配置,为
--cluster-dns
参数指定 NetScaler CPX 服务的群集 IP 地址和kube-dns
服务 IP 地址。root@node:~# cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf | grep KUBELET\_DNS\_ARGS Environment="KUBELET_DNS_ARGS=--cluster-dns=10.111.95.145,10.96.0.10 --cluster-domain=cluster.local" ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_DNS_ARGS
-
使用以下命令重新加载节点的 kubelet:
# systemctl daemon-reload # service kubelet restart
-
-