Bereitstellen von NetScaler CPXs als lokale DNS-Caches für Kubernetes-Knoten

Anwendungs-Pods in einem Kubernetes-Cluster sind für die Kommunikation mit anderen Anwendungspods auf DNS angewiesen. DNS-Anfragen von Anwendungen innerhalb eines Kubernetes-Clusters werden von Kubernetes DNS (kube-DNS) bearbeitet. Aufgrund der breiteren Einführung von Microservices-Architekturen steigen die DNS-Anforderungsraten innerhalb eines Kubernetes-Clusters. Infolgedessen ist Kubernetes DNS (Kube-DNS) überlastet. Jetzt können Sie NetScaler CPX als lokalen DNS-Cache auf jedem Kubernetes-Knoten bereitstellen und DNS-Anforderungen von Anwendungspods im Knoten an NetScaler CPX weiterleiten. Daher können Sie DNS-Anfragen schneller lösen und die Belastung von Kubernetes DNS erheblich reduzieren.

Um NetScaler CPXs bereitzustellen, wird eine Kubernetes DaemonSet-Entität verwendet, um NetScaler CPX-Pods auf jedem Knoten im Kubernetes-Cluster zu planen. Ein Kubernetes DaemonSet stellt sicher, dass sich auf jedem Kubernetes-Knoten im Cluster eine Instanz von NetScaler CPX befindet. Damit Anwendungspods den Datenverkehr zu CPX-DNS-Pods leiten, müssen Sie einen Kubernetes-Dienst mit Endpunkten als NetScaler CPX-Pods erstellen. Die Cluster-IP dieses Dienstes wird als DNS-Endpunkt für die Anwendungs-Pods verwendet. Um sicherzustellen, dass die Anwendungspods die IP-Adresse des NetScaler CPX-Dienstclusters für die DNS-Auflösung verwenden, müssen Sie die Kubelet-Konfigurationsdatei auf jedem Knoten mit der NetScaler CPX-Dienstcluster-IP aktualisieren.

Die folgenden Umgebungsvariablen werden eingeführt, um die Bereitstellung von NetScaler CPX als NodeLocal DNS-Cache zu unterstützen:

  • KUBE_DNS_SVC_IP: Gibt die Cluster-IP-Adresse des kube-dns Dienstes an, die ein obligatorisches Argument zum Auslösen der Konfiguration in einem NetScaler CPX-Pod ist. Der NetScaler CPX-Pod leitet DNS-Abfragen an diese IP-Adresse weiter, wenn die DNS-Abfrageantwort nicht im NetScaler CPX-Cache verfügbar ist.

  • CPX_DNS_SVC_IP: Gibt die Cluster-IP-Adresse des NetScaler CPX-Dienstes an. Die CPX_DNS_SVC_IP Umgebungsvariable wird verwendet, um lokales DNS auf Knoten zu konfigurieren. Wenn Sie diese Variable konfigurieren, wird eine iptables Regel hinzugefügt, um die DNS-Anforderungen, die von Anwendungspods stammen, an den lokalen NetScaler CPX-Pod innerhalb des Knotens weiterzuleiten.

  • NS_DNS_FORCE_TCP: Diese Umgebungsvariable erzwingt die Verwendung von TCP für DNS-Anforderungen, auch wenn die Abfragen über UDP empfangen werden.

  • NS_DNS_EXT_RESLV_IP: Gibt die IP-Adresse des externen Nameservers an, um die DNS-Anforderungen für eine bestimmte Domäne weiterzuleiten.

  • NS_DNS_MATCH_DOMAIN: Gibt die Zeichenfolge der externen Domäne an, mit der abgeglichen werden soll, um die Abfragen an den externen Namenserver weiterzuleiten.

Bereitstellen von NetScaler CPXs als DNS-Caches auf Knoten

Das Bereitstellen von NetScaler CPX als lokaler DNS-Cache für einen Kubernetes-Cluster umfasst die folgenden Aufgaben:

