Giới Thiệu
Karpenter là một công cụ mở, hiệu suất cao để tự động mở rộng cụm Kubernetes, được phát triển bởi AWS. Dịch vụ Amazon Elastic Kubernetes Service (EKS) cung cấp một nền tảng mạnh mẽ và linh hoạt cho việc chạy các ứng dụng container hóa. Trong bài viết này, chúng ta sẽ khám phá cách triển khai Karpenter trên EKS NodeGroup, từ việc tạo IAM Role đến việc cấu hình và triển khai.
Mục Lục
- Tạo IAM Role
- Tạo Controller IAM Role
- Tạo Chính Sách KarpenterControllerPolicy
- Thêm Tag cho Subnets và Security Groups
- Cập Nhật aws-auth ConfigMap
- Triển Khai Karpenter
- Lấy AMI ID
- Tạo NodeClass với Mã hóa KMS
- Tạo NodePool
- Kết luận
Bước 1: Tạo IAM Role
Để bắt đầu, chúng ta cần tạo một IAM Role cho Karpenter. Dưới đây là cách thực hiện:
bash
aws iam create-role --role-name KarpenterNodeRole-santhosh --assume-role-policy-document file://trust-policy.json
Chính Sách Đính Kèm
Role này cần phải được đính kèm với các chính sách sau:
- AmazonEKSWorkerNodePolicy
- AmazonEKS_CNI_Policy
- AmazonEC2ContainerRegistryReadOnly
- AmazonSSMManagedInstanceCore
Bước 2: Tạo Controller IAM Role
Tiếp theo, chúng ta tạo một Controller IAM Role:
bash
aws iam create-role --role-name KarpenterControllerRole-santhosh --assume-role-policy-document file://controller-trust-policy.json
Cấu Hình Quan Hệ Tin Cậy
Chúng ta cần sửa đổi quan hệ tin cậy cho role này. Dưới đây là mẫu JSON:
json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/oidc.eks.ap-south-1.amazonaws.com/id/6B407ED9BFC9CE681546033D7AD4156A"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.ap-south-1.amazonaws.com/id/6B407ED9BFC9C46033D7AD4156A:aud": "sts.amazonaws.com",
"oidc.eks.ap-south-1.amazonaws.com/id/6B407ED9BFC9CE633D7AD4156A:sub": "system:serviceaccount:karpenter:karpenter"
}
}
}
]
}
Bước 3: Tạo Chính Sách KarpenterControllerPolicy
Chúng ta cần tạo chính sách cho Karpenter Controller:
json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Karpenter",
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ec2:DescribeImages",
"ec2:RunInstances",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"ec2:DescribeLaunchTemplates",
"ec2:DescribeInstances",
"ec2:DescribeInstanceTypes",
"ec2:DescribeInstanceTypeOfferings",
"ec2:DeleteLaunchTemplate",
"ec2:CreateTags",
"ec2:CreateLaunchTemplate",
"ec2:CreateFleet",
"ec2:DescribeSpotPriceHistory",
"pricing:GetProducts"
],
"Resource": "*"
},
{
"Sid": "ConditionalEC2Termination",
"Effect": "Allow",
"Action": "ec2:TerminateInstances",
"Resource": "*",
"Condition": {
"StringLike": {
"ec2:ResourceTag/karpenter.sh/nodepool": "*"
}
}
}
]
}
Bước 4: Thêm Tag cho Subnets và Security Groups
Để Karpenter hoạt động, chúng ta cần thêm tag cho các subnet và security groups:
bash
aws ec2 create-tags --tags "Key=karpenter.sh/discovery,Value=MF-MS-PRE-PROD-CLUSTER" --resources "sg-06ee27bb7de43cf6e"
Bước 5: Cập Nhật aws-auth ConfigMap
Chúng ta cần sửa đổi aws-auth ConfigMap để cho phép các node sử dụng IAM role mới tham gia vào cụm:
bash
kubectl edit configmap aws-auth -n kube-system
Thêm Phần Để Map Roles
Thêm phần sau vào mapRoles:
yaml
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::${AWS_ACCOUNT_ID}:role/KarpenterNodeRole-santhosh
username: system:node:{{EC2PrivateDNSName}}
Bước 6: Triển Khai Karpenter
Chúng ta sẽ sử dụng Helm để triển khai Karpenter:
bash
helm install karpenter oci://public.ecr.aws/karpenter/karpenter --namespace "karpenter" --create-namespace \
--set "settings.clusterName=santhosh" \
--set "serviceAccount.annotations.eks\.amazonaws\.com/role-arn=arn:aws:iam::${AWS_ACCOUNT_ID}:role/KarpenterControllerRole-santhosh" \
--set controller.resources.requests.cpu=1 \
--set controller.resources.requests.memory=1Gi \
--set controller.resources.limits.cpu=1 \
--set controller.resources.limits.memory=1Gi
Kiểm Tra Trạng Thái Triển Khai
Sau khi triển khai, bạn có thể kiểm tra trạng thái:
bash
kubectl get po -A
Bước 7: Lấy AMI ID
Chúng ta cần lấy ID của AMI mới nhất được khuyến nghị:
bash
aws ssm get-parameter --name /aws/service/eks/optimized-ami/1.30/amazon-linux-2-arm64/recommended/image_id --query Parameter.Value --output text
Bước 8: Tạo NodeClass với Mã hóa KMS
Để tăng cường bảo mật, bạn có thể tạo NodeClass với mã hóa KMS:
yaml
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: karpenter-core-class
spec:
amiFamily: AL2023
role: arn:aws:iam::${AWS_ACCOUNT_ID}:role/NodeInstanceRole
subnetSelectorTerms:
- tags:
kubernetes.io/cluster/Axis-MF-MS-PRE-PROD-CLUSTER: owned
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: Axis-MF-MS-PRE-PROD-CLUSTER
amiSelectorTerms:
- id: ami-060175f7c2d4690ba
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
volumeSize: 50Gi
volumeType: gp3
encrypted: true
kmsKeyID: arn:aws:kms:ap-south-1:3668421:key/c2b329ac-bf-47cd-9e054379b
Bước 9: Tạo NodePool
Cuối cùng, chúng ta sẽ tạo NodePool cho Karpenter:
yaml
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: karpenter-core-pool
spec:
template:
spec:
requirements:
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
- key: kubernetes.io/os
operator: In
values: ["linux"]
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand"]
- key: karpenter.k8s.aws/instance-type
operator: In
values:
- m5.xlarge
- r5.xlarge
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: karpenter-core-class
expireAfter: 720h
limits:
cpu: 1000
disruption:
consolidationPolicy: WhenEmptyOrUnderutilized
consolidateAfter: 2m
🚀 Kết Luận: Tại Sao Karpenter Nổi Bật?
Karpenter mang đến một cách tiếp cận hiện đại và thông minh cho việc cung cấp node Kubernetes, nâng cao hiệu suất cụm và hiệu quả hoạt động. So với các giải pháp truyền thống như Cluster Autoscaler, Karpenter cung cấp:
- ⚙️ Tối ưu hóa hiệu suất lập lịch node: Tự động chọn loại và kích thước instance phù hợp nhất cho workloads của bạn.
- ⚡ Tăng tốc độ mở rộng: Karpenter phản hồi nhanh chóng với các thay đổi của cụm, giúp mở rộng nhanh chóng trong thời gian cao điểm.
- 💰 Tối ưu hóa chi phí: Giúp giảm chi phí đám mây mà vẫn đảm bảo hiệu suất.
- 🛠️ Cấu hình đơn giản: Giảm thiểu sự phức tạp trong việc quản lý cấu hình nhóm node.
Hãy bắt đầu triển khai Karpenter ngay hôm nay để tối ưu hóa cụm Kubernetes của bạn!