0

🚀 Chapter 5 — Platform: Phần D — Quản lý Google Online Boutique trên Amazon EKS bằng Helm

Chapter 5B, chúng ta đã:

  • Tạo Amazon EKS cluster.
  • Tạo managed node group.
  • Kết nối kubectl với EKS.
  • Deploy Google Online Boutique bằng Kubernetes manifest.
  • Expose frontend thông qua AWS Load Balancer.

Tuy nhiên, cách triển khai bằng một file manifest lớn vẫn có một số hạn chế:

  • Khó thay đổi cấu hình theo từng môi trường.
  • Khó quản lý nhiều phiên bản.
  • Khó tái sử dụng cấu hình.
  • Khó thay đổi số lượng replicas cho từng service.
  • Khó chuẩn hóa deployment cho nhiều microservice.

Trong Chapter 5D, chúng ta sẽ sử dụng Helm để quản lý Online Boutique trên Amazon EKS.

1. Mục tiêu

Sau khi hoàn thành Chapter này, chúng ta sẽ có:

Google Online Boutique
        ↓
Helm Chart
        ↓
helm install / helm upgrade
        ↓
Amazon EKS
        ↓
Online Boutique

Chúng ta sẽ thực hiện:

  1. Cài đặt Helm.
  2. Kiểm tra EKS cluster từ Chapter 5B.
  3. Clone source code Online Boutique.
  4. Kiểm tra Helm chart có sẵn.
  5. Xóa deployment cũ bằng manifest.
  6. Kiểm tra Helm chart.
  7. Render Kubernetes manifest bằng Helm.
  8. Deploy Online Boutique bằng Helm.
  9. Kiểm tra các resource.
  10. Thay đổi cấu hình bằng Helm.
  11. Thực hiện Helm upgrade.
  12. Kiểm tra Helm history.
  13. Rollback phiên bản.
  14. Xóa Helm release và tài nguyên liên quan.

Trong Chapter này, chúng ta vẫn sử dụng Amazon EKS hiện tại từ Chapter 5B. Không tạo cluster mới.


2. Kiến trúc sau khi hoàn thành

                         Internet
                            │
                            ▼
                 AWS Load Balancer
                            │
                            ▼
                    frontend Service
                            │
                            ▼
                      frontend Pod
                            │
          ┌─────────────────┼─────────────────┐
          ▼                 ▼                 ▼
    cartservice     productcatalogservice   checkoutservice
          │                 │                 │
          ▼                 ▼                 ▼
      cart Pod       productcatalog Pod   checkout Pod
          │
          ▼
    Các microservice khác

Helm sẽ quản lý toàn bộ Kubernetes resources:

Helm Release
     │
     ├── Deployments
     ├── Services
     ├── ConfigMaps
     └── Các Kubernetes resources khác

3. Kiểm tra môi trường từ Chapter 5B

3.1. Kiểm tra AWS CLI

aws --version

Kiểm tra AWS account:

aws sts get-caller-identity

Kiểm tra Region:

aws configure get region

Trong lab này, chúng ta sử dụng Region Tokyo:

ap-northeast-1

Nếu chưa cấu hình:

aws configure set region ap-northeast-1

3.2. Đặt biến môi trường

export AWS_REGION=ap-northeast-1
export CLUSTER_NAME=online-boutique-eks

Kiểm tra:

echo "$AWS_REGION"
echo "$CLUSTER_NAME"

Kết quả:

ap-northeast-1
online-boutique-eks

3.3. Kiểm tra EKS cluster

aws eks describe-cluster \
  --name "$CLUSTER_NAME" \
  --region "$AWS_REGION" \
  --query 'cluster.status' \
  --output text

Kết quả mong đợi:

ACTIVE

3.4. Kiểm tra kết nối kubectl

kubectl get nodes

Tất cả node cần có trạng thái:

Ready

Kiểm tra namespace:

kubectl get namespaces

Nếu namespace online-boutique đã tồn tại từ Chapter 5B:

kubectl get namespace online-boutique

