

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 启用 Amazon EKS 自动模式时迁移 NGINX 入口控制器
<a name="migrate-nginx-ingress-controller-eks-auto-mode"></a>

*Olawale Olaleye 和 Shamanth Devagari，Amazon Web Services*

## Summary
<a name="migrate-nginx-ingress-controller-eks-auto-mode-summary"></a>

适用于 Amazon Elastic Kubernetes Service（Amazon EKS）的 [EKS 自动模式](https://docs.aws.amazon.com/eks/latest/userguide/automode.html)可以降低在 Kubernetes 集群上运行工作负载的运维开销。此模式还 AWS 允许您代表您设置和管理基础架构。在现有集群上启用 EKS 自动模式时，必须仔细规划 [NGINX 入口控制器](https://docs.nginx.com/nginx-ingress-controller/overview/about/)配置的迁移。这是因为无法直接转移网络负载均衡器。

当您在现有 Amazon EKS 集群中启用 EKS 自动模式时，您可以使用 blue/green 部署策略迁移 NGINX 入口控制器实例。

## 先决条件和限制
<a name="migrate-nginx-ingress-controller-eks-auto-mode-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ 运行 Kubernetes 版本 1.29 或更高版本的 [Amazon EKS 集群](https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html)
+ 运行[最低版本](https://docs.aws.amazon.com/eks/latest/userguide/auto-enable-existing.html#auto-addons-required)的 Amazon EKS 插件
+ 最新版本的 [kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html#kubectl-install-update)
+ 已有 [NGINX 入口控制器](https://kubernetes.github.io/ingress-nginx/deploy/#aws)实例
+ （可选）Amazon Route 53 中有[托管区](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-working-with.html)，用于基于 DNS 的流量转移

## 架构
<a name="migrate-nginx-ingress-controller-eks-auto-mode-architecture"></a>

*蓝/绿部署是一种部署*策略，在这种策略中，您可以创建两个独立但相同的环境。 Blue/green 部署提供近乎零的停机时间发布和回滚功能。基本思路是在运行不同版本应用程序的两个相同环境之间转移流量。

下图显示了启用 EKS 自动模式时，从两个不同的 NGINX 入口控制器实例迁移网络负载均衡器的过程。您可以使用 blue/green 部署在两个网络负载均衡器之间转移流量。

![\[使用 blue/green 部署策略迁移 NGINX 入口控制器实例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/57e8c14f-cb50-4027-8ef6-ce8ea3f2db25/images/211a029a-90d8-4c92-8200-19e54062f936.png)


原始命名空间是*蓝色*命名空间。在启用 EKS 自动模式之前，这是原始 NGINX 入口控制器服务和实例的运行位置。原始服务和实例连接到已在 Route 53 中配置 DNS 名称的网络负载均衡器。[AWS 负载均衡控制器](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.11/)在目标虚拟私有云（VPC）中部署了此网络负载均衡器。

该图显示了为 blue/green 部署设置环境的以下工作流程：

1. 在不同的命名空间（*绿色*命名空间）中安装和配置另一个 NGINX 入口控制器实例。

1. 在 Route 53 中，为新的网络负载均衡器配置 DNS 名称。

## 工具
<a name="migrate-nginx-ingress-controller-eks-auto-mode-tools"></a>

**AWS 服务**
+ [亚马逊 Elastic Kubernetes Service（亚马逊](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) EKS）可帮助你在上面运行 AWS Kubernetes，而无需安装或维护自己的 Kubernetes 控制平面或节点。
+ [弹性负载均衡](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)在多个目标上分配传入的应用程序或网络流量。例如，您可以跨亚马逊弹性计算云 (Amazon EC2) 实例、容器以及一个或多个可用区中的 IP 地址分配流量。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一种可用性高、可扩展性强的 DNS Web 服务。
+ [Amazon Virtual Private Cloud（亚马逊 VPC）](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络，并具有使用 AWS的可扩展基础设施的优势。

**其他工具**
+ [Helm](https://helm.sh/) 是 Kubernetes 的开源软件包管理器，可帮助您在 Kubernetes 集群上安装和管理应用程序。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)：针对 Kubernetes 集群运行命令的命令行界面。
+ [NGINX 入口控制器](https://docs.nginx.com/nginx-ingress-controller/overview/about/)将 Kubernetes 应用程序和服务与请求处理、身份验证、自助服务自定义资源和调试连接起来。

## 操作说明
<a name="migrate-nginx-ingress-controller-eks-auto-mode-epics"></a>

### 查看现有环境
<a name="review-the-existing-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 确认原 NGINX 入口控制器实例运行正常。 | 输入以下命令验证 `ingress-nginx` 命名空间中的资源是否运行正常。如果已在其他命名空间中部署 NGINX 入口控制器，请在此命令中更新命名空间名称。<pre>kubectl get all -n ingress-nginx</pre>在输出中，确认 NGINX 入口控制器容器组（pod）运行正常。下面是一个示例输出：<pre>NAME                                           READY   STATUS      RESTARTS      AGE<br />pod/ingress-nginx-admission-create-xqn9d       0/1     Completed   0             88m<br />pod/ingress-nginx-admission-patch-lhk4j        0/1     Completed   1             88m<br />pod/ingress-nginx-controller-68f68f859-xrz74   1/1     Running     2 (10m ago)   72m<br /><br />NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP                                                                     PORT(S)                      AGE<br />service/ingress-nginx-controller             LoadBalancer   10.100.67.255    k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com   80:30330/TCP,443:31462/TCP   88m<br />service/ingress-nginx-controller-admission   ClusterIP      10.100.201.176   <none>                                                                          443/TCP                      88m<br /><br />NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE<br />deployment.apps/ingress-nginx-controller   1/1     1            1           88m<br /><br />NAME                                                 DESIRED   CURRENT   READY   AGE<br />replicaset.apps/ingress-nginx-controller-68f68f859   1         1         1       72m<br />replicaset.apps/ingress-nginx-controller-d8c96cf68   0         0         0       88m<br /><br />NAME                                       STATUS     COMPLETIONS   DURATION   AGE<br />job.batch/ingress-nginx-admission-create   Complete   1/1           4s         88m<br />job.batch/ingress-nginx-admission-patch    Complete   1/1           5s         88m</pre> | DevOps 工程师 | 

### 部署示例 HTTPd 工作负载以使用 NGINX 入口控制器
<a name="deploy-a-sample-httpd-workload-to-use-the-nginx-ingress-controller"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Kubernetes 资源。 | 输入以下命令创建 Kubernetes 部署、服务和入口示例：<pre>kubectl create deployment demo --image=httpd --port=80</pre><pre>kubectl expose deployment demo</pre><pre> kubectl create ingress demo --class=nginx \<br />  --rule nginxautomode.local.dev/=demo:80</pre> | DevOps 工程师 | 
| 查看已部署的资源。 | 输入以下命令查看已部署资源的列表：<pre>kubectl get all,ingress</pre>在输出中，确认示例 HTTPd pod 处于运行状态。下面是一个示例输出：<pre>NAME                        READY   STATUS    RESTARTS   AGE<br />pod/demo-7d94f8cb4f-q68wc   1/1     Running   0          59m<br /><br />NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE<br />service/demo         ClusterIP   10.100.78.155   <none>        80/TCP    59m<br />service/kubernetes   ClusterIP   10.100.0.1      <none>        443/TCP   117m<br /><br />NAME                   READY   UP-TO-DATE   AVAILABLE   AGE<br />deployment.apps/demo   1/1     1            1           59m<br /><br />NAME                              DESIRED   CURRENT   READY   AGE<br />replicaset.apps/demo-7d94f8cb4f   1         1         1       59m<br /><br />NAME                             CLASS   HOSTS                                  ADDRESS                                                                         PORTS   AGE<br />ingress.networking.k8s.io/demo   nginx   nginxautomode.local.dev                k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com                 80      56m</pre> | DevOps 工程师 | 
| 确认服务可供访问。 | 输入以下命令确认能够通过网络负载均衡器的 DNS 名称访问服务：<pre>curl -H "Host: nginxautomode.local.dev" http://k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com</pre>预期的输出如下所示：<pre><html><body><h1>It works!</h1></body></html></pre> | DevOps 工程师 | 
| （可选）创建 DNS 记录。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-nginx-ingress-controller-eks-auto-mode.html) | DevOps 工程师，AWS DevOps | 

### 在现有集群上启用 EKS 自动模式
<a name="enable-eks-auto-mode-on-the-existing-cluster"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 启用 EKS 自动模式。 | 按照[在现有集群上启用 EKS 自动模式](https://docs.aws.amazon.com/eks/latest/userguide/auto-enable-existing.html)中的说明进行操作（Amazon EKS 文档）。 | AWS DevOps | 

### 安装新的 NGINX 入口控制器
<a name="install-a-new-nginx-ingress-controller"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置新的 NGINX 入口控制器实例。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-nginx-ingress-controller-eks-auto-mode.html) | DevOps 工程师 | 
| 部署新的 NGINX 实例控制器实例。 | 输入以下命令应用已修改的清单文件：<pre>kubectl apply -f deploy.yaml</pre> | DevOps 工程师 | 
| 确认部署成功。 | 输入以下命令验证 `ingress-nginx-v2` 命名空间中的资源是否运行正常。<pre>kubectl get all -n ingress-nginx-v2</pre>在输出中，确认 NGINX 入口控制器容器组（pod）处于运行状态。下面是一个示例输出：<pre>NAME                                            READY   STATUS      RESTARTS   AGE<br />pod/ingress-nginx-admission-create-7shrj        0/1     Completed   0          24s<br />pod/ingress-nginx-admission-patch-vkxr5         0/1     Completed   1          24s<br />pod/ingress-nginx-controller-757bfcbc6d-4fw52   1/1     Running     0          24s<br /><br />NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP                                                                     PORT(S)                      AGE<br />service/ingress-nginx-controller             LoadBalancer   10.100.208.114   k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com   80:31469/TCP,443:30658/TCP   24s<br />service/ingress-nginx-controller-admission   ClusterIP      10.100.150.114   <none>                                                                          443/TCP                      24s<br /><br />NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE<br />deployment.apps/ingress-nginx-controller   1/1     1            1           24s<br /><br />NAME                                                  DESIRED   CURRENT   READY   AGE<br />replicaset.apps/ingress-nginx-controller-757bfcbc6d   1         1         1       24s<br /><br />NAME                                       STATUS     COMPLETIONS   DURATION   AGE<br />job.batch/ingress-nginx-admission-create   Complete   1/1           4s         24s<br />job.batch/ingress-nginx-admission-patch    Complete   1/1           5s         24s</pre> | DevOps 工程师 | 
| 为示例 HTTPd 工作负载创建新的入口。 | 输入以下命令为现有示例 HTTPd 工作负载创建新的入口：<pre>kubectl create ingress demo-new --class=nginx-v2 \<br />  --rule nginxautomode.local.dev/=demo:80</pre> | DevOps 工程师 | 
| 确认新的入口工作正常。 | 输入以下命令确认新的入口是否工作正常：<pre>curl -H "Host: nginxautomode.local.dev" k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com</pre>预期的输出如下所示：<pre><html><body><h1>It works!</h1></body></html></pre> | DevOps 工程师 | 

### 割接
<a name="cut-over"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 割接至新的命名空间。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-nginx-ingress-controller-eks-auto-mode.html) | AWS DevOps， DevOps 工程师 | 
| 查看两个入口。 | 输入以下命令以查看为示例 HTTPd 工作负载创建的两个入口：<pre>kubectl get ingress</pre>下面是一个示例输出：<pre>NAME       CLASS      HOSTS                                  ADDRESS                                                                         PORTS   AGE<br />demo       nginx      nginxautomode.local.dev   k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com                              80      95m<br />demo-new   nginx-v2   nginxautomode.local.dev   k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com                80      33s</pre> | DevOps 工程师 | 

## 相关资源
<a name="migrate-nginx-ingress-controller-eks-auto-mode-resources"></a>
+ [在现有集群上启用 EKS 自动模式](https://docs.aws.amazon.com/eks/latest/userguide/auto-enable-existing.html)（Amazon EKS 文档）
+ 对@@ [由 Kubernetes 服务控制器在 Amazon EKS 中创建的负载均衡器进行故障排除（re: Post 知识](https://repost.aws/knowledge-center/eks-load-balancers-troubleshooting)中心）AWS 
+ [NGINX 入口控制器](https://docs.nginx.com/nginx-ingress-controller/)（NGINX 文档）