+13

Tôi bắt đầu học EKS

Thuộc series Cùng nhau học EKS nào

Giới thiệu

Bài này ghi lại quá trình mình học và dựng một cụm EKS đơn giản (EKS là viết tắt của Elastic Kubernetes Service - là kubernetes service của AWS). Hy vọng nó sẽ giúp mọi người hiểu hơn về EKS.

Kiến thức chuẩn bị trước khi đọc bài viết bao gồm:

  • Kubernetes: biết càng nhiều càng tốt (control plane, node, pod, service,...)
  • AWS: IAM, EC2, VPC, Security Group, ...
  • Terraform: cách dùng cơ bản.

Toàn bộ code cho bài này mình để ở https://github.com/tuana9a/aws-eks-example (zero).

Glossary - Từ khóa - Từ viết tắt mà mình sẽ sử dụng

  • k8s: viết tắt của kubernetes
  • k: chức năng alias command của bash script: alias k=kubectl, dạng shortcut gõ lệnh bằng chữ k thay vì phải gõ đầy đủ lệnh kubectl, các bạn sẽ thấy cái này trong lúc mình chạy lệnh.
  • EKS Control Plane, control plane: đều là control plane trong cụm EKS.
  • worker node, ec2 instance: đều ám chỉ worker node trong cụm EKS, mình sẽ dùng đan xen các từ này.
  • node group: là group của ec2 instance hay worker node.

Bắt đầu

Kiến trúc cơ bản của EKS trông như sau

image.png

Nguồn: https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html

EKS gồm:

  • EKS Control Plane: tương đương với controller node bên Kubernetes gốc, theo mình hiểu đến hiện tại thì EKS control plane được quản lý bởi AWS. Phía người sử dụng không có cách nào truy cập được control plane này, chỉ có thể tương tác qua các API mà nó cung cấp.
  • Instance: chính là worker node - nơi chạy pod, containers cho application của mình. Với EKS thì mình có thể sử dụng luôn dịch vụ EC2 của AWS để tạo máy ảo làm worker node. Worker node (EC2 instance) có thể nằm trong "Auto Scaling Group" - đây là tính năng autoscale: tăng, giảm số lượng EC2 instance một cách tự động (theo cpu, ram, theo traffic, hẹn giờ, ...).

Ok, đã hiểu, bắt đầu tạo EKS nhá. Cần chuẩn bị các thứ sau:

  • terraform - search "install terraform".
  • kubectl - search "install kubectl".
  • aws - search "install aws cli".
  • ~/.aws/credentials - credentials để tương tác với aws, search "how to configure aws credentials". Nó sẽ trông như này:
[default]
aws_access_key_id = SECRET
aws_secret_access_key = SECRET
region = ap-southeast-1

Ý tưởng - Các bước để tạo cụm EKS

Ý tưởng - các bước tạo cụm EKS này được mình tổng hợp từ kinh nghiệm cá nhân và những lần tạo failed. Để việc tạo cụm thuận tiện các bạn có thể làm theo chính xác theo mình, sau đó các bạn có thể "nghịch" ngợm sau đó. Mình có tổng hợp lại một số lỗi ở cuối bài viết. Khi các bạn tham khảo code https://github.com/tuana9a/aws-eks-example thì khi apply toàn bộ sẽ không work ngay, các bạn nên comment lại các resource chưa sử dụng và uncomment khi sử dụng khi làm theo hướng dẫn của mình.

  1. Tạo network: vpc, subnets, internet gateway.
  2. Tạo quyền cho control plane
  3. Khởi tạo EKS cluster
  4. Cài đặt addon: vpc-cni, kube-proxy
  5. Tạo quyền cho worker node
  6. Khởi tạo worker node
  7. Cài đặt addon: coredns
  8. Test nginx deployment
  9. Dọn dẹp

Kiến trúc của cụm EKS sau khi tạo sẽ như sau: Control plane và worker node nằm trong public subnet, được gán ip public và có thể truy cập trực tiếp từ internet. Worker node tương tác với control plane thông qua public internet.

image.png

Khởi tạo project

Khởi tạo terraform với provider là aws, ở đây mình sử dụng provider aws ở phiên bản 5.24.

