iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
DevOps

關於我幫新公司建立整套部屬流程那檔事系列 第 18

EP18 - 歡迎來到容器管理工具的 EKS

昨天我們把 Django 專案容器化,
最後推送上 AWS ECR,
部署上仍舊仰賴 Code Deploy 部署到 EC2,
連 EKS(AWS K8S)都沒有,
實在也巧婦難為無米之炊,
當然我們也可以在 EC2 上起 Docker,
不過這就有點多此一舉,
既然服務都上雲了,
何苦還用地端思維來思考雲端架構,
雖然在虛擬機械中執行容器,
好處在於每個容器內的個體都很獨立,
比起在虛擬機械上安裝伺服器,
伺服器上執行多個 AP Server 來得安全一點點(只有一點點),
但我們就必須對服務做監控,
監控到服務有問題時還需要手動重啟容器,
相較之下沒有帶來太多好處,
因此為了讓容器的運作更有效率,
我們將使用 Amazon Elastic Kubernetes Service(Amazon EKS)來管理並運行容器。

什麼是 Amazon EKS

Amazon EKS 全名為 Amazon Elastic Kubernetes Service
是 AWS 上的 K8S 服務

那...
什麼又是 Kubernetes(K8S)呢?
簡單來說就是容器管理工具
以往我們在管理容器時
都要手動啟動容器
虛擬機械配置的 CPU 和 記憶體資源是有限的
每次啟動時還要指定這些資源的配置
其實不太好操作
而 K8S 可以讓我們透過 yaml 檔
定義每個容器需要配置的資源
可說是相當方便

有了 EKS
就可以靈活地在 AWS 雲端或內部部署系統中啟動、執行和擴展 Kubernetes 應用程式
Amazon EKS 可協助您提供可用性高且安全的叢集
並將修補、佈建節點及更新等關鍵任務自動化

因為 EKS 是將 K8S 另外包一層給大家使用
底部還是使用 K8S
因此在地端主機有自建 K8S 服務的
可以無痛將服務搬遷到 EKS 上
反之亦然

為什麼要用託管式的 K8S

其實各家雲端供應商都有推出各自的託管式 K8S
Azure 有 AKS、GCP 有 GKE
Amazon 有 EKS
那為什麼各家都有提供這些服務
難道自建 K8S 不好嗎?

有位前輩的文章寫得不錯
大致上 K8S 的架構可分成兩邊來看
一個是 Master、一個是 Node
Master 主要是 K8S 的核心功能
管理內部的路由、記錄內部資源使用狀況
而 Node 則是我們服務要部署的位置

K8S 的架構有個很尷尬的問題
就是在架設 Master 的時候
很痛苦要裝一堆元件
而 Node 則要跟 Master 溝通
萬ㄧ Master 掛了
容器依舊可以正常運作
但是無法對容器進行任何操作
如果說容器就像貨櫃一樣
那 Master 就像貨櫃吊掛一樣
http://album.udn.com/carylo/photo/9103495

製作貨櫃就這麼累了
我還要自己建吊掛機械
還要設定這些貨櫃吊掛作業
不累嗎?
想到就累了
設定的不好不是貨櫃倒就是吊掛機械倒
https://udn.com/news/story/7320/5778520

因此強烈建議
如果要使用 K8S
沒有不可抗拒因素的話
建議還是使用託管式的服務

EKS 在 AWS 的使用

使用託管式的 K8S
比較大的好處是可以專注在服務本身的建置

只想佈建容器不想管 Infrastructure 的
可以使用 ECS 只設定容器需要的資源
剩下的 AWS 幫你處理

對於這類無伺服器應用不太放心的
也是有 EC2 託管模式
AWS 會幫你建立 EC2
而且 AWS 會幫你管理

另外一種也是本次實作的重點
我們也可以傳統一點
建立 Autoscaling Group
並透過 Autoscaling Group 建立 EC2
我們也可以直接進入並管理這些 EC2

Terraform 建置 EKS

