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サービスを作成する必要があります。このサービスのクラスターIPは、アプリケーションポッドのDNSエンドポイントとして使用されます。アプリケーションポッドがDNS解決にNetScaler CPXサービスクラスターIPアドレスを使用するようにするには、各ノードのkubelet構成ファイルをNetScaler CPXサービスクラスターIPで更新する必要があります。
NetScaler CPXをノードローカルDNSキャッシュとして展開できるようにするために、次の環境変数が導入されました。
-
KUBE_DNS_SVC_IP
: NetScalerkube-dns
CPXポッドの構成をトリガーするための必須引数であるサービスのクラスターIPアドレスを指定します。NetScaler CPXポッドは、DNSクエリ応答がNetScaler CPXキャッシュに存在しない場合に、このIPアドレスにDNSクエリを送信します。 -
CPX_DNS_SVC_IP
: NetScaler CPXサービスのクラスターIPアドレスを指定します。CPX_DNS_SVC_IP
環境変数は、ノードでローカルDNSを設定するために使用されます。この変数を構成すると、アプリケーションポッドから送信されるDNS要求をノード内のローカルNetScaleriptables
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キャッシュとして展開します。
-
ファイルを使用して、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
-
NetScaler CPXサービスのIPアドレスを取得します。
kubectl get svc cpx-dns-svc
-
Kube DNSサービスのIPアドレスを取得します。
kubectl get svc -n kube-system
-
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
-
マスターノードで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クラスターのワーカーノードでの構成
マスターノードでの構成が完了したら、ワーカーノードで次の手順を実行します。
-
次のいずれかの手順を使用して、アプリケーションポッドが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
引数を変更します。-
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
-
次のコマンドを使用して、ノードのkubeletを再読み込みします。
# systemctl daemon-reload # service kubelet restart
-
-