terraform.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "5.24"
    }
  }

  required_version = ">= 1.2.0"
}
provider "aws" {
  region                   = "ap-southeast-1"
  shared_credentials_files = ["~/.aws/credentials"]
  profile                  = "default"
}

Sau đó khởi tạo provider bằng lệnh

terraform init

Sau khi khởi tạo xong các provider thì có thể bắt tay vào dựng cụm EKS được rùi.

1. Tạo network

Mình sẽ setup một network riêng giành cho EKS:

  • 1 vpc có dải ip là 10.0.0.0/16
  • 3 subnet với 3 dải ip khác nhau
  • Mỗi subnet nằm trên một availability zone khác nhau
  • Các subnet này là public subnet tức
    • subnet sẽ gán ip public cho bất kỳ ec2 instance: map_public_ip_on_launch = true
    • có internet gateway và route table để route traffic từ trong ra ngoài và từ ngoài vào trong

NOTE: map_public_ip_on_launch = true cái này là bắt buộc với setup hiện tại, nếu không bật thì quá trình tạo cụm có thể sảy ra lỗi như "Instances failed to join the cluster" (các bạn có thể xem lỗi này ở phía dưới bài viết), ... phía cuối bài viết mình sẽ giải thích thêm.

network.tf

resource "aws_vpc" "zero" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "zero"
  }
}
resource "aws_subnet" "zero_one" {
  vpc_id                  = aws_vpc.zero.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "ap-southeast-1a"
  map_public_ip_on_launch = true

  tags = {
    Name = "zero_one"
  }
}
resource "aws_subnet" "zero_two" {
  vpc_id                  = aws_vpc.zero.id
  cidr_block              = "10.0.2.0/24"
  availability_zone       = "ap-southeast-1b"
  map_public_ip_on_launch = true

  tags = {
    Name = "zero_two"
  }
}
resource "aws_subnet" "zero_three" {
  vpc_id                  = aws_vpc.zero.id
  cidr_block              = "10.0.3.0/24"
  availability_zone       = "ap-southeast-1c"
  map_public_ip_on_launch = true

  tags = {
    Name = "zero_three"
  }
}
resource "aws_internet_gateway" "public" {
  vpc_id = aws_vpc.zero.id
}
resource "aws_route" "public" {
  route_table_id         = aws_vpc.zero.default_route_table_id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.public.id
}

Apply nào

terraform apply # yes

Kết quả sẽ tạo thành công như hình dưới

image.png

2. Tạo quyền cho control plane

Trước khi tạo control plane, cần tạo quyền cho chúng trước, control plane cần quyền để thao tác với các tài nguyên cần thiết cho một cụm EKS, ví dụ như:

  • Xem thông tin network của cụm hiện tại
  • Xem và sửa auto scaling, kiểm soát số lượng node trong cụm
  • Xem thông tin của worker node (network, disk, cpu, ram)

Các quyền này đã được setup sẵn ở trong một policy có sẵn của AWS là AmazonEKSClusterPolicy. Giờ chúng ta sẽ tạo role EKSClusterRole, role này chỉ được sử dụng bởi dịch vụ eks, sau đó gắn (attach) với quyền (policy) AmazonEKSClusterPolicy, sau đó để control plane sử dụng quyền này khi khởi tạo cụm EKS.

eks-cluster-iam.tf

resource "aws_iam_role" "eks_cluster_role" {
  name = "EKSClusterRole"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Sid    = ""
        Principal = {
          Service = "eks.amazonaws.com"
        }
      },
    ]
  })
  managed_policy_arns = [
    "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
  ]
}

Apply

terraform apply # yes

Kết quả

image.png

Sau khi tạo quyền cho control plane thì chúng ta có thể khởi tạo cụm EKS

3. Khởi tạo control plane

Phần này mình tham khảo tại https://registry.terraform.io/providers/hashicorp/aws/5.24.0/docs/resources/eks_cluster#basic-usage.

Cụm mình tạo như sau:

  • tên cụm là zero
  • phiên bản kubernetes là 1.28
  • role là role vừa tạo, role có tên là EKSClusterRole
  • subnet là 3 subnet mà mình đã tạo ở trên, aws cũng yêu cầu cluster phải nằm trên ít nhất 2 availability zone

eks-cluster.tf

resource "aws_eks_cluster" "zero" {
  name     = "zero"
  role_arn = aws_iam_role.eks_cluster_role.arn
  version  = "1.28"

  vpc_config {
    subnet_ids = [
      aws_subnet.zero_one.id,
      aws_subnet.zero_two.id,
      aws_subnet.zero_three.id,
    ]
  }

  # Ensure that IAM Role permissions are created before and deleted after EKS Cluster handling.
  # Otherwise, EKS will not be able to properly delete EKS managed EC2 infrastructure such as Security Groups.
  depends_on = [
    aws_iam_role.eks_cluster_role,
  ]
}

Apply

terraform apply # yes

Kết quả

image.png

Mất 7p, cũng khá lâu, có một lần mình tạo mất gần 20p, chắc nặng!

Theo https://docs.aws.amazon.com/eks/latest/userguide/clusters.html, việc khởi tạo một cụm EKS bao gồm việc tạo control plane trên nhiều availability zone và đứng trước chúng là một load balancer - việc setup nhiều thứ như vậy thì lâu cũng phải, cơ mà vẫn nhàn với nhanh hơn việc tự setup một cụm Kubernetes bằng tay.

Cài đặt cụm k8s chưa bao giờ là dễ cả, haizz... Nếu có lỗi các bạn có thể comment hoặc ib trực tiếp mình (tuana9a). Nếu ok thì vô thử giao diện kiểm tra xem.

image.png

Lên rùi nè, nếu có lỗi thì trường status sẽ có chữ "Error" đỏ lòm to đùng. Các bạn có thể click vào cluster và xem các thông tin show trên giao diện.

image.png

Lúc này coi như control plane đã tạo thành công, có thể kéo kube config về bằng lệnh aws eks update-kubeconfig --name zero với zero là tên của cluster mà bạn đã tạo.

u@tuana9a-dev ~ $ aws eks update-kubeconfig --name zero
Added new context arn:aws:eks:ap-southeast-1:384588864907:cluster/zero to /home/u/.kube/config
u@tuana9a-dev ~ $
u@tuana9a-dev ~ $ kubectl get pods -A
NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
kube-system   coredns-6996c975cb-ppchn   0/1     Pending   0          31m
kube-system   coredns-6996c975cb-vb8d9   0/1     Pending   0          31m
u@tuana9a-dev ~ $ kubectl get nodes -o wide
No resources found
u@tuana9a-dev ~ $

Ở trên mình đã có thể sử dụng kubectl để kiểm tra các tài nguyên, kiểm tra pod thì trạng thái của pod đang là Pending điều này có thể giải thích bằng lệnh kubectl get nodes ngay sau đó. Do không có worker node nên các pod sẽ phải chờ cho tới khi các worker node "sống dậy". Vậy công việc tiếp theo là cần tạo worker node.

4. Cài đặt addon: vpc-cni, kube-proxy

Trước khi khởi tạo worker chúng ta cần chuẩn bị các addon cần thiết cho cụm: cni, kube-proxy đây là các thành phần bắt buộc phải có trong một cụm k8s, thiếu một trong các thành phần này có thể khiến việc khởi tạo worker node không thành công, chi tiết lỗi các bạn có thể tham khảo cuối bài viết.

Lưu ý: cần cài đặt cni trước khi dựng node_group (worker node)

Cách tìm eks addon version các bạn tìm trên mạng hoặc dùng script của mình ở README nhé

eks-addon.tf

resource "aws_eks_addon" "zero_vpccni" {
  cluster_name  = aws_eks_cluster.zero.name
  addon_name    = "vpc-cni"
  addon_version = "v1.14.1-eksbuild.1"
}

resource "aws_eks_addon" "zero_kubeproxy" {
  cluster_name  = aws_eks_cluster.zero.name
  addon_name    = "kube-proxy"
  addon_version = "v1.28.1-eksbuild.1"
}

Apply

terraform apply # yes

Kết quả

image.png

Các bạn có thể xem trên aws console, tab Add-ons

image.png

Ok giờ thì có thể đến bước khởi tạo worker được rồi

5. Tạo quyền cho worker node

Tương tự như control plane worker node cũng cần có quyền để truy cập các thông tin của cụm, vi dụ như:

  • Xem thông tin của cụm Kubernetes hiện tại
  • Xem thông tin networking hiện tại
  • Kéo các image của kube-system như coredns, ...

Các quyền này cũng được setup trong các policy có sẵn bởi AWS là

NOTE: Thực ra nói thật là mình cũng không chắc chỗ này, đại loại nếu mình bỏ một trong 3 quyền, thì sẽ lại có lỗi kiểu như "Instances failed to join the cluster" và việc tạo cụm lại không thành công, lỗi này mình có hình ảnh ở phía cuối bài viết. Mình có tìm được link này của AWS họ cũng giải thích qua về quyền cho worker https://docs.aws.amazon.com/eks/latest/userguide/create-node-role.html. Bạn nào có thể giải thích thêm chỗ này thì tốt =))

Ok giờ sẽ tạo một role có tên là EKSNodeRole, role này được sử dụng bởi dịch vụ ec2, tức ec2 instance - worker node có thể sử dụng role này. Role này sẽ được gắn với các policy ở trên

eks-node-iam.tf

resource "aws_iam_role" "eks_node_role" {
  name = "EKSNodeRole"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Sid    = ""
        Principal = {
          Service = "ec2.amazonaws.com"
        }
      },
    ]
  })
  managed_policy_arns = [
    "arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy",
    "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly",
    "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
  ]
}

Apply

terraform apply # yes

Kết quả

Screenshot 2024-06-09 131735.png

6. Khởi tạo worker node

Để tạo worker node có một vài cách như sau: Chi tiết các bạn có thể xem chi tiết ở đây https://docs.aws.amazon.com/eks/latest/userguide/eks-compute.html

  • EKS managed node groups
  • Self managed nodes
  • AWS Fargate

Để đơn giản thì mình sử dụng phương án đầu tiên, nó được AWS quản lý và mình không phải setup thêm gì cả. Link terraform resource eks_node_group Mình sẽ tạo node group như sau

eks-node-group.tf Thêm

resource "aws_eks_node_group" "zero" {
  cluster_name    = aws_eks_cluster.zero.name
  node_group_name = "zero"
  node_role_arn   = aws_iam_role.eks_node_role.arn
  subnet_ids = [
    aws_subnet.zero_one.id,
    aws_subnet.zero_two.id,
    aws_subnet.zero_three.id,
  ]
  capacity_type = "SPOT"

  scaling_config {
    desired_size = 1
    max_size     = 3
    min_size     = 1
  }

  update_config {
    max_unavailable = 1
  }

  # Ensure that IAM Role permissions are created before and deleted after EKS Node Group handling.
  # Otherwise, EKS will not be able to properly delete EC2 Instances and Elastic Network Interfaces.
  depends_on = [
    aws_iam_role.eks_node_role,
  ]
}

Giải thích chút:

  • Tên group là zero
  • Control plane của group này là zero - Tên của cụm mà mình khởi tạo control plane ở trên.
  • Các node trong group này sẽ có role là role mình vừa tạo ở trên.
  • Các node trong group nằm dưới 3 subnet đã tạo ở trên, ip của node sẽ nằm trong dải ip của subnet tương ứng.
  • Node group này nằm trong một autoscaling group có thể scale: min: 1, max: 3

Ngoài ra còn tham số capacity_type = "SPOT" cái này các bạn search google aws spot instance nhé.

Ok cũng nhiều phết rùi, giờ thử apply xem sao nhé

terraform apply # yes

Kết quả

image.png

Ngon giờ check bằng kubectl xem sao

image.png

Cũng ngon luôn

7. Cài đặt addon: coredns ???

Bước này khá là hỏi chấm.

  • coredns đã thấy trong pod rồi sao còn cài đặt tiếp?
  • tại sao không cài đặt addon coredns cùng với vpc-cni, kube-proxy?

Giải thích

  • các bạn có thể không cài đặt addon: coredns bằng terraform code, nhưng sau cần custom coredns các bạn sẽ phải làm tay hoặc thông qua giao diện aws console, điều này đi ngược với configuration as code và infra as code, bước này đơn giản là bế coredns về dưới trướng của terraform code để mình tiện quản lý.
  • mình đã thử terraform apply 3 addon vpc-cni, kube-proxy, coredns và node group cùng một lúc và kết quả là khi terraform apply thì bị timeout và báo lỗi addon: coredns DEGRADED, check trên giao diện aws thì addon coredns bị degraded. Lý do vì coredns được tạo trước node group, lúc này sẽ chưa có worker node nào và do coredns yêu cầu phải có worker node available để deploy pod, do vậy khởi tạo coredns không thành công hoặc rất lâu. Lỗi này thường thì chỉ cần chạy apply lại lần nữa thì lúc này đã có node rùi nên apply sẽ thành công, coredns cũ bị thay thế (replaced).

eks-addon.tf Thêm

resource "aws_eks_addon" "zero_coredns" {
  cluster_name  = aws_eks_cluster.zero.name
  addon_name    = "coredns"
  addon_version = "v1.10.1-eksbuild.2"
}

Apply

terraform apply # yes

Kết quả

image.png

8. Test nginx deployment

Cúng cùi cũng cồng thanh, source code các bạn có thể xem ở đây https://github.com/tuana9a/aws-eks-example (zero), bài dài nên mình để link repo ở nhiều nơi :V.

Yay lên rồi, test thử một vài deployment xem sao.

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80
          resources:
            requests:
              memory: "64Mi"
              cpu: "64m"
            limits:
              memory: "128Mi"
              cpu: "128m"
kubectl apply -f nginx-deployment.yaml
u@tuana9a-dev ~ $ k get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-86dcfdf4c6-2wbj7   1/1     Running   0          67s
nginx-deployment-86dcfdf4c6-58vl9   1/1     Running   0          67s
nginx-deployment-86dcfdf4c6-89m92   1/1     Running   0          67s
nginx-deployment-86dcfdf4c6-btlqc   1/1     Running   0          67s
nginx-deployment-86dcfdf4c6-cr4kn   1/1     Running   0          67s
nginx-deployment-86dcfdf4c6-ff7xq   1/1     Running   0          67s
nginx-deployment-86dcfdf4c6-mjbtw   1/1     Running   0          67s
nginx-deployment-86dcfdf4c6-qchlc   1/1     Running   0          67s
nginx-deployment-86dcfdf4c6-vxd7n   1/1     Running   0          67s
nginx-deployment-86dcfdf4c6-xcjdg   1/1     Running   0          67s
u@tuana9a-dev ~ $  

Good. Thử tăng thêm 30 pod xem auto scaling của EKS hoạt động như nào, chỉ cần sửa thành replicas: 30

...
spec:
  replicas: 30
...

Apply lại và xem kết quả.

u@tuana9a-dev ~ $ k get pods 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-86dcfdf4c6-2wbj7   1/1     Running   0          18m
nginx-deployment-86dcfdf4c6-58vl9   1/1     Running   0          18m
nginx-deployment-86dcfdf4c6-5wc8g   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-89m92   1/1     Running   0          18m
nginx-deployment-86dcfdf4c6-9bwf5   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-9d286   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-bf2xq   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-btlqc   1/1     Running   0          18m
nginx-deployment-86dcfdf4c6-ccn4x   1/1     Running   0          12m
nginx-deployment-86dcfdf4c6-cr4kn   1/1     Running   0          18m
nginx-deployment-86dcfdf4c6-dj757   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-f2xp2   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-ff7xq   1/1     Running   0          18m
nginx-deployment-86dcfdf4c6-g9xsm   1/1     Running   0          12m
nginx-deployment-86dcfdf4c6-gmckm   1/1     Running   0          12m
nginx-deployment-86dcfdf4c6-hm6j7   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-kbj5w   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-kfgj4   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-lzqww   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-mjbtw   1/1     Running   0          18m
nginx-deployment-86dcfdf4c6-nwgjc   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-p9llh   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-qchlc   1/1     Running   0          18m
nginx-deployment-86dcfdf4c6-tcldb   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-vvzv7   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-vxd7n   1/1     Running   0          18m
nginx-deployment-86dcfdf4c6-xcjdg   1/1     Running   0          18m
nginx-deployment-86dcfdf4c6-xwfrw   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-zjhg2   0/1     Pending   0          12m
nginx-deployment-86dcfdf4c6-zlzns   0/1     Pending   0          12m
u@tuana9a-dev ~/github.com/tuana9a/aws-eks-example/zero (master?) $  

hmm có một vài pod bị pending

