在我將 NGINX Ingress Controller 與 Amazon EKS 搭配使用時,為什麼我的工作節點狀態為「運作狀態不佳」?

2 分的閱讀內容
0

我使用 NGINX Ingress Controller 來公開輸入資源。但是,Amazon Elastic Kubernetes Service (Amazon EKS) 工作節點無法使用網 Network Load Balancer。

簡短描述

為了保留用戶端 IP,NGINX Ingress Controller 將 spec.externalTrafficPolicy 選項設定為 Local (本機)。此外,它只會將請求路由至運作狀態良好的工作節點。

若要對工作節點的狀態進行疑難排解並更新流量政策,請參閱下列步驟。

**注意:**無需維護叢集 IP 地址或保留用戶端 IP 地址。

解決方案

檢查工作節點的運作狀態

**注意:**以下範例使用執行於 EKS Cluster v1.23 版的 NGINX Ingress Controller v1.5.1 版。

1.    在叢集中為 NGINX Ingress Controller (來自 Kubernetes 網站) 建立必要資源

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

依預設,NGINX Ingress Controller 將建立 Kubernetes Service ingress-nginx-controller,其中 .spec.externalTrafficPolicy 選項設定為 Local (本機) (來自 GitHub 網站)。

2.    檢查外部流量政策 (來自 Kubernetes 網站) 是否設定為 Local (本機):

$ 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 Controller 執行個體的 Kubernetes 節點的封包。指派 NGINX Pod (來自 Kubernetes 網站) 給要在其上排定 NGINX Ingress Controller 的節點。

3.    檢查 iptables 命令,用於在未執行 NGINX Ingress Controller 執行個體的節點上設定 DROP 規則:

$ 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 選項更新為 Cluster (叢集):

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

依預設,NodePort 服務執行來源 IP 地址轉換 (來自 Kubernetes 網站)。對於 NGINX,這意味着 HTTP 請求的來源 IP 地址始終是接收請求的 Kubernetes 節點的 IP 地址。如果您在 Ingress-nginx 服務規格中將 externalTrafficPolicy (.spec.externalTrafficPolicy) 設定為 Cluster (叢集),則傳入流量不會保留來源 IP 地址。如需詳細資訊,請參閱保留用戶端來源 IP 地址 (在 Kubernetes 網站上)。


AWS 官方
AWS 官方已更新 2 年前