Nếu chưa tồn tại, tạo namespace:

kubectl create namespace online-boutique

Đặt namespace mặc định cho context hiện tại:

kubectl config set-context --current \
  --namespace=online-boutique

Kiểm tra:

kubectl config view --minify \
  --output 'jsonpath={..namespace}'

Kết quả:

online-boutique

4. Cài đặt Helm

4.1. Kiểm tra Helm

helm version

Nếu Helm đã được cài đặt, kết quả sẽ tương tự:

version.BuildInfo{Version:"v3.x.x", ...}

4.2. Cài đặt Helm trên macOS

Nếu bạn sử dụng macOS và đã có Homebrew:

brew install helm

Kiểm tra:

helm version

4.3. Cài đặt Helm trên Ubuntu

Cài đặt các package cần thiết:

sudo apt update

sudo apt install -y curl gpg

Thêm Helm repository:

curl https://baltocdn.com/helm/signing.asc \
  | gpg --dearmor \
  | sudo tee /usr/share/keyrings/helm.gpg > /dev/null

Thêm repository vào APT:

echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/helm.gpg] \
https://baltocdn.com/helm/stable/debian/ \
all main" \
| sudo tee /etc/apt/sources.list.d/helm-stable-debian.list

Cài đặt Helm:

sudo apt update
sudo apt install -y helm

Kiểm tra:

helm version

5. Clone source code Google Online Boutique

Nếu đã clone repository trong Chapter 5B, chuyển đến thư mục source code:

cd microservices-demo

Nếu chưa clone:

git clone https://github.com/GoogleCloudPlatform/microservices-demo.git
cd microservices-demo

Kiểm tra source code:

ls

Bạn sẽ thấy các thư mục tương tự:

README.md
src
release
helm-chart
protos
terraform

Kiểm tra Helm chart:

ls -la helm-chart

Một Helm chart thông thường sẽ có cấu trúc tương tự:

helm-chart/
├── Chart.yaml
├── values.yaml
└── templates/

Kiểm tra các file:

find helm-chart -maxdepth 2 -type f

6. Kiểm tra deployment hiện tại từ Chapter 5B

Ở Chapter 5B, ứng dụng được triển khai bằng Kubernetes manifest.

Kiểm tra các Deployment:

kubectl get deployments \
  -n online-boutique

Kiểm tra các Pod:

kubectl get pods \
  -n online-boutique

Kiểm tra các Service:

kubectl get services \
  -n online-boutique

Kiểm tra frontend:

kubectl get service frontend \
  -n online-boutique

Nếu frontend đang chạy, bạn có thể thấy:

NAME       TYPE           EXTERNAL-IP
frontend   LoadBalancer   xxx.elb.amazonaws.com

Lưu ý lại địa chỉ frontend:

