0
0
Lập trình
TT

Triển Khai Karpenter trên EKS NodeGroup

Đăng vào 3 tuần trước

• 6 phút đọc

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

  1. Tạo IAM Role
  2. Tạo Controller IAM Role
  3. Tạo Chính Sách KarpenterControllerPolicy
  4. Thêm Tag cho Subnets và Security Groups
  5. Cập Nhật aws-auth ConfigMap
  6. Triển Khai Karpenter
  7. Lấy AMI ID
  8. Tạo NodeClass với Mã hóa KMS
  9. Tạo NodePool
  10. 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 Copy
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 Copy
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 Copy
{
    "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 Copy
{
  "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 Copy
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 Copy
kubectl edit configmap aws-auth -n kube-system

Thêm Phần Để Map Roles

Thêm phần sau vào mapRoles:

yaml Copy
- 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 Copy
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 Copy
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 Copy
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 Copy
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 Copy
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!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào