启用 Amazon EKS 自动模式时迁移 NGINX 入口控制器 - AWS 规范指引

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

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

Olawale Olaleye 和 Shamanth Devagari,Amazon Web Services

Summary

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

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

先决条件和限制

先决条件

架构

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

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

使用 blue/green 部署策略迁移 NGINX 入口控制器实例。

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

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

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

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

工具

AWS 服务

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

  • 弹性负载均衡在多个目标上分配传入的应用程序或网络流量。例如,您可以跨亚马逊弹性计算云 (Amazon EC2) 实例、容器以及一个或多个可用区中的 IP 地址分配流量。

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

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

其他工具

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

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

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

操作说明

Task说明所需技能

确认原 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 工程师
Task说明所需技能

创建 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
Task说明所需技能

启用 EKS 自动模式。

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

AWS DevOps
Task说明所需技能

配置新的 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 工程师
Task说明所需技能

割接至新的命名空间。

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

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

  3. 删除自行管理的 Loa AWS d Balancer 控制器。有关说明,请参阅从已弃用的 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 工程师

相关资源