

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 啟用 Amazon EKS Auto 模式時遷移 NGINX 傳入控制器
<a name="migrate-nginx-ingress-controller-eks-auto-mode"></a>

*Olawale Olaleye 和 Shamanth Devagari，Amazon Web Services*

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

適用於 Amazon Elastic Kubernetes Service (Amazon EKS) 的 [EKS Auto Mode](https://docs.aws.amazon.com/eks/latest/userguide/automode.html) 可減少在 Kubernetes 叢集上執行工作負載的操作開銷。此模式 AWS 也允許 代表您設定和管理基礎設施。在現有叢集上啟用 EKS Auto Mode 時，您必須仔細規劃 [NGINX 傳入控制器](https://docs.nginx.com/nginx-ingress-controller/overview/about/)組態的遷移。這是因為無法直接傳輸 Network Load Balancer。

在現有 Amazon EKS 叢集中啟用 EKS Auto Mode 時，您可以使用藍/綠部署策略來遷移 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 中用於 DNS 型流量轉移的[託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-working-with.html) 

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

*藍/綠部署*是一種部署策略，您可以在其中建立兩個不同但相同的環境。藍/綠部署提供近乎零的停機時間發佈和復原功能。基本概念是在執行不同應用程式版本的兩個相同環境之間轉移流量。

下圖顯示啟用 EKS Auto Mode 時，Network Load Balancer 從兩個不同的 NGINX 傳入控制器執行個體遷移。您可以使用藍/綠部署，在兩個 Network Load Balancer 之間轉移流量。

![\[使用藍/綠部署策略來遷移 NGINX 傳入控制器執行個體。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/57e8c14f-cb50-4027-8ef6-ce8ea3f2db25/images/211a029a-90d8-4c92-8200-19e54062f936.png)


原始命名空間是*藍色*命名空間。在啟用 EKS Auto 模式之前，這是原始 NGINX 傳入控制器服務和執行個體執行的位置。原始服務和執行個體會連線至具有在 Route 53 中設定之 DNS 名稱的 Network Load Balancer。Load [AWS Load Balancer 控制器](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.11/)將此 Network Load Balancer 部署在目標虛擬私有雲端 (VPC) 中。

下圖顯示下列工作流程，以設定藍/綠部署的環境：

1. 在不同的命名空間中安裝和設定另一個 NGINX 傳入控制器執行個體，即*綠色*命名空間。

1. 在 Route 53 中，設定新 Network Load Balancer 的 DNS 名稱。

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

**AWS 服務**
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) 可協助您在 上執行 Kubernetes， AWS 而無需安裝或維護您自己的 Kubernetes 控制平面或節點。
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 會將傳入的應用程式或網路流量分散到多個目標。例如，您可以在一或多個可用區域中跨 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、容器和 IP 地址分配流量。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一種可用性高、可擴展性強的 DNS Web 服務。
+ [Amazon Virtual Private Cloud (Amazon 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 確認原始 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 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 工程師 | 
| 確認服務可連線。 | 輸入下列命令，確認可透過 Network Load Balancer 的 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_tw/prescriptive-guidance/latest/patterns/migrate-nginx-ingress-controller-eks-auto-mode.html) | DevOps 工程師，AWS DevOps | 

### 在現有叢集上啟用 EKS Auto 模式
<a name="enable-eks-auto-mode-on-the-existing-cluster"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟用 EKS Auto 模式。 | 遵循[在現有叢集上啟用 EKS Auto Mode](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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 設定新的 NGINX 傳入控制器執行個體。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 切換到新的命名空間。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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 Auto Mode ](https://docs.aws.amazon.com/eks/latest/userguide/auto-enable-existing.html)(Amazon EKS 文件）
+ 對 [Amazon EKS (re：Post 知識中心） 中 Kubernetes 服務控制器建立的負載平衡器進行故障診斷](https://repost.aws/knowledge-center/eks-load-balancers-troubleshooting)AWS 
+ [NGINX 傳入控制器](https://docs.nginx.com/nginx-ingress-controller/) (NGINX 文件）