Sáu Tháng Thực Chiến — GKE Trông Như Thế Nào Khi Chạy Production
Tôi đã vận hành workload production trên Google Kubernetes Engine được khoảng sáu tháng, và trải nghiệm này là sự pha trộn giữa những điều thú vị bất ngờ và những khoảnh khắc “sao không ai cảnh báo tôi về điều này”. Trước khi đụng vào bất cứ thứ gì, tôi đã mất quá nhiều thời gian đọc tài liệu mà bỏ qua các đánh đổi thực tế. Vì vậy, bài viết này chính là bài tôi ước gì mình có lúc đó.
Câu hỏi cốt lõi khi bắt đầu với GKE rất đơn giản: Autopilot hay Standard? Câu trả lời không rõ ràng, và chọn sai đồng nghĩa với việc hoặc trả tiền thừa, hoặc mất đi sự linh hoạt đúng vào lúc tệ nhất.
So Sánh Hai Phương Thức: GKE Autopilot và Standard Mode
GKE có hai mô hình vận hành về cơ bản khác nhau, và chúng không chỉ là các cấp tính năng — chúng đại diện cho các triết lý khác nhau về việc ai quản lý cái gì.
Standard Mode
Bạn tự cấp phát và quản lý node pool. Bạn quyết định loại máy, tham số autoscaling, kích thước đĩa và số lượng node. Kubernetes chạy đúng như bạn cấu hình. Đây là lãnh thổ quen thuộc nếu bạn đã từng chạy cluster tự quản lý trước đây.
Đánh đổi: bạn phải trả tiền cho dung lượng node đã dự trữ dù pod có được lên lịch trên đó hay không. Một pool 3 node e2-standard-4 tốn của bạn 24 vCPU và 96GB RAM, dù workload thực tế chỉ cần 6 vCPU lúc 2 giờ sáng.
Autopilot Mode
Google quản lý hoàn toàn các node bên dưới. Bạn chỉ định nghĩa pod — không cần node pool, không cần quyết định loại máy. Tính phí theo yêu cầu CPU/memory của từng pod, làm tròn đến giây gần nhất. Dung lượng node nhàn rỗi không tốn tiền vì bạn không sở hữu “node” nào cả.
Đánh đổi: bạn mất quyền kiểm soát cấu hình node. Một số DaemonSet không hoạt động, container đặc quyền bị hạn chế, và một số workload nhất định (ví dụ như suy luận ML nặng GPU) cần xử lý đặc biệt.
Con Số So Sánh Thực Tế
Vận hành một web backend điển hình (3 microservice, lưu lượng vừa phải, môi trường staging + production), đây là hóa đơn hàng tháng:
Standard Mode (3 × e2-standard-4, luôn bật):
Chi phí node: ~$180/tháng (3 node × $60)
Sử dụng thực tế: ~35-40% CPU trung bình
Chi phí thực mỗi vCPU-giờ: ~2.8×
Autopilot Mode (cùng workload):
Pod requests: ~$110/tháng (trả đúng những gì đã yêu cầu)
Tiết kiệm: ~38%
Với các nhóm không vận hành workload có tỷ lệ sử dụng cao 24/7, Autopilot thắng về chi phí. Khi bạn duy trì mức sử dụng node trên 70%, Standard bắt đầu có lý hơn.
Ưu và Nhược Điểm
GKE Autopilot
- Ưu: Không có gánh nặng quản lý node — không vá lỗi, không lập kế hoạch dung lượng, không còn cảnh “sao node này NotReady lúc 3 giờ sáng”
- Ưu: Tính phí theo pod giúp loại bỏ lãng phí dung lượng nhàn rỗi
- Ưu: Bảo mật tích hợp sẵn (workload identity, shielded node, binary authorization)
- Nhược: Pod khởi động có thể chậm hơn (30–60 giây) nếu Autopilot cần cấp phát hạ tầng bên dưới
- Nhược: Không có container đặc quyền — làm hỏng một số monitoring agent và ứng dụng legacy
- Nhược: Yêu cầu tài nguyên tối thiểu bắt buộc (0.25 vCPU, 0.5GB RAM mỗi container) — các cronjob nhỏ bị tính thêm
GKE Standard
- Ưu: Toàn quyền kiểm soát cấu hình node — GPU, loại máy tùy chỉnh, spot VM
- Ưu: Lên lịch pod nhanh hơn (node đã sẵn sàng)
- Ưu: Hoạt động với mọi workload, kể cả container đặc quyền và DaemonSet tùy chỉnh
- Nhược: Bạn phải trả tiền cho dung lượng node không dùng đến
- Nhược: Nâng cấp node, quản lý pool và lập kế hoạch dung lượng là trách nhiệm của bạn
- Nhược: Dễ cấu hình sai và vô tình tạo ra rủi ro bảo mật
Cài Đặt Khuyến Nghị cho Hầu Hết Các Nhóm
Từ kinh nghiệm thực tế của tôi, đây là một trong những kỹ năng cốt lõi cần nắm vững: bắt đầu với Autopilot, chỉ chuyển sang Standard khi bạn gặp phải giới hạn cụ thể. Hầu hết các nhóm chưa bao giờ chạm đến giới hạn đó.
Đây là cài đặt tôi sẽ khuyến nghị cho một nhóm phát triển ứng dụng web điển hình:
- Dùng Autopilot cho workload web staging và production
- Dùng Standard với Spot VM nếu bạn có batch/ML job với lịch trình linh hoạt
- Đặt resource request thận trọng nhưng chính xác — Autopilot tính phí dựa trên request, không phải mức sử dụng thực tế
- Bật Workload Identity từ ngày đầu — sẽ rất khó để thêm vào sau này
Hướng Dẫn Triển Khai
Bước 1: Tạo GKE Autopilot Cluster
# Cài đặt và cấu hình gcloud
gcloud init
gcloud auth application-default login
# Bật các API cần thiết
gcloud services enable container.googleapis.com
# Tạo cluster Autopilot
gcloud container clusters create-auto my-app-cluster \
--location=asia-northeast1 \
--release-channel=regular
# Lấy thông tin xác thực
gcloud container clusters get-credentials my-app-cluster \
--location=asia-northeast1
Flag --release-channel=regular cho bạn các phiên bản Kubernetes ổn định mà không cần quản lý nâng cấp thủ công. Dùng rapid nếu bạn muốn các tính năng mới nhất; stable nếu bạn muốn an toàn hơn.
Bước 2: Triển Khai Ứng Dụng
Tạo một deployment manifest cơ bản. Điểm mấu chốt với Autopilot là luôn phải đặt resource request:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: gcr.io/PROJECT_ID/my-app:latest
ports:
- containerPort: 8080
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
---
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
kubectl apply -f deployment.yaml
kubectl get pods -w
Bước 3: Cài Đặt CI/CD với Cloud Build
Cloud Build tích hợp tự nhiên với GKE và yêu cầu cấu hình IAM tối thiểu. Tạo file cloudbuild.yaml ở thư mục gốc của repo:
# cloudbuild.yaml
steps:
# Tạo container image
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '-t'
- 'gcr.io/$PROJECT_ID/my-app:$COMMIT_SHA'
- '.'
# Đẩy lên Container Registry
- name: 'gcr.io/cloud-builders/docker'
args:
- 'push'
- 'gcr.io/$PROJECT_ID/my-app:$COMMIT_SHA'
# Triển khai lên GKE
- name: 'gcr.io/cloud-builders/kubectl'
args:
- 'set'
- 'image'
- 'deployment/my-app'
- 'my-app=gcr.io/$PROJECT_ID/my-app:$COMMIT_SHA'
env:
- 'CLOUDSDK_COMPUTE_REGION=asia-northeast1'
- 'CLOUDSDK_CONTAINER_CLUSTER=my-app-cluster'
images:
- 'gcr.io/$PROJECT_ID/my-app:$COMMIT_SHA'
Kết nối điều này với GitHub repository của bạn qua Cloud Build Triggers:
# Cấp quyền cho Cloud Build để triển khai lên GKE
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')@cloudbuild.gserviceaccount.com" \
--role="roles/container.developer"
# Tạo trigger (hoặc thực hiện qua Console UI)
gcloud builds triggers create github \
--repo-name=my-app \
--repo-owner=my-github-username \
--branch-pattern='^main$' \
--build-config=cloudbuild.yaml
Mỗi lần push lên main sẽ tự động rebuild và redeploy. Toàn bộ pipeline — build, push, rollout — thường mất dưới 3 phút cho một service Go hoặc Node.js nhỏ.
Bước 4: Tối Ưu Chi Phí — Những Con Số Quan Trọng
Sau khi cluster đã chạy, ba điều chỉnh này đã cắt giảm hóa đơn của tôi đáng kể mà không ảnh hưởng đến hành vi ứng dụng:
Right-size resource request của bạn. Chạy ứng dụng dưới tải trong một tuần, sau đó kiểm tra mức sử dụng thực tế:
# Kiểm tra mức sử dụng CPU/memory thực tế so với requests
kubectl top pods --sort-by=cpu
# Lấy gợi ý từ Vertical Pod Autoscaler tích hợp của GKE
kubectl describe vpa my-app
Bật Horizontal Pod Autoscaler. Tự động scale down trong giờ thấp điểm:
kubectl autoscale deployment my-app \
--cpu-percent=60 \
--min=1 \
--max=10
Sử dụng committed use discount. Nếu bạn đã vận hành được một tháng và có mức sử dụng baseline ổn định, committed use discount 1 năm cho bạn giảm 37% so với giá on-demand cho Autopilot pod compute. Riêng khoản này trong trường hợp của tôi đã hoàn vốn trong hai tháng.
Một Điều Tôi Sẽ Làm Khác
Thiết lập Artifact Registry thay vì Container Registry cũ (gcr.io) ngay từ đầu. Nó có IAM controls tốt hơn, lưu trữ theo vùng và quét lỗ hổng tích hợp sẵn. Việc di chuyển URL container image sau này có nghĩa là cập nhật mọi deployment manifest và cấu hình CI — không khó, nhưng phiền phức.
# Tạo repository Artifact Registry
gcloud artifacts repositories create my-app-repo \
--repository-format=docker \
--location=asia-northeast1
# Định dạng URL image
# asia-northeast1-docker.pkg.dev/PROJECT_ID/my-app-repo/my-app:tag
Các Bước Tiếp Theo
Cài đặt trên giúp bạn có một GKE deployment hoạt động, tối ưu chi phí với CI/CD tự động chỉ trong một buổi chiều. Từ nền tảng này, các bước tiếp theo tự nhiên là thêm ingress controller phù hợp (controller do GKE quản lý hoạt động tốt với Autopilot), thiết lập cô lập môi trường dựa trên namespace và kết nối Cloud Monitoring để cảnh báo.
Đặc biệt, Autopilot cứ khiến tôi ngạc nhiên về lượng gánh nặng vận hành mà nó loại bỏ — sau sáu tháng, tôi chưa gặp một sự cố nào ở cấp độ node. Chỉ điều đó thôi đã đáng với chi phí vCPU cao hơn một chút so với các node tự quản lý.

