Implementar de NetScaler CPX como cachés DNS locales para nodos de Kubernetes

Los pods de aplicaciones de un clúster de Kubernetes dependen del DNS para comunicarse con otros pods de aplicaciones. Las solicitudes de DNS de aplicaciones dentro de un clúster de Kubernetes se gestionan mediante DNS de Kubernetes (kube-dns). Debido a la adopción más amplia de arquitecturas de microservicios, las tasas de solicitudes de DNS dentro de un clúster de Kubernetes están aumentando. Como resultado, el DNS de Kubernetes (kube-dns) está sobrecargado. Ahora puede implementar NetScaler CPX como una memoria caché de DNS local en cada nodo de Kubernetes y reenviar solicitudes de DNS desde los pods de aplicaciones en el nodo a NetScaler CPX. Por lo tanto, puede resolver las solicitudes de DNS más rápido y reducir significativamente la carga en el DNS de Kubernetes.

Para implementar NetScaler CPX, se utiliza una entidad de Kubernetes DaemonSet para programar pods de NetScaler CPX en cada nodo del clúster de Kubernetes. Un DaemonSet de Kubernetes garantiza que haya una instancia de NetScaler CPX en cada nodo de Kubernetes del clúster. Para que los pods de aplicaciones dirijan el tráfico a los pods DNS de CPX, debe crear un servicio de Kubernetes con puntos finales como pods de NetScaler CPX. La IP de clúster de este servicio se usa como punto de enlace DNS para los pods de la aplicación. Para asegurarse de que los pods de la aplicación usen la dirección IP del clúster de servicios NetScaler CPX para la resolución de DNS, debe actualizar el archivo de configuración de kubelet en cada nodo con la IP del clúster de servicios NetScaler CPX.

Se introducen las siguientes variables de entorno para admitir la implementación de NetScaler CPX como caché DNS de NodeLocal:

  • KUBE_DNS_SVC_IP: Especifica la dirección IP del clúster del servicio kube-dns, que es un argumento obligatorio para desencadenar la configuración en un pod de NetScaler CPX. El pod de NetScaler CPX dirige las consultas DNS a esta dirección IP cuando la respuesta a la consulta DNS no está disponible en la memoria caché de NetScaler CPX.

  • CPX_DNS_SVC_IP: Especifica la dirección IP del clúster del servicio NetScaler CPX. La variable de entorno CPX_DNS_SVC_IP se usa para configurar el DNS local en los nodos. Al configurar esta variable, se agrega una regla iptables para dirigir las solicitudes DNS que se originan en los pods de aplicaciones al pod CPX local de NetScaler dentro del nodo.

  • NS_DNS_FORCE_TCP: Esta variable de entorno fuerza el uso de TCP para las solicitudes de DNS, incluso si las consultas se reciben a través de UDP.

  • NS_DNS_EXT_RESLV_IP: Especifica la dirección IP del servidor de nombres externo para dirigir las solicitudes de DNS para un dominio específico.

  • NS_DNS_MATCH_DOMAIN: Especifica la cadena de dominio externo que se va a comparar para dirigir las consultas al servidor de nombres externo.

Implementar de NetScaler CPX como cachés de DNS en nodos

La implementación de NetScaler CPX como caché de DNS local para un clúster de Kubernetes incluye las siguientes tareas:

En el nodo maestro:

  • Crear un servicio de Kubernetes con puntos finales como pods de NetScaler CPX

  • Crear un ConfigMap para definir variables de entorno para pods de NetScaler CPX

  • Programe pods de NetScaler CPX en cada nodo del clúster de Kubernetes mediante un DaemonSet de Kubernetes.

En los nodos trabajadores:

  • Modifique el archivo de configuración de kubelet con la dirección IP del clúster del servicio NetScaler CPX para reenviar las solicitudes DNS a NetScaler CPX.

Configuración en el nodo maestro de Kubernetes

Realice los siguientes pasos en el nodo principal de Kubernetes para implementar NetScaler CPX como la memoria caché DNS local para los nodos:

  1. Cree un servicio con pods de NetScaler CPX como puntos finales mediante el archivo cpx_dns_svc.yaml.

    kubectl apply -f cpx_dns_svc.yaml
    

    El archivo cpx_dns_svc.yaml se proporciona de la siguiente manera:

            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. Obtenga la dirección IP del servicio NetScaler CPX.

    kubectl get svc cpx-dns-svc
    
  3. Obtenga la dirección IP del servicio DNS de Kube.

    kubectl get svc -n kube-system
    
  4. Cree un ConfigMap para definir variables de entorno para pods de NetScaler CPX. Estas variables de entorno se utilizan para pasar las direcciones IP del servicio NetScaler CPX y el servicio DNS de Kube. En este paso, cpx-dns-cache se crea un ejemplo de ConfigMap utilizando las variables de entorno especificadas como datos (pares clave-valor) en un archivo.

    kubectl create configmap cpx-dns-cache --from-file <path-to-file>
    

    A continuación se muestra un archivo de ejemplo con las variables de entorno como pares clave-valor.

      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
    

    A continuación se muestra un ejemplo de 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. Cree un DaemonSet de Kubernetes para NetScaler CPX en el nodo principal.

    kubectl apply -f cpx_daemonset.yaml
    

    El archivo cpx_daemonset.yaml se proporciona de la siguiente manera:

    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
    

Configuración en nodos de trabajo en el clúster de Kubernetes

Una vez que haya completado la configuración en el nodo maestro, lleve a cabo el siguiente paso en los nodos de trabajo:

  1. Modifique el archivo de configuración de kubelet para que los pods de aplicaciones puedan usar la IP del clúster de servicios de NetScaler CPX para la resolución de DNS mediante uno de los siguientes pasos:

    • Siga los pasos en reconfigurar el kubelet de un nodo y modifique el valor del argumento --cluster-dns en el siguiente formato.

           --cluster-dns=<CPX_DNS_SVC_IP>,<KUBE_DNS_SVC_IP>
      

      O bien:

    • Modifique el archivo /etc/systemd/system/kubelet.service.d/10-kubeadm.conf y modifique el argumento --cluster-dns mediante los siguientes pasos.

      1. Modifique la configuración de kubelet y especifique la dirección IP del clúster del servicio y la dirección IP kube-dns del servicio NetScaler CPX para el argumento --cluster-dns.

         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. Vuelva a cargar el kubelet de los nodos con los siguientes comandos:

         # systemctl daemon-reload
         # service kubelet restart
        
Implementar de NetScaler CPX como cachés DNS locales para nodos de Kubernetes