Hướng Dẫn Triển Khai Karpenter trên Google Cloud
Karpenter, một công cụ mở rộng tự động hóa cho Kubernetes, hiện đã có sẵn phiên bản thử nghiệm trên Google Cloud Platform (GCP), cho phép tự động điều chỉnh quy mô cho các workload trên Kubernetes. Được phát triển bởi đội ngũ CloudPilot AI với sự hợp tác của cộng đồng, bản phát hành này mở rộng khả năng đa đám mây của Karpenter.
⚠️ Lưu ý: Đây là phiên bản thử nghiệm và chưa được khuyến nghị sử dụng trong môi trường sản xuất, nhưng hoàn toàn có thể sử dụng cho việc thử nghiệm và nghiên cứu.
Trong hướng dẫn này, bạn sẽ học cách triển khai nhà cung cấp GCP bằng cách sử dụng biểu đồ Helm, cấu hình môi trường của bạn và thiết lập Karpenter để tự động khởi động các phiên bản GCP dựa trên các workload của bạn.
Mục Tiêu
Hướng dẫn này sẽ giúp bạn:
- Cài đặt và cấu hình Karpenter trên GCP.
- Tạo và quản lý các phiên bản GCP tự động.
- Kiểm tra và xác minh quá trình triển khai.
Các Điều Kiện Cần Thiết
Trước khi bắt đầu, hãy đảm bảo rằng bạn đã thiết lập những điều sau:
- Một cụm GKE đang hoạt động với trình điều khiển Karpenter đã được cài đặt (tham khảo hướng dẫn cài đặt Karpenter).
kubectl
được cấu hình để truy cập vào cụm GKE của bạn.helm
phiên bản 3 trở lên đã được cài đặt.- Các CRD của Karpenter đã được cài đặt trong cụm của bạn.
- Quyền truy cập GCP: Trình điều khiển Karpenter và nhà cung cấp GCP cần quyền truy cập để tạo các phiên bản, subnet và đĩa.
Chuẩn Bị Thông Tin Đăng Nhập GCP
Kích Hoạt Các API Cần Thiết
Kích hoạt các API Google Cloud cần thiết để Karpenter có thể quản lý tài nguyên tính toán và Kubernetes:
bash
gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
Tạo Tài Khoản Dịch Vụ và Tải Xuống Khóa
Tạo một tài khoản dịch vụ GCP với các vai trò sau:
- Quản trị viên Compute.
- Quản trị viên Kubernetes Engine.
- Quản trị viên Giám sát.
- Người dùng Tài khoản Dịch vụ.
Các quyền này cho phép Karpenter quản lý các phiên bản GCE, truy cập vào metadata GKE và báo cáo các số liệu giám sát.
Sau khi tạo tài khoản dịch vụ, hãy tạo một tệp khóa JSON và lưu trữ nó ở vị trí an toàn. Tệp này sẽ được sử dụng để xác thực Karpenter với các API của GCP.
Tạo Bí Mật Cụm
Tạo một bí mật Kubernetes để lưu trữ thông tin đăng nhập tài khoản dịch vụ GCP của bạn:
yaml
apiVersion: v1
kind: Secret
metadata:
name: karpenter-gcp-credentials
namespace: karpenter-system
type: Opaque
stringData:
key.json: |
{
"type": "service_account",
"project_id": "<your-project-id>",
"private_key_id": "<your-private-key-id>",
"private_key": "<your-private-key>",
"client_email": "<your-client-email>",
"client_id": "<your-client-id>",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "<your-client-x509-cert-url>",
"universe_domain": "googleapis.com"
}
Lưu tệp trên dưới dạng karpenter-gcp-credentials.yaml
, sau đó áp dụng nó vào cụm của bạn:
bash
kubectl create ns karpenter-system
kubectl apply -f karpenter-gcp-credentials.yaml
Cài Đặt Biểu Đồ
Đặt các biến môi trường cần thiết trước khi cài đặt biểu đồ:
bash
export PROJECT_ID=<your-google-project-id>
export CLUSTER_NAME=<gke-cluster-name>
export REGION=<gke-region-name>
# Tùy chọn: Đặt địa chỉ email tài khoản dịch vụ GCP nếu bạn muốn sử dụng một tài khoản dịch vụ tùy chỉnh cho các mẫu nhóm nút mặc định.
export DEFAULT_NODEPOOL_SERVICE_ACCOUNT=<your-custom-service-account-email>
Sau đó, sao chép kho lưu trữ này và cài đặt biểu đồ với lệnh sau:
bash
helm upgrade karpenter charts/karpenter --install \
--namespace karpenter-system --create-namespace \
--set "controller.settings.projectID=${PROJECT_ID}" \
--set "controller.settings.region=${REGION}" \
--set "controller.settings.clusterName=${CLUSTER_NAME}" \
--wait
Kiểm Tra Việc Tạo Nút
1. Tạo NodeClass và NodePool
Áp dụng các manifest sau để xác định cách Karpenter sẽ cấp phát các nút trên GCP. Hãy chắc chắn thay thế <service_account_email_created_before>
bằng địa chỉ email của tài khoản dịch vụ bạn đã tạo ở bước trước.
yaml
cat > nodeclass.yaml <<EOF
apiVersion: karpenter.k8s.gcp/v1alpha1
kind: GCENodeClass
metadata:
name: default-example
spec:
serviceAccount: "<service_account_email_created_before>"
imageSelectorTerms:
- alias: ContainerOptimizedOS@latest
tags:
env: dev
EOF
kubectl apply -f nodeclass.yaml
cat > nodepool.yaml <<EOF
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default-nodepool
spec:
weight: 10
template:
spec:
nodeClassRef:
name: default-example
kind: GCENodeClass
group: karpenter.k8s.gcp
requirements:
- key: "karpenter.sh/capacity-type"
operator: In
values: ["on-demand", "spot"]
- key: "karpenter.k8s.gcp/instance-family"
operator: In
values: ["n4-standard", "n2-standard", "e2"]
- key: "kubernetes.io/arch"
operator: In
values: ["amd64"]
- key: "topology.kubernetes.io/zone"
operator: In
values: ["us-central1-c", "us-central1-a", "us-central1-f", "us-central1-b"]
EOF
kubectl apply -f nodepool.yaml
2. Tạo Một Workload
Triển khai một workload đơn giản để kích hoạt Karpenter cấp phát một nút mới:
yaml
cat > deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: inflate
spec:
replicas: 1
selector:
matchLabels:
app: inflate
template:
metadata:
labels:
app: inflate
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: karpenter.sh/capacity-type
operator: Exists
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
containers:
- image: public.ecr.aws/eks-distro/kubernetes/pause:3.2
name: inflate
resources:
requests:
cpu: 250m
memory: 250Mi
securityContext:
allowPrivilegeEscalation: false
EOF
kubectl apply -f deployment.yaml
Khi workload được tạo, kiểm tra xem Karpenter đã thành công trong việc cấp phát một nút:
bash
$ kubectl get node
NAME STATUS ROLES AGE VERSION
gke-cluster-1-test-default-1c921401-kzbh Ready <none> 17d v1.32.4-gke.1415000
gke-cluster-1-test-default-84243800-v30f Ready <none> 17d v1.32.4-gke.1415000
gke-cluster-1-test-default-b4608681-5zq5 Ready <none> 17d v1.32.4-gke.1415000
karpenter-default-nodepool-sp86k Ready <none> 18s v1.32.4-gke.1415000
$ kubectl get nodeclaim
NAME TYPE CAPACITY ZONE NODE READY AGE
default-nodepool-sp86k e2-small spot us-central1-a karpenter-default-nodepool-sp86k True 46s
Các nút được tạo bởi Karpenter sẽ thường có nhãn karpenter.sh/provisioner-name
và có thể bao gồm các taint hoặc nhãn được xác định trong NodeClass
và NodePool
của bạn.
Tham Gia Cộng Đồng
Có câu hỏi, phản hồi hoặc muốn theo dõi sự phát triển?
👉 Tham gia kênh Slack của chúng tôi
👉 Hoặc tham gia Discord để kết nối với các cộng tác viên và người dùng khác
Phản hồi của bạn sẽ giúp định hình tương lai của việc tự động điều chỉnh quy mô đa đám mây với Karpenter!
Thực Hành Tốt Nhất
- Kiểm tra thường xuyên: Nếu bạn triển khai trong môi trường thử nghiệm, hãy kiểm tra thường xuyên các phiên bản và tính năng mới.
- Bảo mật thông tin: Đảm bảo thông tin đăng nhập luôn được bảo mật và chỉ cấp quyền tối thiểu cần thiết cho tài khoản dịch vụ.
Những Cạm Bẫy Thường Gặp
- Quyền truy cập không đủ: Đảm bảo rằng tài khoản dịch vụ có đầy đủ quyền cần thiết để thực hiện các hành động trên GCP.
- Cấu hình sai: Kiểm tra kỹ các biến môi trường và các tệp YAML để đảm bảo không có sai sót.
Mẹo Tối Ưu Hiệu Suất
- Chọn loại phiên bản phù hợp: Lựa chọn các loại phiên bản GCE phù hợp với workload của bạn để tối ưu hóa chi phí.
- Theo dõi tài nguyên: Sử dụng các công cụ giám sát để theo dõi hiệu suất và sử dụng tài nguyên của các nút.
Giải Quyết Sự Cố
- Nếu Karpenter không tạo nút, kiểm tra log của Karpenter để tìm hiểu nguyên nhân.
- Xác minh rằng tất cả các API cần thiết đã được kích hoạt.
FAQ
Karpenter có hỗ trợ cho các nhà cung cấp đám mây khác không?
Có, Karpenter hỗ trợ nhiều nhà cung cấp đám mây khác nhau.
Làm thế nào để báo cáo sự cố?
Bạn có thể báo cáo sự cố qua kênh Slack hoặc Discord của chúng tôi.