這裡我們要使用新的方式來建置 EKS
以往我們要建立 EKS
需要建立 Security Group、EC2、Autoscaling Group
整個 inbound/outbound 設置都很麻煩
這時候我們就可以使用 terraform 的現成模組 eks

而 EKS 我們選擇最新版的 1.20

而且除了我們自己管的 EC2 以外
也可以設置 node_group 讓 aws 幫我們管
對於 EC2 該有個設定
像是硬碟、IAM Profile User 都可以設置
對於 ami 的選擇比較特別
Amazon 會定期將幫 EC2更新上製作新的版本並發布在 eks-ami releases
需要使用 aws cli 才能夠查看 aws cli 的版本

aws ec2 describe-images --filters "Name=name,Values=amazon-eks-node-1.20*" --region ap-northeast-1 --output json

因為我們今天沒有要部署到 EKS 上
建議大家可以先研究一下程式碼就好
可以明天再 apply,節省一點 $

stage/main.tf

data "aws_eks_cluster" "cluster" {
    name = module.aws-stage-cluster.cluster_id
}

data "aws_eks_cluster_auth" "cluster" {
    name = module.aws-stage-cluster.cluster_id
}

provider "kubernetes" {
    host                   = data.aws_eks_cluster.cluster.endpoint
    cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
    token                  = data.aws_eks_cluster_auth.cluster.token
}

module "key_pair_cluster_ec2" {
    source   = "../modules/key"
    key_name = "cluster-ec2"
}

module "aws-stage-cluster" {
    source          = "terraform-aws-modules/eks/aws"
    cluster_name    = "aws-stage-cluster"
    cluster_version = "1.20"
    subnets         = sort(data.aws_subnet_ids.private_subnet_ids.ids)
    vpc_id          = aws_vpc.stage.id
    
    worker_create_cluster_primary_security_group_rules    = true
    
    worker_ami_name_filter = "amazon-eks-node-1.20-v20210830"
    
    workers_role_name = aws_iam_instance_profile.ec2_profile.name
    worker_groups     = [
        {
            instance_type        = "t3.large"
            asg_desired_capacity = 1
            asg_max_size         = 7
            public_ip            = false
            autoscaling_enabled  = true
            root_volume_size     = "50"
            root_volume_type     = "gp2"
            key_name             = module.key_pair_cluster_ec2.key_name
            tags                 = [
                {
                    key           = "eks:cluster-name"
                    value         = "aws-stage-cluster"
                    propagate_at_launch = true
                }
            ]
        }
    ]

    map_users = [{
        "userarn"  = aws_iam_user.jenkins.arn
        "username" = "jenkins"
        "groups"   = ["system:masters"]
    }]
    
    enable_irsa = true
    write_kubeconfig   = true
}
terraform init

為什麼使用最新版的 EKS

眼尖的人應該會發現
我們使用 1.20 版本的 Kubernetes
kubernetes milestones 指出
目前已經發佈到 1.26 最舊則有到 1.16
因為沒有 LTS 的版本
因此連 AWS 官網都有特別標注 EKS 的 End Of Life
https://ithelp.ithome.com.tw/upload/images/20210930/20141518NNFUB9PWvv.png

因此每隔一段時間就必須升版
不然就沒辦法使用了
當然也可以先用次一版的 EKS
不過時候到了還是要往上升版
既然無論如何都要往上升版
不如一開始就先使用最新的踩踩雷

參考資料:

  1. Amazon Elastic Kubernetes Service
  2. https://ithelp.ithome.com.tw/articles/10194839
  3. Day 2: Kubernetes 架構與元件
  4. Terraform eks
  5. Amazon EKS Kubernetes 版本
  6. kubernetes milestones

上一篇
EP17 - 容器化你的 Django 專案
下一篇
EP19 - RE:從零開始學習本機操作 EKS 並手動部署
系列文
關於我幫新公司建立整套部屬流程那檔事30

尚未有邦友留言

立即登入留言