将EKS的Kubernetes版本从1.15升级到1.19

达成一个特定的目标或意图。

为了跟上工作流程的最新版本,我们打算将我们正在使用的Amazon EKS的”kubernetes版本1.15″升级到最新的发布版本1.19,因为该版本的支持于2021年5月3日结束。

前提

    • 既存のkubernetesバージョンは1.15

EKSのリリースのタイミング上、検証時はKubernetes1.18,切替時はKubernetes1.19を使用

環境はterraform(基本最新版 執筆時v0.14.6)で管理している

旧環境はeksctlで作成している(この辺の置き換えはeksctlで作成していたEKSリソースをterraformに置き換えるで紹介)

总体情况

基本上,Kubernetes集群的升级只能更新到后续的一个较小版本,因此要升级到1.19,需要执行四次更新操作。

由於Amazon EKS運行的是具有高可用性的控制平台,因此我們一次只能更新一個次要版本。
集群的更新。

因此,本次将新建一个环境并切换至ALB的目标,以进行更新的适应性改进。

    1. 在测试环境中部署Kubernetes 1.18环境,以确认各个服务能够正常运行。

关于外部访问的部分需要做出一些妥协。

    • Kubernetes1.19で新環境を作成する

ようやくこの時点でEKSでKubernetes1.19が使えるようになった
cluster名やterraformのリソース名などは[既存環境名]+”-v2″とした

terraformでALBの向け先変更

stagingはバツっと切り替える、本番は徐々に切り替える
e2eテストの実施
マネコン>ロードバランサ>ターゲットグループ>メトリクスからアクセスが変わっていることを見る

旧環境を削除する
廃止予定のAPI置き換え対応

今回は対応が後手になってしまったが、1. の時点で対応できると良い

搭建一个Kubernetes 1.18的验证环境,以确保每个服务都可以正常运行。

建立环境

    • terraformで新規ディレクトリを切りstaging環境のsubnet上に新規EKSクラスタを作成

ALBも新規に作成し、Route53でサブドメインを切り紐付ける(証明書問題が手っ取り早く回避できる)
terraform deleteで検証環境を安全に削除できる

動作確認のためRDBとかSQSの連携システムはそのままstaging環境のものを流用。

在操作Kubernetes时使用的容器工具系列。

修正的地方在宣言中。

指标服务器

metrics-server使用的版本为v0.3.1。
由于存在指标差异等问题会对运营产生影响,因此此次不进行更新并另外进行相应的处理。
将以下被废弃的API替换为更新的集群。

apiVersion: extensions/v1beta1 

apiVersion: apps/v1
集群自动扩展器

要在Amazon EKS中设置Cluster Autoscaler,您应该怎么做?请再次确认一下
将以下清单中除了命令部分之外的内容替换为:
https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
最后,请确认并更新为最新镜像的版本。

image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.19.3
仪表盘

我之前使用v1.10.1版本,由于与metrics-server通信出现问题,因此决定从Kubernetes Dashboard的教程中更新到v2.0.5版本。(也考虑使用最新版本,但不确定是否必要)
根据我的了解,v2版本带来了一些新功能。

对服务基础设施进行操作确认

    • サービス基盤系のコンテナはcodebuild経由でデプロイする

新環境のEKSクラスタ名を指定したブランチを公開

以前はkubeconfigをS3から取得していたが、update-kubeconfig-cli-command対応に伴い置き換え

デプロイ時にそのブランチを指定することで新環境にデプロイ

e2eテストを実施

ALBを新規で立てている関係でログアウト後のリダイレクト先が異なり失敗するので、ここだけは手動対応した

在Kubernetes 1.19中创建新环境。

在Terraform的现有staging环境目录中创建一个新环境。为了后续操作,请先创建目标组。
部署清单将在当天进行,但为了更改部署的目标,需要提前进行准备。

ALB的目标变更

舞台装置或舞台搭建

使用权重功能一次性进行替换,如果有问题则替换为100:0。完全迁移后,删除前向转发,原始代码被注释掉。由于我们公司有多个ALB,则同时进行替换。

    • e2eテストの実施

 

    マネコン>ロードバランサ>ターゲットグループ>メトリクスからアクセスが変わっていることを見る
resource "aws_lb_listener" "service" {
  load_balancer_arn = aws_lb.service.arn
  port              = 443
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-TLS-1-2-2017-01"
  certificate_arn   = var.acm["arn"]
  default_action {
    target_group_arn = aws_lb_target_group.service.arn
    #target_group_arn = aws_lb_target_group.service.arn
    type             = "forward"
    forward {
      target_group {
        arn = aws_lb_target_group.service.arn
        weight = 0
      }
      target_group {
        arn = aws_lb_target_group.service_v2.arn
        weight = 100
      }
    }
  }
}

生产

利用ALB的权重调整功能,在新环境中逐渐以90:10的比例进行切换。
在切换到正式环境时,由于terraform的错误或黏滞性未明确记载,所以必须加入这些要素才能进行apply操作。

    • e2eテストの実施

 

    マネコン>ロードバランサ>ターゲットグループ>メトリクスからアクセスが変わっていることを見る
resource "aws_lb_listener" "service" {
  load_balancer_arn = aws_lb.service.arn
  port              = 443
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-TLS-1-2-2017-01"
  certificate_arn   = var.acm["arn"]
  default_action {
    target_group_arn = aws_lb_target_group.service.arn
    #target_group_arn = aws_lb_target_group.service.arn
    type             = "forward"
    forward {
      target_group {
        arn = aws_lb_target_group.service.arn
        weight = 90
      }
      target_group {
        arn = aws_lb_target_group.service_v2.arn
        weight = 10
      }
      stickiness {
        enabled  = false
        duration = 1
      }
    }
  }
}

删除旧环境

    • ALBの重み付けのルール削除&ターゲットグループを削除

 

    eksctlで作成していたEKS Kubernetes1.15の環境を削除

取消计划中的API替换对策

本次工作按照工作计划,在Kubernetes1.18中进行验证,而1.19版本则直接在生产环境中进行了相应的处理。

由于Kubernetes1.19新增了一些即将废除的API警告REST资源(也称为API对象),因此废弃的API问题浮出水面。虽然这是后期工作,但由于计划安排很松,我们按照警告进行了相应的处理。

应用程序运行时出现的错误摘录。

Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
Warning: rbac.authorization.k8s.io/v1beta1 Role is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 Role
Warning: rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBinding
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
Warning: apiregistration.k8s.io/v1beta1 APIService is deprecated in v1.19+, unavailable in v1.22+; use apiregistration.k8s.io/v1 APIService
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress

由于 Ingress 的 extensions/v1beta1→networking.k8s.io/v1 的描述方式会发生变化,所以请从这里确认并进行替换。
此外,关于 Ingress 的替换问题似乎会持续出现警告的 bug… 期待使用 networking.k8s.io/v1 而不是 extensions/v1beta1 的 apiVersion #94761
由于 Kubernetes 1.20 已解决此问题,所以在使用 1.19 时只能放弃并接受这种情况。

关于argo-rollouts,由于简单的API替换,[问题](Release manifests with CRD’s using apiextensions.k8s.io/v1 #779)尚未解决,因而搁置。

废话不多说

从加入GMS以来的第一个任务,我认为学习Kubernetes / terraform从零开始和服务基础结构的入门是非常恰到好处的教程。
由于我之前没有相关知识,花了三个月的时间完成了这个任务,但下次可能不需要一个月的时间了。考虑到Kubernetes的版本升级,我希望能够高效且无误地进行下去。

在Global Mobility Service中,我们正在招募包括基础设施工程师和IT工程师在内的员工。