启用 Amazon EKS 自动模式时迁移 NGINX 入口控制器 - AWS Prescriptive Guidance

启用 Amazon EKS 自动模式时迁移 NGINX 入口控制器

Olawale Olaleye 和 Shamanth Devagari,Amazon Web Services

摘要

适用于 Amazon Elastic Kubernetes Service(Amazon EKS)的 EKS 自动模式可以降低在 Kubernetes 集群上运行工作负载的运维开销。此模式还允许 AWS 代表您设置和管理基础设施。在现有集群上启用 EKS 自动模式时,必须仔细规划 NGINX 入口控制器配置的迁移。这是因为无法直接转移网络负载均衡器。

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

先决条件和限制

先决条件

架构

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

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

使用蓝绿部署策略来迁移 NGINX 入口控制器实例。

原始命名空间是蓝色命名空间。在启用 EKS 自动模式之前,这是原始 NGINX 入口控制器服务和实例的运行位置。原始服务和实例连接到已在 Route 53 中配置 DNS 名称的网络负载均衡器。AWS 负载均衡控制器在目标虚拟私有云(VPC)中部署了此网络负载均衡器。

图中显示了针对蓝绿部署设置环境的以下工作流:

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

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

工具

AWS 服务

  • Amazon Elastic Kubernetes Service(Amazon EKS)可帮助您在 AWS 上运行 Kubernetes,而无需安装或维护您自己的 Kubernetes 控制面板或节点。

  • 弹性负载均衡在多个目标上分配传入的应用程序或网络流量。例如您可以将流量分配到一个或多个可用区中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例、容器以及 IP 地址。

  • Amazon Route 53 是一种可用性高、可扩展性强的 DNS Web 服务。

  • Amazon Virtual Private Cloud(Amazon VPC)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络,并具有使用 AWS 的可扩展基础设施的优势。

其他工具

  • Helm 是 Kubernetes 的开源软件包管理器,可帮助您在 Kubernetes 集群上安装和管理应用程序。

  • kubectl:针对 Kubernetes 集群运行命令的命令行界面。

  • NGINX 入口控制器将 Kubernetes 应用程序和服务与请求处理、身份验证、自助服务自定义资源和调试连接起来。

操作说明

任务描述所需技能

确认原 NGINX 入口控制器实例运行正常。

输入以下命令验证 ingress-nginx 命名空间中的资源是否运行正常。如果已在其他命名空间中部署 NGINX 入口控制器,请在此命令中更新命名空间名称。

kubectl get all -n ingress-nginx

在输出中,确认 NGINX 入口控制器容器组(pod)运行正常。下面是一个示例输出:

NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-xqn9d 0/1 Completed 0 88m pod/ingress-nginx-admission-patch-lhk4j 0/1 Completed 1 88m pod/ingress-nginx-controller-68f68f859-xrz74 1/1 Running 2 (10m ago) 72m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 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 service/ingress-nginx-controller-admission ClusterIP 10.100.201.176 <none> 443/TCP 88m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 88m NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-68f68f859 1 1 1 72m replicaset.apps/ingress-nginx-controller-d8c96cf68 0 0 0 88m NAME STATUS COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create Complete 1/1 4s 88m job.batch/ingress-nginx-admission-patch Complete 1/1 5s 88m
DevOps 工程师
任务描述所需技能

创建 Kubernetes 资源。

输入以下命令创建 Kubernetes 部署、服务和入口示例:

kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
kubectl create ingress demo --class=nginx \ --rule nginxautomode.local.dev/=demo:80
DevOps 工程师

查看已部署的资源。

输入以下命令查看已部署资源的列表:

kubectl get all,ingress

在输出中,确认 HTTPd 容器组(pod)示例处于运行状态。下面是一个示例输出:

NAME READY STATUS RESTARTS AGE pod/demo-7d94f8cb4f-q68wc 1/1 Running 0 59m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/demo ClusterIP 10.100.78.155 <none> 80/TCP 59m service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 117m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/demo 1/1 1 1 59m NAME DESIRED CURRENT READY AGE replicaset.apps/demo-7d94f8cb4f 1 1 1 59m NAME CLASS HOSTS ADDRESS PORTS AGE ingress.networking.k8s.io/demo nginx nginxautomode.local.dev k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80 56m
DevOps 工程师

确认服务可供访问。

输入以下命令确认能够通过网络负载均衡器的 DNS 名称访问服务:

curl -H "Host: nginxautomode.local.dev" http://k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com

预期的输出如下所示:

<html><body><h1>It works!</h1></body></html>
DevOps 工程师

(可选)创建 DNS 记录。

  1. 按照使用 Amazon Route 53 控制台创建记录(Route 53 文档)中的说明,为已配置的域创建 DNS 记录。

  2. 输入以下命令确认能够通过配置的域名访问服务:

    curl "http://nginxautomode.local.dev/?[1-5]"

    预期的输出如下所示:

    <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html> <html><body><h1>It works!</h1></body></html>
