跳至内容

如何在 Amazon EKS 中配置入口 NGINX 控制器并对其进行故障排除?

4 分钟阅读
0

我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上为 Kubernetes 设置入口 NGINX 控制器。我也想对问题进行故障排除。

简短描述

入口 NGINX 控制器部署、配置和管理包含 NGINX(开源 HTTP 和反向代理服务器)实例的容器组。这些容器组通过控制器的服务资源公开。服务资源接收 Kubernetes 入口和服务资源所代表的相关应用程序的流量。有关详细信息,请参阅 GitHub 网站上的 Ingress NGINX Controller(入口 NGINX 控制器)和 NGINX 网站上的 NGINX

解决方法

可选: 安装 Helm。有关详细信息,请参阅 Helm 网站上的 Installing Helm(安装 Helm)。当您使用 YAML 清单来安装入口 NGINX 控制器时,不需要 Helm。

可选: 安装 AWS 负载均衡器控制器。您需要使用此控制器将网络负载均衡器目标组目标类型配置为 IP 目标类型。IP 目标类型将入口 NGINX 控制器容器组 IP 注册到目标组。实例目标类型使用 NodePort 上的入口 NGINX 控制器服务来注册实例。

安装入口 INGINX 控制器

使用以下方法之一在 Kubernetes 集群中安装入口 NGINX 控制器:

使用定义所有不同组件的 YAML 清单文件。使用 kubectl 在清单中创建资源。

-或-

使用 Helm 通过项目的存储库图表部署入口 NGINX 控制器。

您可以通过 AWS 经典负载均衡器或 AWS 网络负载均衡器在外部公开入口 NGINX 控制器。默认情况下,这两种方法都通过面向互联网的经典负载均衡器公开控制器。

使用 Helm 部署入口 NGINX 控制器

使用适用的命令来设置和公开控制器:

面向互联网的经典负载均衡器

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
ingress-nginx

内部经典负载均衡器

您必须在公开入口 NGINX 控制器的 Kubernetes Service 上添加以下注释:

service.beta.kubernetes.io/aws-load-balancer-internal: true

示例:

面向互联网的网络负载均衡器

要将负载均衡器由经典负载均衡器更改为网络负载均衡器,请添加以下注释:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

示例:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
ingress-nginx

内部网络负载均衡器

要配置内部网络负载均衡器,请添加以下注释:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

service.beta.kubernetes.io/aws-load-balancer-internal: true

示例:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-internal"="true" \
ingress-nginx

通过 AWS 负载均衡器控制器处于 IP 模式的网络负载均衡器

集群必须安装 AWS 负载均衡器控制器。有关详细信息,请参阅 GitHub 网站上的 AWS Load Balancer Controller(AWS 负载均衡器控制器)

使用以下注释来确保 AWS 负载均衡器控制器接管网络负载均衡器的配置:

service.beta.kubernetes.io/aws-load-balancer-type: external

默认情况下,系统会创建内部网络负载均衡器。但是,您可以添加以下注释来创建具有 IP 目标组目标类型的面向互联网的网络负载均衡器:

service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing

示例:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="external" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-scheme"="internet-facing" \
ingress-nginx

使用 kubectl 和 YAML 清单文件

下载 YAML 清单文件。以下命令下载入口 NGINX 控制器版本 1.11.2:

curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

**注意:**您可以将该值替换为其他控制器版本。有关详细信息,请参阅 GitHub 网站上的 Tags(标签)。在某些情况下,必须注释 ingress-nginx-controller Kubernetes 负载均衡器服务,才能更改系统提供的负载均衡器的类型和属性。

示例:

curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

面向互联网的经典负载均衡器

您可以将清单应用于集群,而无需进行任何修改。运行以下命令:

kubectl apply -f ingress-nginx.yaml

内部经典负载均衡器

完成以下步骤:

  1. 修改 YAML 清单以添加指定以下注释的注释部分:
    service.beta.kubernetes.io/aws-load-balancer-internal: true
    示例:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: true
      ...
    type: LoadBalancer
    ...
  2. 运行以下命令将清单应用到您的集群:

    kubectl apply -f ingress-nginx.yaml

面向互联网的网络负载均衡器

  1. 使用以下注释创建网络负载均衡器:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    示例:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
      ...
    type: LoadBalancer
    ...
  2. 运行以下命令将清单应用到您的集群:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    示例:

    kubectl apply -f ingress-nginx.yaml

