Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
当我将 NGINX 入口控制器与 Amazon EKS 配合使用时,为什么我的 Worker 节点状态为“Unhealthy”(运行状况不佳)?
我使用 NGINX 入口控制器来公开入口资源。但是,我的 Amazon Elastic Kubernetes Service (Amazon EKS) Worker 节点无法使用网络负载均衡器。
简短描述
为保留客户端 IP,NGINX 入口控制器会将 spec.externalTrafficPolicy 选项设置为 Local(本地)。此外,它仅将请求路由到运行状况不佳的 Worker 节点。
要对 Worker 节点的状态进行故障排除并更新流量策略,请参阅以下步骤。
**注意:**无需维护集群 IP 地址或保留客户端 IP 地址。
解决方法
检查 Worker 节点的运行状况
**注意:**以下示例使用基于 EKS Cluster v1.23 运行的 NGINX 入口控制器 v1.5.1。
1. 在集群中为 NGINX 入口控制器创建必需的资源(来自 Kubernetes 网站):
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/aws/deploy.yaml
原定设置情况下,NGINX 入口控制器会创建 Kubernetes 服务 ingress-nginx-controller,并将 .spec.externalTrafficPolicy 选项设置为本地(来自 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(本地)设置会丢弃发送到 Kubernetes 节点且无需运行 NGINX 入口控制器实例的数据包。将 NGINX 容器组(来自 Kubernetes 网站)分配给您想要安排运行 NGINX 入口控制器的节点。
3. 查看在未运行 NGINX 入口控制器实例的节点上设置 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 选项更新为 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 官方已更新 2 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 6 个月前