部署 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 缓存:

  1. 使用 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
    
  2. 获取 NetScaler CPX 服务的 IP 地址。

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

    kubectl get svc -n kube-system
    
  4. 创建 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
    
  5. 在主节点上为 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 群集中的工作节点上的配置

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

  1. 修改 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 参数。

      1. 编辑 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
        
      2. 使用以下命令重新加载节点的 kubelet:

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