Amazon EKS で NGINX Ingress コントローラーを使用すると、ワーカーノードのステータスが「異常」になるのはなぜですか?

所要時間2分
0

NGINX 入力コントローラーを使用して入力リソースを公開しています。しかし、Amazon Elastic Kubernetes Service (Amazon EKS) ワーカーノードは Network Load Balancer を使用できません。

簡単な説明

NGINX Ingress コントローラーは spec.externalTrafficPolicy オプションをローカルに設定し、クライアント IP を保持します。また、リクエストは正常なワーカーノードにのみルーティングされます。

ワーカーノードのステータスをトラブルシューティングし、トラフィックポリシーを更新するには、次の手順を参照してください。

注意: クラスター IP アドレスを維持したり、クライアント IP アドレスを保持したりする必要はありません。

解決方法

ワーカーノードの正常/異常ステータスをチェックする

注意: 次の例では、EKS クラスター v1.23 で動作する NGINX Ingress コントローラー v1.5.1 を使用しています。

1.    (Kubernetes ウェブサイトから) NGINX Ingress コントローラーの必須リソースをクラスターに作成します。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/aws/deploy.yaml

デフォルトでは、NGINX Ingress コントローラーは .spec.externalTrafficPolicy オプションを (GitHub Web サイトから) Local に設定して Kubernetes サービス ingress-nginx-controller を作成します。

2.    (Kubernetes ウェブサイトからの) 外部トラフィックポリシーローカルに設定されているかどうかを確認します。

$ kubectl -n ingress-nginx describe svc ingress-nginx-controller

次のような出力が表示されます。

Name:                     ingress-nginx-controller
Namespace:                ingress-nginx
Labels:                   app.kubernetes.io/component=controller
                          app.kubernetes.io/instance=ingress-nginx
                          app.kubernetes.io/managed-by=Helm
                          app.kubernetes.io/name=ingress-nginx
                          app.kubernetes.io/version=1.0.2
                          helm.sh/chart=ingress-nginx-4.0.3
Annotations:              service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
                          service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: true
                          service.beta.kubernetes.io/aws-load-balancer-type: nlb
Selector:                 app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
Type:                     LoadBalancer
IP Families:              <none>
IP:                       10.100.115.226
IPs:                      10.100.115.226
LoadBalancer Ingress:     a02245e77404f4707a725d0b977425aa-5b97f717658e49b9.elb.eu-west-1.amazonaws.com
Port:                     http  80/TCP
TargetPort:               http/TCP
NodePort:                 http  31748/TCP
Endpoints:                192.168.43.203:80
Port:                     https  443/TCP
TargetPort:               https/TCP
NodePort:                 https  30045/TCP
Endpoints:                192.168.43.203:443
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     30424
Events:                   <none>

注意: Local の設定は、Kubernetes ノードに送信されるパケットをドロップし、NGINX Ingress コントローラーのインスタンスを実行する必要はありません。NGINX Ingress コントローラーをスケジュールするノードに (Kubernetes ウェブサイトからの) NGINX ポッドを割り当てます

3.    NGINX Ingress コントローラーのインスタンスを実行していないノードで DROP ルールを設定する iptables コマンドを確認します。

$ sudo iptables-save | grep -i "no local endpoints"
-A KUBE-XLB-CG5I4G2RS3ZVWGLK -m comment --comment "ingress-nginx/ingress-nginx-controller:http has no local endpoints
        " -j KUBE-MARK-DROP
-A KUBE-XLB-EDNDUDH2C75GIR6O -m comment --comment "ingress-nginx/ingress-nginx-controller:https has no local endpoints " -j KUBE-MARK-DROP

ポリシーオプションを設定する

spec.externalTrafficPolicy オプションをクラスターに更新します。

$ kubectl -n ingress-nginx patch service ingress-nginx-controller -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'
service/ingress-nginx-controller patched

注意: デフォルトで、ノードポートサービスは (Kubernetes Web サイトからの) 送信元 IP アドレスの変換を実行します。NGINX の場合、HTTP リクエストのソース IP アドレスは常に、リクエストを受け取った Kubernetes ノードの IP アドレスになります。ingress-nginx サービス仕様で外部トラフィックポリシー (.spec.ExternalTrafficPolicy) をクラスターに設定した場合、受信トラフィックは送信元 IP アドレスを保持しません。詳細については、クライアントソース IP アドレスの保存(Kubernetes Web サイト) をご覧ください。


AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