DevOps 工程师,AWS DevOps
任务描述所需技能

启用 EKS 自动模式。

按照在现有集群上启用 EKS 自动模式中的说明进行操作(Amazon EKS 文档)。

AWS DevOps
任务描述所需技能

配置新的 NGINX 入口控制器实例。

  1. 下载 deploy.yaml 模板。

  2. 在首选编辑器中打开 deploy.yaml 模板。

  3. kind: Namespace 部分,输入命名空间的唯一名称,例如 ingress-nginx-v2

    apiVersion: v1 kind: Namespace metadata: labels: app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-v2
  4. 将每个部分的 namespace 值更新为新名称。

  5. 请在 kind: Deployment 部分执行以下操作:

    1. --controller-class 输入唯一值,例如 k8s.io/ingress-nginx-v2

    2. --ingress-class 输入唯一值,例如 nginx-v2

    apiVersion: apps/v1 kind: Deployment name: ingress-nginx-controller namespace: ingress-nginx-v2 ... spec: containers: - args: - /nginx-ingress-controller - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller - --election-id=ingress-nginx-leader - --controller-class=k8s.io/ingress-nginx-v2 - --ingress-class=nginx-v2
  6. kind: IngressClass 部分,为 --controller-class--ingress-class 输入您在上一节中使用的相同值:

    apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.12.0 name: nginx-v2 spec: controller: k8s.io/ingress-nginx-v2
  7. 在下一部分,添加 loadBalancerClass: eks.amazonaws.com/nlb 以便为 NGINX 入口控制器实例预调配网络负载均衡器:

    apiVersion: v1 kind: Service metadata: name: ingress-nginx-controller namespace: ingress-nginx-v2 spec: ... selector: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx type: LoadBalancer loadBalancerClass: eks.amazonaws.com/nlb
  8. 保存并关闭 deploy.yaml 模板。

DevOps 工程师

部署新的 NGINX 实例控制器实例。

输入以下命令应用已修改的清单文件:

kubectl apply -f deploy.yaml
DevOps 工程师

确认部署成功。

输入以下命令验证 ingress-nginx-v2 命名空间中的资源是否运行正常。

kubectl get all -n ingress-nginx-v2

在输出中,确认 NGINX 入口控制器容器组(pod)处于运行状态。下面是一个示例输出:

NAME READY STATUS RESTARTS AGE pod/ingress-nginx-admission-create-7shrj 0/1 Completed 0 24s pod/ingress-nginx-admission-patch-vkxr5 0/1 Completed 1 24s pod/ingress-nginx-controller-757bfcbc6d-4fw52 1/1 Running 0 24s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 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 service/ingress-nginx-controller-admission ClusterIP 10.100.150.114 <none> 443/TCP 24s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ingress-nginx-controller 1/1 1 1 24s NAME DESIRED CURRENT READY AGE replicaset.apps/ingress-nginx-controller-757bfcbc6d 1 1 1 24s NAME STATUS COMPLETIONS DURATION AGE job.batch/ingress-nginx-admission-create Complete 1/1 4s 24s job.batch/ingress-nginx-admission-patch Complete 1/1 5s 24s
DevOps 工程师

为示例 HTTPd 工作负载创建新的入口。

输入以下命令为现有 HTTPD 工作负载示例创建新的入口:

kubectl create ingress demo-new --class=nginx-v2 \ --rule nginxautomode.local.dev/=demo:80
DevOps 工程师

确认新的入口工作正常。

输入以下命令确认新的入口是否工作正常:

curl -H "Host: nginxautomode.local.dev" k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com

预期的输出如下所示:

<html><body><h1>It works!</h1></body></html>
DevOps 工程师
任务描述所需技能

割接至新的命名空间。

  1. (可选)按照编辑记录(Route 53 文档)中的说明更新 DNS 记录。

  2. 确认新的 NGINX 入口控制器实例如预期运行后,请删除原来的实例。

  3. 删除自管理式 AWS 负载均衡器控制器。有关说明,请参阅从已弃用的 ALB 入口控制器迁移应用程序(Amazon EKS 文档)。

  4. 清空受管节点组。有关说明,请参阅删除并清空节点组(eksctl 文档)。

AWS DevOps,DevOps 工程师

查看两个入口。

输入以下命令查看为 HTTPd 工作负载示例创建的两个入口:

kubectl get ingress

下面是一个示例输出:

NAME CLASS HOSTS ADDRESS PORTS AGE demo nginx nginxautomode.local.dev k8s-ingressn-ingressn-abcdefg-12345.elb.eu-west-1.amazonaws.com 80 95m demo-new nginx-v2 nginxautomode.local.dev k8s-ingressn-ingressn-2e5e37fab6-848337cd9c9d520f.elb.eu-west-1.amazonaws.com 80 33s
DevOps 工程师

相关资源