将 Citrix ADC CPX 部署为 Kubernetes 节点的本地 DNS 缓存

Kubernetes 群集中的应用程序 pod 依靠 DNS 与其他应用程序 pod 进行通信。来自 Kubernetes 群集内的应用程序的 DNS 请求由 Kubernetes DNS (kube-dns) 进行处理。由于微服务体系结构的广泛采用,Kubernetes 群集内的 DNS 请求率不断增加。因此,Kubernetes DNS(kube-dns)会负担过重。现在,您可以将 Citrix ADC CPX 部署为每个 Kubernetes 节点上的本地 DNS 缓存,并将来自节点中的应用程序 pod 的 DNS 请求转发到 Citrix ADC CPX。因此,您可以更快地解析 DNS 请求,并显著降低 Kubernetes DNS 的负载。

要部署 Citrix ADC CPX,Kubernetes DaemonSet 实体用于在 Kubernetes 群集中的每个节点上安排 Citrix ADC CPX pod。Kubernetes DaemonSet 可确保群集中的每个 Kubernetes 节点上都有 Citrix ADC CPX 的实例。 要使应用程序 pod 将流量定向到 CPX DNS pod,您需要创建一个 Kubernetes 服务,该服务使用端点作为 Citrix ADC CPX pod。此服务的群集 IP 用作应用程序 pod 的 DNS 端点。要确保应用程序 pod 使用 Citrix ADC CPX 服务群集 IP 地址进行 DNS 解析,您需要更新每个使用 Citrix ADC CPX 服务群集 IP 的节点上的 kubelet 配置文件。

引入了以下环境变量来支持将 Citrix ADC CPX 部署作为 NodeLocal DNS 缓存:

  • KUBE_DNS_SVC_IP:指定 kube-dns 服务的群集 IP 地址,这是在 Citrix ADC CPX pod 上触发配置的必填参数。当 Citrix ADC CPX 缓存中没有 DNS 查询响应时,Citrix ADC CPX pod 会将 DNS 查询定向到此 IP 地址。

  • CPX_DNS_SVC_IP:指定 Citrix ADC CPX 服务的群集 IP 地址。CPX_DNS_SVC_IP 环境变量用于在节点上配置本地 DNS。配置此变量时,将添加一条 iptables 规则,以将来自应用程序 pod 的 DNS 请求定向到节点内的本地 Citrix ADC CPX pod。

  • NS_DNS_FORCE_TCP:此环境变量强制对 DNS 请求使用 TCP,即使查询是通过 UDP 接收的亦如此。

  • NS_DNS_EXT_RESLV_IP:指定外部名称服务器的 IP 地址,以定向特定域的 DNS 请求。

  • NS_DNS_MATCH_DOMAIN:指定要匹配的外部域字符串以将查询定向到外部名称服务器。

将 Citrix ADC CPX 部署为节点上的 DNS 缓存

将 Citrix ADC CPX 部署为 Kubernetes 群集的本地 DNS 缓存包括以下任务:

在主节点上:

  • 创建使用端点作为 Citrix ADC CPX pod 的 Kubernetes 服务

  • 创建用于为 Citrix ADC CPX pod 定义环境变量的 ConfigMap

  • 使用 Kubernetes DaemonSet 在 Kubernetes 群集中的每个节点上安排 Citrix ADC CPX pod。

在工作节点上:

  • 使用 Citrix ADC CPX 服务的群集 IP 地址修改 kubelet 配置文件,以将 DNS 请求转发到 Citrix ADC CPX。

Kubernetes 主节点上的配置

在 Kubernetes 主节点上执行以下步骤,以将 Citrix ADC CPX 部署为节点的本地 DNS 缓存:

  1. 使用 cpx_dns_svc.yaml 文件创建将 Citrix ADC CPX pod 作为端点的服务。

    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
    
  2. 获取 Citrix ADC CPX 服务的 IP 地址。

    kubectl get svc cpx-dns-svc
    
  3. 获取 Kube DNS 服务的 IP 地址。

    kubectl get svc -n kube-system
    
  4. 创建用于为 Citrix ADC CPX pod 定义环境变量的 ConfigMap。这些环境变量用于传递 Citrix ADC 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
    
  5. 在主节点上为 Citrix ADC CPX 创建 Kubernetes DaemonSet。

    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 群集中的工作节点上的配置

在主节点上完成配置后,在工作节点上执行以下步骤:

  1. 修改 kubelet 配置文件,以便应用程序 pod 能够通过执行以下步骤之一来使用 Citrix ADC 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 参数。

      1. 编辑 kubelet 配置并指定 Citrix ADC CPX 服务的群集 IP 地址以及 --cluster-dns 参数的 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
        
      2. 使用以下命令重新加载节点的 kubelet:

         # systemctl daemon-reload
         # service kubelet restart
        
将 Citrix ADC CPX 部署为 Kubernetes 节点的本地 DNS 缓存