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

<<:  [Day 16] -『 GO语言学习笔记』- 核心型别(III)

>>:  [第十六天]从0开始的UnityAR手机游戏开发-如何切换场景02

【Day 28】Deno + Oak 建立 Restful API (1)

前言 在 NodeJS 的时候,要建立一个网页我们时常会搭配像是 Express、Koa、Hapi...

Day 27 - 利用 WireGuard 建立点对点隧道

今天来与大家分享,透过 WireGuard 建立点对点隧道。 我们常用的 PTP Tunnel,像是...

亚马逊网络服务 SAA-C02 认证考试和通过它的一些技巧

Are You Ready For AWS Certified Solutions Architec...

Day18

传值与传址,但C++是一个特别的语言比C语言更复杂真要细分可分成3类(传值,传址,传参考),同时指标...

Day-7 Pipeline

Pipeline tags: IT铁人 Clock Cycle Time Clock Cycle T...