内部网络负载均衡器

  1. 同时使用以下注释来创建内部网络负载均衡器:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    service.beta.kubernetes.io/aws-load-balancer-internal: true
    示例:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
        service.beta.kubernetes.io/aws-load-balancer-internal: true
      ...
    type: LoadBalancer
    ...
  2. 运行以下命令将清单应用到您的集群:

    kubectl apply -f ingress-nginx.yaml

通过 AWS 负载均衡器控制器处于 IP 模式的网络负载均衡器

  1. 在集群中安装 AWS 负载均衡器控制器。有关详细信息,请参阅 GitHub 网站上的 AWS Load Balancer Controller(AWS 负载均衡器控制器)。使用以下注释让 AWS 负载均衡器控制器配置网络负载均衡器:

    service.beta.kubernetes.io/aws-load-balancer-type: external
  2. 默认情况下,系统会创建内部网络负载均衡器。要创建以目标组目标类型为 IP 的面向互联网的网络负载均衡器,请添加以下注释:
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    示例:

    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: external
        service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
      ...
    type: LoadBalancer
  3. 运行以下命令将清单应用到您的集群:

    kubectl apply -f ingress-nginx.yaml

对问题进行故障排除

有关详细信息,请参阅 GitHub 网站上的 Troubleshooting(故障排除)

子网错误

如果网络负载均衡器无法自动发现子网,则您可能会收到以下错误消息:

"Reconciler error","controller":"ingress",...,"error":"couldn't auto-discover subnets: unable to resolve at least one subnet"

AWS 负载均衡器控制器使用子网标签自动查找用于负载均衡器的子网。对于 AWS 负载均衡器,控制器需要在不同的可用区中至少有两个子网。对于网络负载均衡器,控制器至少需要一个子网。要自动发现,必须标记子网:

  • 使用 kubernetes.io/role/elb 密钥标记公有子网。将该值设置为 1。
  • 使用 kubernetes.io/role/internal-elb 密钥标记私有子网。将该值设置为 1。
  • 如果您使用 AWS 负载均衡器控制器版本 2.1.1 及更早版本,请使用密钥 kubernetes.io/cluster/your-cluster/your-cluster-name 标记公有和私有子网。将该值设置为 owned(自有)或 shared(共享)。

地址字段不显示 kubectl get 或 describe ingress

当您运行 kubectl get ingress your-ingress-name 命令时,地址字段可能为空。或者,kubectl describe ingress 可能不会显示分配的地址。在上述任一情况下,请执行以下操作:

  • 描述入口资源以验证它是否使用了正确的 ingressClassNamekubernetes.io/ingress.class 注释。入口 NGINX 控制器的 IngressClass 名称必须与 ingressClassName 字段或 kubernetes.io/ingress.class 注释的值相匹配。如果不匹配,请将入口 NGINX 控制器的 IngressClass 资源配置为集群的唯一默认 IngressClass。有关详细信息,请参阅 Kubernetes 网站上的默认 IngressClass
  • 描述入口资源,以查看入口 NGINX 控制器是否在事件中添加了错误。如果没有事件,则事件已达到其生存时间上限。或者,入口 NGINX 控制器无法检测到必须对其执行操作的入口。
  • 运行以下命令以检查入口 NGINX 控制器容器组的日志中是否存在基于角色的访问控制 (RBAC) 或其他相关错误:
    kubectl logs ingress-nginx-controller-pod-name -n ingress-nginx-namespace
    **注意:**将 ingress-nginx-controller-pod-name 替换为入口 NGINX 控制器的容器组的名称。将 ingress-nginx-namespace 替换为您的入口 NGINX 命名空间的名称。

访问和请求日志

查看入口 NGINX 控制器的默认日志格式,以查找有关特定请求和响应的信息。为此,请参阅 GitHub 网站上的 Log format(日志格式)。在以下示例中,默认日志格式与以下示例日志相匹配。它显示后端目标的 IP 地址和端口为 192.168.114.102.80,来自后端目标的 HTTP 响应为 200。

192.168.116.133 - - \[24/Sep/2024:22:14:59 +0000\] "GET / HTTP/1.1" 200 45 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_15\_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" 524 0.003 \[default-apache-service-80\] \[\] 192.168.114.102:80 45 0.003 200 ffe584bdeb28959241e8d8408cfc06e5

相关信息

Exposing Kubernetes Applications, Part 3: Ingress-Nginx Controller(公开 Kubernetes 应用程序,第 3 部分:Ingress-Nginx 控制器)

AWS 官方已更新 2 个月前