export FRONTEND_URL=$(kubectl get service frontend \
  -n online-boutique \
  -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

Kiểm tra:

echo "$FRONTEND_URL"

7. Xóa deployment cũ bằng manifest

Trước khi triển khai bằng Helm, cần xóa resources được tạo bởi manifest ở Chapter 5B.

Không xóa EKS cluster. Chỉ xóa các resource của Online Boutique.

Chạy:

kubectl delete \
  -f release/kubernetes-manifests.yaml \
  -n online-boutique

Kiểm tra:

kubectl get all \
  -n online-boutique

Nếu namespace không còn resource của Online Boutique, chúng ta có thể tiếp tục.

Kiểm tra lại namespace:

kubectl get namespace online-boutique

Nếu namespace đã bị xóa trong quá trình cleanup trước đó, tạo lại:

kubectl create namespace online-boutique

8. Kiểm tra Helm chart

Di chuyển về thư mục gốc của repository:

cd microservices-demo

Kiểm tra thông tin chart:

helm show chart ./helm-chart

Kiểm tra file cấu hình mặc định:

helm show values ./helm-chart

Lưu cấu hình mặc định vào file để dễ đọc:

helm show values ./helm-chart \
  > /tmp/online-boutique-values.yaml

Mở file:

less /tmp/online-boutique-values.yaml

Tìm các cấu hình liên quan đến image:

grep -n "image" /tmp/online-boutique-values.yaml

Tìm các cấu hình liên quan đến replica:

grep -n -i "replica" /tmp/online-boutique-values.yaml

Tìm cấu hình frontend:

grep -n -i "frontend" /tmp/online-boutique-values.yaml

Tên các field trong values.yaml có thể thay đổi theo phiên bản repository. Vì vậy, cần kiểm tra file thực tế trước khi override cấu hình.


9. Kiểm tra Helm chart bằng helm lint

Chạy:

helm lint ./helm-chart

Kết quả thành công sẽ tương tự:

==> Linting ./helm-chart
1 chart(s) linted, 0 chart(s) failed

Nếu có lỗi, đọc thông báo và sửa chart trước khi deploy.


10. Render manifest bằng Helm

Trước khi cài đặt thật, sử dụng helm template để xem Helm sẽ tạo ra những Kubernetes resources nào.

helm template online-boutique ./helm-chart \
  --namespace online-boutique

Lưu kết quả ra file:

helm template online-boutique ./helm-chart \
  --namespace online-boutique \
  > /tmp/online-boutique-rendered.yaml

Kiểm tra các loại resource:

grep '^kind:' /tmp/online-boutique-rendered.yaml

Kiểm tra các Deployment:

grep -n 'kind: Deployment' \
  /tmp/online-boutique-rendered.yaml

Kiểm tra các Service:

grep -n 'kind: Service' \
  /tmp/online-boutique-rendered.yaml

Kiểm tra image:

grep -n 'image:' \
  /tmp/online-boutique-rendered.yaml

Ở bước này, Helm chưa tạo resource trên EKS. Lệnh helm template chỉ render YAML.


11. Deploy Online Boutique bằng Helm

11.1. Cài đặt Helm release

Chạy:

helm install online-boutique ./helm-chart \
  --namespace online-boutique \
  --create-namespace

Trong đó:

online-boutique       Tên Helm release
./helm-chart          Đường dẫn Helm chart
--namespace           Namespace triển khai
--create-namespace    Tạo namespace nếu chưa tồn tại

Kiểm tra Helm release:

helm list \
  --namespace online-boutique

Kết quả tương tự:

NAME             NAMESPACE          STATUS
online-boutique  online-boutique    deployed

11.2. Kiểm tra trạng thái Helm release

helm status online-boutique \
  --namespace online-boutique

Kết quả cần có:

STATUS: deployed

12. Kiểm tra các Kubernetes resources

12.1. Kiểm tra Deployment

kubectl get deployments \
  -n online-boutique

Theo dõi rollout:

kubectl rollout status deployment/frontend \
  -n online-boutique

12.2. Kiểm tra Pod

kubectl get pods \
  -n online-boutique

Theo dõi realtime:

kubectl get pods \
  -n online-boutique \
  -w

Dừng theo dõi:

Ctrl + C

Các Pod cần chuyển sang trạng thái:

Running

Nếu Pod không chạy:

kubectl describe pod <POD_NAME> \
  -n online-boutique

Xem logs frontend:

kubectl logs deployment/frontend \
  -n online-boutique

12.3. Kiểm tra Service

kubectl get services \
  -n online-boutique

Kiểm tra frontend:

kubectl get service frontend \
  -n online-boutique

Frontend cần có:

TYPE: LoadBalancer

Các microservice nội bộ thường có:

TYPE: ClusterIP

13. Lấy địa chỉ truy cập frontend

Ban đầu, AWS Load Balancer có thể đang ở trạng thái:

EXTERNAL-IP: <pending>

Theo dõi:

kubectl get service frontend \
  -n online-boutique \
  -w

Khi Load Balancer được tạo xong, lấy hostname:

export FRONTEND_URL=$(kubectl get service frontend \
  -n online-boutique \
  -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

Kiểm tra:

echo "$FRONTEND_URL"

Test bằng curl:

curl -I "http://$FRONTEND_URL"

Kết quả mong đợi:

HTTP/1.1 200 OK

Mở trình duyệt:

http://<EXTERNAL-HOSTNAME>

14. Kiểm tra Helm release đã quản lý resources

Liệt kê các resource thuộc Helm release:

kubectl get all \
  -n online-boutique \
  -l app.kubernetes.io/managed-by=Helm

Xem thông tin Helm release:

helm get all online-boutique \
  --namespace online-boutique

Xem values đang được sử dụng:

helm get values online-boutique \
  --namespace online-boutique

Xem toàn bộ values, bao gồm cả giá trị mặc định:

helm get values online-boutique \
  --namespace online-boutique \
  --all

Xem manifest mà Helm đã triển khai:

helm get manifest online-boutique \
  --namespace online-boutique

15. Tạo file cấu hình riêng cho lab

Không nên sửa trực tiếp file values.yaml gốc của repository.

Tạo file override riêng:

mkdir -p helm-overrides
touch helm-overrides/lab-values.yaml

Mở file:

nano helm-overrides/lab-values.yaml

Nội dung file sẽ phụ thuộc vào cấu trúc thực tế của helm-chart/values.yaml.

Ví dụ, nếu chart hỗ trợ cấu hình replicas theo dạng sau:

frontend:
  replicaCount: 2

cartservice:
  replicaCount: 2

thì file override có thể là:

frontend:
  replicaCount: 2

cartservice:
  replicaCount: 2

Chỉ sử dụng các field thực sự tồn tại trong chart. Kiểm tra helm show values ./helm-chart trước khi thêm cấu hình.


16. Kiểm tra cấu hình override trước khi upgrade

Sử dụng helm template với file override:

helm template online-boutique ./helm-chart \
  --namespace online-boutique \
  -f helm-overrides/lab-values.yaml \
  > /tmp/online-boutique-custom.yaml

Kiểm tra cấu hình replicas:

grep -n -A3 -B3 "replicas:" \
  /tmp/online-boutique-custom.yaml

Nếu manifest render đúng, tiếp tục thực hiện upgrade.


17. Thực hiện Helm upgrade

Chạy:

helm upgrade online-boutique ./helm-chart \
  --namespace online-boutique \
  -f helm-overrides/lab-values.yaml

Kiểm tra trạng thái:

helm status online-boutique \
  --namespace online-boutique

Kiểm tra Deployment:

kubectl get deployments \
  -n online-boutique

Kiểm tra Pod:

kubectl get pods \
  -n online-boutique

Kiểm tra rollout frontend:

kubectl rollout status deployment/frontend \
  -n online-boutique

18. Kiểm tra Helm history

Helm lưu lại lịch sử các lần cài đặt và upgrade.

Chạy:

helm history online-boutique \
  --namespace online-boutique

Kết quả tương tự:

REVISION  STATUS       DESCRIPTION
1         superseded   Install complete
2         deployed     Upgrade complete

Lấy revision hiện tại:

helm list \
  --namespace online-boutique

19. Thử rollback Helm release

Nếu phiên bản mới có vấn đề, có thể rollback về revision trước đó.

Trước tiên xem history:

helm history online-boutique \
  --namespace online-boutique

Rollback về revision 1:

helm rollback online-boutique 1 \
  --namespace online-boutique

Kiểm tra trạng thái:

helm status online-boutique \
  --namespace online-boutique

Kiểm tra rollout:

kubectl rollout status deployment/frontend \
  -n online-boutique

Kiểm tra các Pod:

kubectl get pods \
  -n online-boutique

Kiểm tra lại frontend:

kubectl get service frontend \
  -n online-boutique

20. Kiểm tra giao tiếp giữa các microservice

Kiểm tra các Service:

kubectl get services \
  -n online-boutique

Ví dụ các service nội bộ:

cartservice
productcatalogservice
checkoutservice
paymentservice
shippingservice

Kubernetes cung cấp DNS nội bộ cho các Service.

Ví dụ:

cartservice:7070
productcatalogservice:3550
checkoutservice:5050

Kiểm tra Endpoint:

kubectl get endpoints \
  -n online-boutique

Hoặc:

kubectl get endpointslices \
  -n online-boutique

Kiểm tra logs frontend:

kubectl logs deployment/frontend \
  -n online-boutique \
  --tail=100

Nếu giao diện hiển thị được sản phẩm, giỏ hàng và checkout, các microservice chính đang giao tiếp thành công.


21. So sánh cách triển khai trước và sau Helm

Trước Chapter 5D

Kubernetes Manifest
        ↓
kubectl apply
        ↓
Amazon EKS

Thay đổi cấu hình:

Sửa YAML thủ công
        ↓
kubectl apply

Sau Chapter 5D

Helm Chart
    +
values.yaml
        ↓
helm install / helm upgrade
        ↓
Amazon EKS

Rollback:

helm rollback

Kiểm tra lịch sử:

helm history

Xem cấu hình:

helm get values

22. Xóa Helm release

Nếu chỉ muốn xóa Online Boutique nhưng giữ lại EKS cluster:

helm uninstall online-boutique \
  --namespace online-boutique

Kiểm tra:

helm list \
  --namespace online-boutique

Kiểm tra các resource:

kubectl get all \
  -n online-boutique

Nếu không còn sử dụng namespace:

kubectl delete namespace online-boutique

Không chạy bước này nếu bạn muốn tiếp tục Chapter 5E hoặc Chapter 5F trên cùng namespace.


23. Cleanup toàn bộ EKS cluster

Nếu không cần sử dụng EKS cluster nữa, quay lại phần cleanup của Chapter 5B.

Đặt lại biến:

export AWS_REGION=ap-northeast-1
export CLUSTER_NAME=online-boutique-eks

Xóa cluster:

eksctl delete cluster \
  --name "$CLUSTER_NAME" \
  --region "$AWS_REGION"

Kiểm tra:

eksctl get cluster \
  --region "$AWS_REGION"

Ngoài EKS Console, cần kiểm tra thêm:

  • EC2.
  • Load Balancers.
  • Auto Scaling Groups.
  • CloudFormation.
  • VPC.
  • NAT Gateway.
  • Elastic IP.

Đặc biệt, cần kiểm tra NAT Gateway, vì tài nguyên này có thể tiếp tục phát sinh chi phí.


24. Kết quả đạt được

Sau Chapter 5B:

Amazon EKS
    └── kubectl apply
          └── Online Boutique

Sau Chapter 5D:

Amazon EKS
    └── Helm Release
          ├── Helm Chart
          ├── values.yaml
          ├── Deployments
          ├── Services
          └── Online Boutique

Chúng ta đã có thể:

  • Đóng gói deployment bằng Helm.
  • Render manifest trước khi triển khai.
  • Cài đặt application bằng helm install.
  • Cập nhật bằng helm upgrade.
  • Theo dõi lịch sử bằng helm history.
  • Rollback bằng helm rollback.
  • Tách cấu hình khỏi Helm chart gốc.
  • Quản lý nhiều microservice bằng một Helm release.

25. Kiến trúc kết thúc Chapter 5D

Developer
    │
    ▼
GitHub
    │
    ▼
Helm Chart
    │
    ├── Chart.yaml
    ├── values.yaml
    └── templates/
    │
    ▼
helm install / helm upgrade
    │
    ▼
Amazon EKS
    │
    ├── frontend
    ├── cartservice
    ├── checkoutservice
    ├── paymentservice
    ├── productcatalogservice
    ├── recommendationservice
    ├── shippingservice
    └── Các microservice khác

Ở Chapter tiếp theo, chúng ta sẽ tiếp tục chuyển từ:

Developer
    ↓
helm upgrade
    ↓
EKS

sang:

Developer
    ↓
GitHub
    ↓
GitOps Repository
    ↓
Argo CD
    ↓
Amazon EKS

Đó sẽ là bước đầu tiên để xây dựng GitOps Platform cho Online Boutique.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí