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

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

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

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

  • KUBE_DNS_SVC_IP: Especifica la dirección IP del clúster del servicio kube-dns, que es un argumento obligatorio para activar 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 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 utiliza para configurar el DNS local en los nodos. Cuando se configura esta variable, se añade una regla iptables para dirigir las solicitudes DNS originadas en los pods de aplicación al pod local de NetScaler CPX dentro del nodo.

  • NS_DNS_FORCE_TCP: Esta variable de entorno fuerza el uso de TCP para las solicitudes 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 DNS de un dominio específico.

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

Implementar NetScaler CPX como cachés DNS en nodos

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

En el nodo maestro:

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

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

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

En los nodos de trabajo:

  • 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 los NetScaler CPX.

Configuración en el nodo maestro de Kubernetes

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

  1. Cree un servicio con los pods de NetScaler CPX como puntos finales utilizando 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 Kube DNS.

    kubectl get svc -n kube-system
    
  4. Cree un ConfigMap para definir variables de entorno para los pods de NetScaler CPX. Estas variables de entorno se utilizan para pasar las direcciones IP del servicio NetScaler CPX y del servicio Kube DNS. En este paso, se crea un ConfigMap de ejemplo cpx-dns-cache 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>
    

    El siguiente es 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
    

    El siguiente es un ConfigMap de ejemplo:

    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 maestro.

    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 los nodos de trabajo del clúster de Kubernetes

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

  1. Modifique el archivo de configuración de kubelet para que los pods de la aplicación puedan usar la IP del clúster del servicio 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

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

      1. Edite la configuración de kubelet y especifique la dirección IP del clúster del servicio NetScaler CPX y la dirección IP del servicio kube-dns 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 mediante los siguientes comandos:

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