Amazon EKS で NGINX Ingress コントローラーを使用した場合、ワーカーノードのステータスが「Unhealthy」になるのはなぜですか?
最終更新日: 2021 年 12 月 13 日
NGINX イングレスコントローラーを使用してイングレスリソースを公開していますが、Amazon Elastic Kubernetes Service (Amazon EKS) ワーカーノードが Network Load Balancer を使用できません。
簡単な説明
NGINX Ingress コントローラーは spec.externalTrafficPolicy オプションをローカルに設定し、クライアント IP を保持します。また、リクエストは異常なワーカーノードにルーティングされません。次のトラブルシューティングは、クラスター IP アドレスを維持したり、クライアント IP アドレスを保持したりする必要がないことを示しています。
解決方法
ワーカーノードのヘルスステータスをチェックします。
注: 次の例では、NGINX Ingress コントローラー v1.0.2 を使用しています。
1. (Kubernetes ウェブサイトから) NGINX Ingress コントローラーの必須リソースをクラスターに作成します。
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.2/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 設定は、NGINX Ingress コントローラーのインスタンスを実行していない Kubernetes ノードに送信されるパケットをドロップします。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
ポリシーオプションを設定する
pec.externalTrafficPolicy オプションをクラスターに更新します。
$ kubectl -n ingress-nginx patch service ingress-nginx-controller -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'
service/ingress-nginx-controller patched
注: デフォルトで、NodePort サービスは (Kubernetes Web サイトから) 送信元アドレスの変換を実行します。NGINX の場合、HTTP リクエストのソース IP は常に、リクエストを受け取った Kubernetes ノードの IP アドレスになります。nodePort を ingress-nginx サービス仕様の externalTrafficPolicy フィールドの値の Cluster に設定すると、送信元 IP アドレスを維持できなくなります。