KubernetesノードのローカルDNSキャッシュとしてNetScaler CPXを導入

Kubernetesクラスター内のアプリケーションポッドは、DNSを利用して他のアプリケーションポッドと通信します。 Kubernetesクラスター内のアプリケーションからのDNS要求は、Kubernetes DNS(kube-dns)によって処理されます。 マイクロサービスアーキテクチャが広く採用されているため、Kubernetesクラスター内のDNS要求レートは増加しています。 その結果、Kubernetes DNS(kube-dns)が過負荷になります。 NetScaler CPXを各KubernetesノードにローカルDNSキャッシュとして展開し、ノード内のアプリケーションポッドからのDNS要求をNetScaler CPXに転送できるようになりました。 結果として、DNS要求をより迅速に解決し、Kubernetes DNSの負荷を大幅に減らすことができます。

NetScaler CPXをデプロイするには、Kubernetes DaemonSetエンティティを使用して、Kubernetesクラスター内の各ノードでNetScaler CPXポッドをスケジュールします。 Kubernetes DaemonSetを使用すると、クラスター内の各KubernetesノードにNetScaler CPXのインスタンスが存在することが保証されます。 アプリケーションポッドからCPX DNSポッドにトラフィックを転送するには、エンドポイントをNetScaler CPXポッドとするKubernetesサービスを作成する必要があります。 アプリケーション ポッドがトラフィックを CPX DNS ポッドに転送するようにするには、エンドポイントを NetScaler CPX ポッドとして持つ Kubernetes サービスを作成する必要があります。 このサービスのクラスターIPは、アプリケーションポッドのDNSエンドポイントとして使用されます。 アプリケーションポッドがDNS解決にNetScaler CPXサービスクラスターIPアドレスを使用するようにするには、各ノードのkubelet構成ファイルをNetScaler CPXサービスクラスターIPで更新する必要があります。

NetScaler CPXをノードローカルDNSキャッシュとして展開できるようにするために、次の環境変数が導入されました。

  • KUBE_DNS_SVC_IP: NetScaler kube-dns CPXポッドの構成をトリガーするための必須引数であるサービスのクラスターIPアドレスを指定します。 NetScaler CPXポッドは、DNSクエリ応答がNetScaler CPXキャッシュに存在しない場合に、このIPアドレスにDNSクエリを送信します。

  • CPX_DNS_SVC_IP: NetScaler CPXサービスのクラスターIPアドレスを指定します。 CPX_DNS_SVC_IP環境変数は、ノードでローカルDNSを設定するために使用されます。 この変数を構成すると、アプリケーションポッドから送信されるDNS要求をノード内のローカルNetScaler iptables CPXポッドに送信するルールが追加されます。

  • NS_DNS_FORCE_TCP:この環境変数は、クエリがUDPを介して受信された場合でも、DNS要求にTCPを使用するように強制します。

  • NS_DNS_EXT_RESLV_IP:特定のドメインのDNS要求を送信する外部ネームサーバーのIPアドレスを指定します。

  • NS_DNS_MATCH_DOMAIN:クエリを外部ネームサーバーに送信するために照合する外部ドメイン文字列を指定します。

NetScaler CPXをDNSキャッシュとしてノードにデプロイ

NetScaler CPXをKubernetesクラスターのローカルDNSキャッシュとして展開するには、次のタスクが含まれます。

マスターノードの場合:

  • エンドポイントをNetScaler CPXポッドとして使用するKubernetesサービスを作成

  • NetScaler CPXポッドの環境変数を定義するためのコンフィグマップの作成

  • Kubernetes DaemonSetを使用して、Kubernetesクラスター内の各ノードでNetScaler CPXポッドをスケジュールします。

ワーカーノードの場合:

  • NetScaler CPXサービスのクラスターIPアドレスを使用してkubelet構成ファイルを変更し、DNSリクエストをNetScaler CPXに転送します。

Kubernetesマスターノードでの構成

Kubernetesマスターノードで次の手順を実行して、NetScaler CPXをノードのローカルDNSキャッシュとして展開します。

  1. ファイルを使用して、NetScaler CPXポッドをエンドポイントとするサービスを作成します。 cpx_dns_svc.yaml

      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. 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. 次のいずれかの手順を使用して、アプリケーションポッドがDNS解決にNetScaler CPXサービスクラスターIPを使用できるように、kubelet構成ファイルを変更します。

    • ノードの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構成を編集し、引数にNetScaler kube-dns CPXサービスのクラスターIPアドレスとサービスIPアドレスを指定します。 --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. 次のコマンドを使用して、ノードのkubeletを再読み込みします。

           # systemctl daemon-reload
           # service kubelet restart
        
KubernetesノードのローカルDNSキャッシュとしてNetScaler CPXを導入