u@tuana9a-dev ~ $ k get pods | grep Pending | wc -l
17
u@tuana9a-dev ~ $ 

Có 17 pod vẫn bị Pending, ngồi chờ cả 14 phút mà vẫn chưa thấy EKS tự scale thêm EC2 node cho mình 😦

Đoạn này mình đã tìm ra nguyên nhân là mình chưa có cluster autoscaler, kiểu mặc định cụm EKS không tự scale cho mình, chức năng này giống như tính năng, optional feature và AWS để người dùng đưa ra lựa chọn. Có nhiều hơn một cách để implement cluster autoscaler Autoscaling - Amazon EKS. Thực ra đến đây thì có thể coi như việc tạo một cụm EKS đã thành công với số lượng worker trong cụm là số lượng tĩnh, các bạn có thể set số lượng node trong cụm thông qua giá trị desired_size của node group. Cơ mà dùng cloud mà vẫn phải làm tay nhiều vậy thì quá lãng phí. Tuy nhiên bài đã dài chắc phải để sang bài sau.

9. Dọn dẹp

Sau khi tạo thành công và nghịch các thứ các bạn có thể chạy lệnh terraform destroy để "destroy" các thứ mà bạn với mình vừa tạo.

image.png

Tổng hợp lỗi

Worker node không thể join cụm

image.png

image.png

Lỗi này thì các bạn cần kiểm tra lại quyền IAM, hoặc setting của network (VPC, subnet, ...)

addon: coredns DEGRADED

Mình đã thử cài 3 addon vpc-cni, kube-proxy và coredns cùng một lúc và kết quả là khi terraform apply thì bị timeout. Lý do vì coredns được tạo trước node group, lúc này sẽ chưa có node nào available cả và do coredns yêu cầu phải có worker node available để deploy pod nên việc khởi tạo coredns không thành công hoặc rất lâu lúc này terraform apply sẽ báo lỗi (addon: coredns DEGRADED). Lỗi này thì chỉ cần chạy apply lại lần nữa thì lúc này đã có node rùi nên apply sẽ thành công, coredns cũ bị thay thế (replaced).

Quên không khởi tạo cni

Khi chưa cài đặt addon vpc-cni, kube-proxy có thể bị dính lỗi như sau

image.png

container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized

Khi click vào xem chi tiết node của node group

image.png

Cuộn xuống dưới phần Conditions các bạn sẽ thấy

image.png

Lỗi này do các bạn quên không khởi tạo addon vpn-cni, apply addon.tf ở bước "Cài đặt addon: vpc-cni, kube-pxory" là được

TODO

Một số việc mình chưa thể làm được trong bài này

  • Private worker: với setup hiện tại thì cả control plane, worker node đang nằm trong public subnet và có ip public (map_public_ip_on_launch = true), tức đang bị expose ra public internet và có thể bị tấn công, rõ ràng là không cần thiết phải expose các worker node ra public như vậy, cần tìm cách deploy chúng một cách private.
  • Expose các application trong pod ra public internet bằng Service, LoadBalancer, Ingress và đi kèm domain.
  • Setup EBS storage class cho EKS, dynamic volume provisioning.
  • Autoscaling: tự động tăng giảm số lượng worker node tùy theo workload.
  • Setup private ECR - Docker registry cho worker node kéo docker image. Out of scope
  • Instance types: mặc định mình được cấp là t3.medium, tham số này nên được kiểm soát (bằng một danh sách white list các instance type chẳng hạn). Too easy

Tham khảo

https://registry.terraform.io/providers/hashicorp/aws/5.24.0/docs/resources/eks_cluster

https://registry.terraform.io/providers/hashicorp/aws/5.24.0/docs/resources/eks_node_group

https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler/cloudprovider/aws

Container Orchestration nói chung hay Kubernetes nói riêng vẫn là những công nghệ phức tạp, gồm nhiều thành phần. Học Kubernetes là một hành trình dài và gập gềnh. Rất mong các bạn góp ý những sai sót, cải thiện, bàn tán - thảo luận ở phía dưới phần comments để mình cùng các bạn khác có thể hiểu hơn về EKS. Hẹn mn ở bài tiếp theo về EKS, còn kha khá thứ để nghịch cái thằng này.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.