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 kubernetesk
: 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ệnhkubectl
, 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
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.
- Tạo network: vpc, subnets, internet gateway.
- Tạo quyền cho control plane
- Khởi tạo EKS cluster
- Cài đặt addon: vpc-cni, kube-proxy
- Tạo quyền cho worker node
- Khởi tạo worker node
- Cài đặt addon: coredns
- Test nginx deployment
- 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.
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
- subnet sẽ gán ip public cho bất kỳ ec2 instance:
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
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ả
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ả
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.
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.
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ả
Các bạn có thể xem trên aws console, tab Add-ons
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à
- AmazonEKSWorkerNodePolicy: cho phép worker xem thông tin.
- AmazonEKS_CNI_Policy: cho phép worker thao tác với networking.
- AmazonEC2ContainerRegistryReadOnly: cái này mình không chắc có thể là cho phép worker có thể kéo các custom docker image của kube-system từ registry ECR của AWS.
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ả
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ả
Ngon giờ check bằng kubectl
xem sao
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ả
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.
Tổng hợp lỗi
Worker node không thể join cụm
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
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
Cuộn xuống dưới phần Conditions các bạn sẽ thấy
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.- UPDATE 19/06/2024 đã có Triển khai private worker cho EKS
- Expose các application trong pod ra public internet bằng Service, LoadBalancer, Ingress và đi kèm domain.
- UPDATE 15/11/2024 đã có Triển khai aws load balancer controller cho EKS
- 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 scopeInstance 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