我使用 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 網站上)。