当我将 NGINX 入口控制器与 Amazon EKS 配合使用时,为什么我的 Worker 节点状态为“Unhealthy”(运行状况不佳)?

2 分钟阅读
0

我使用 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 官方
AWS 官方已更新 1 年前