Auf dem Master-Knoten:

  • Erstellen Sie einen Kubernetes-Dienst mit Endpunkten als NetScaler CPX-Pods

  • Erstellen Sie eine ConfigMap zum Definieren von Umgebungsvariablen für NetScaler CPX-Pods

  • Planen Sie NetScaler CPX-Pods auf jedem Knoten im Kubernetes-Cluster mithilfe eines Kubernetes DaemonSet.

Auf Worker-Knoten:

  • Ändern Sie die Kubelet-Konfigurationsdatei mit der Cluster-IP-Adresse des NetScaler CPX-Dienstes, um DNS-Anforderungen an NetScaler CPXs weiterzuleiten.

Konfiguration auf dem Kubernetes-Masterknoten

Führen Sie die folgenden Schritte auf dem Kubernetes-Masterknoten aus, um NetScaler CPX als lokalen DNS-Cache für Knoten bereitzustellen:

  1. Erstellen Sie mithilfe der cpx_dns_svc.yaml Datei einen Dienst mit NetScaler CPX-Pods als Endpoints.

      kubectl apply -f cpx_dns_svc.yaml
    

    Die cpx_dns_svc.yaml Datei wird wie folgt bereitgestellt:

              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. Holen Sie sich die IP-Adresse des NetScaler CPX-Dienstes.

      kubectl get svc cpx-dns-svc
    
  3. Holen Sie sich die IP-Adresse des Kube-DNS-Dienstes.

      kubectl get svc -n kube-system
    
  4. Erstellen Sie eine ConfigMap zum Definieren von Umgebungsvariablen für NetScaler CPX-Pods. Diese Umgebungsvariablen werden verwendet, um IP-Adressen des NetScaler CPX-Dienstes und des Kube-DNS-Dienstes zu übergeben. In diesem Schritt cpx-dns-cache wird ein Beispiel für ConfigMap mit den Umgebungsvariablen erstellt, die als Daten (Schlüssel-Wert-Paare) in einer Datei angegeben sind.

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

    Im Folgenden finden Sie eine Beispieldatei mit den Umgebungsvariablen als Schlüssel-Wert-Paare.

        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
    

    Im Folgenden finden Sie ein Beispiel für eine 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. Erstellen Sie ein Kubernetes DaemonSet für NetScaler CPX auf dem Masterknoten.

      kubectl apply -f cpx_daemonset.yaml
    

    Die cpx_daemonset.yaml Datei wird wie folgt bereitgestellt:

      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
    

Konfiguration auf Worker-Knoten im Kubernetes-Cluster

Führen Sie nach Abschluss der Konfiguration auf dem Master-Knoten den folgenden Schritt auf Worker-Knoten aus:

  1. Ändern Sie die Kubelet-Konfigurationsdatei, sodass Anwendungspods die NetScaler CPX-Dienstcluster-IP für die DNS-Auflösung verwenden können, indem Sie einen der folgenden Schritte ausführen:

    • Befolgen Sie die Schritte unter Rekonfigurieren Sie das Kubelet eines Node neu und ändern Sie den --cluster-dns Argumentwert im folgenden Format.

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

      oder

    • Bearbeiten Sie die /etc/systemd/system/kubelet.service.d/10-kubeadm.conf Datei und ändern Sie das --cluster-dns Argument mit den folgenden Schritten.

      1. Bearbeiten Sie die Kubelet-Konfiguration und geben Sie die Cluster-IP-Adresse des NetScaler CPX-Dienstes und die kube-dns Dienst-IP-Adresse für das --cluster-dns Argument an.

           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. Laden Sie das Kubelet der Knoten mit den folgenden Befehlen neu:

           # systemctl daemon-reload
           # service kubelet restart
        
Bereitstellen von NetScaler CPXs als lokale DNS-Caches für Kubernetes-Knoten