Triển khai liên tục cho Google Kubernetes Engine (GKE) bằng Cloud Build

1. Tổng quan

Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách thiết lập quy trình phân phối liên tục cho GKE bằng Cloud Build. Phòng thí nghiệm này nêu bật cách kích hoạt các công việc trong Cloud Build cho nhiều sự kiện git, cũng như một mẫu đơn giản cho các bản phát hành canary tự động trong GKE.

Bạn cần hoàn tất các bước sau:

  • Tạo ứng dụng GKE
  • Tự động hoá quy trình triển khai cho các nhánh git
  • Tự động hoá quy trình triển khai cho nhánh git main
  • Tự động hoá quy trình triển khai thẻ git

2. Trước khi bắt đầu

Để xem hướng dẫn tham khảo này, bạn cần có một dự án trên Google Cloud. Bạn có thể tạo dự án mới hoặc chọn dự án mà bạn đã tạo:

  1. Chọn hoặc tạo một dự án trên Google Cloud.

CHUYỂN ĐẾN TRANG CHỌN DỰ ÁN

  1. Bật tính năng thanh toán cho dự án của bạn.

BẬT TÍNH NĂNG THANH TOÁN

3. Chuẩn bị môi trường

  1. Tạo các biến môi trường để sử dụng trong suốt hướng dẫn này:
    export PROJECT_ID=$(gcloud config get-value project)
    export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
    
    export ZONE=us-central1-b
    export CLUSTER=gke-progression-cluster
    export APP_NAME=myapp
    
  2. Bật các API sau:
    • Trình quản lý tài nguyên
    • GKE
    • Cloud Source Repositories
    • Cloud Build
    • Container Registry
    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        container.googleapis.com \
        sourcerepo.googleapis.com \
        cloudbuild.googleapis.com \
        containerregistry.googleapis.com \
        --async
    
  3. Sao chép nguồn mẫu và chuyển sang thư mục phòng thí nghiệm:
    git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git gke-progression
    
    cd gke-progression/labs/gke-progression
    rm -rf ../../.git
    
  4. Thay thế các giá trị phần giữ chỗ trong kho lưu trữ mẫu bằng PROJECT_ID:Trong bước này, bạn sẽ tạo các thực thể của nhiều tệp cấu hình dành riêng cho môi trường hiện tại.Để xem một ví dụ về các mẫu đang được cập nhật, hãy chạy lệnh sau.
    cat k8s/deployments/dev/frontend-dev.yaml.tmpl
    
    Thực hiện việc thay thế biến bằng cách thực thi lệnh theo dõi.
    for template in $(find . -name '*.tmpl'); do envsubst '${PROJECT_ID} ${ZONE} ${CLUSTER} ${APP_NAME}' < ${template} > ${template%.*}; done
    
    Để xem ví dụ về tệp sau khi thay thế, hãy chạy lệnh sau.
    cat k8s/deployments/dev/frontend-dev.yaml
    
  5. Nếu trước đây bạn chưa sử dụng Git trong Cloud Shell, hãy đặt các giá trị user.nameuser.email mà bạn muốn dùng:
    git config --global user.email "YOUR_EMAIL_ADDRESS"
    git config --global user.name "YOUR_USERNAME"
    
  6. Lưu trữ mã từ kho lưu trữ mẫu trong Cloud Source Repositories:
    gcloud source repos create gke-progression
    git init
    git config credential.helper gcloud.sh
    git remote add gcp https://source.developers.google.com/p/$PROJECT_ID/r/gke-progression
    git branch -m main
    git add . && git commit -m "initial commit"
    git push gcp main
    
  7. Tạo cụm GKE.
    gcloud container clusters create ${CLUSTER} \
        --project=${PROJECT_ID} \
        --zone=${ZONE}
    
  8. Cấp quyền cho Cloud Build cho cụm của bạn.Cloud Build sẽ triển khai ứng dụng này cho cụm GKE của bạn và sẽ cần có quyền để thực hiện việc này.
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
        --role=roles/container.developer
    

Môi trường của bạn đã sẵn sàng!

4. Tạo ứng dụng GKE

Trong phần này, bạn sẽ xây dựng và triển khai ứng dụng chính thức mà bạn sử dụng trong suốt hướng dẫn này.

  1. Tạo ứng dụng bằng Cloud Build:
    gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
    
  2. Triển khai theo cách thủ công cho môi trường Canary và Phiên bản chính thức:Tạo các phiên bản triển khai và dịch vụ phát hành công khai và canary bằng lệnh kubectl apply.
    kubectl create ns production
    kubectl apply -f k8s/deployments/prod -n production
    kubectl apply -f k8s/deployments/canary -n production
    kubectl apply -f k8s/services -n production
    
    Dịch vụ được triển khai tại đây sẽ định tuyến lưu lượng truy cập tới cả phiên bản triển khai canary và thực tế.
  3. Xem xét số lượng nhóm đang chạy Xác nhận rằng bạn có 4 nhóm đang chạy cho giao diện người dùng, bao gồm 3 nhóm cho lưu lượng truy cập chính thức và 1 cho bản phát hành canary. Tức là những thay đổi đối với bản phát hành canary của bạn sẽ chỉ ảnh hưởng đến 1/4 (25%) người dùng.
    kubectl get pods -n production -l app=$APP_NAME -l role=frontend
    
  4. Truy xuất địa chỉ IP ngoài cho các dịch vụ sản xuất.
    kubectl get service $APP_NAME -n production
    
    Sau khi trình cân bằng tải trả về địa chỉ IP, hãy tiếp tục chuyển sang bước tiếp theo
  5. Lưu trữ IP ngoài để sử dụng sau này.
    export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=production services $APP_NAME)
    
  6. Xem lại ứng dụng Kiểm tra kết quả phiên bản của dịch vụ. Tệp này cần có nội dung Hello World v1.0
    curl http://$PRODUCTION_IP
    

Xin chúc mừng! Bạn đã triển khai ứng dụng mẫu! Tiếp theo, bạn sẽ thiết lập trình kích hoạt để liên tục triển khai các thay đổi của mình.

5. Tự động hoá quy trình triển khai cho các nhánh git

Trong phần này, bạn sẽ thiết lập một điều kiện kích hoạt giúp thực thi công việc Cloudbuild trên cam kết của bất kỳ nhánh nào không phải main. Tệp Cloud Build được dùng ở đây sẽ tự động tạo một không gian tên và triển khai cho mọi nhánh hiện có hoặc mới, cho phép nhà phát triển xem trước mã của mình trước khi tích hợp với nhánh chính.

  1. Thiết lập điều kiện kích hoạt:Thành phần chính của điều kiện kích hoạt này là sử dụng tham số branchName để khớp main và tham số invertRegex (được đặt thành true và thay đổi mẫu branchName để khớp với bất kỳ giá trị nào không phải là main). Để tham khảo, bạn có thể tìm các dòng sau trong build/branch-trigger.json.
      "branchName": "main",
      "invertRegex": true
    
    Ngoài ra, vài dòng cuối của tệp Cloud Build được dùng với điều kiện kích hoạt này sẽ tạo một không gian tên được đặt tên theo nhánh đã kích hoạt công việc, sau đó triển khai ứng dụng và dịch vụ trong không gian tên mới. Để tiện tham khảo, bạn có thể tìm những dòng sau trong build/branch-cloudbuild.yaml
      kubectl get ns ${BRANCH_NAME} || kubectl create ns ${BRANCH_NAME}
      kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/deployments/dev
      kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/services
    
    Giờ bạn đã hiểu các cơ chế đang được sử dụng, hãy tạo điều kiện kích hoạt bằng lệnh gcloud bên dưới.
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/branch-trigger.json
    
  2. Để xem xét điều kiện kích hoạt, hãy chuyển đến trang Điều kiện kích hoạt của Cloud Build trong Console.Chuyển đến phần Điều kiện kích hoạt
  3. Tạo một nhánh mới:
    git checkout -b new-feature-1
    
  4. Sửa đổi mã để cho biết phiên bản 1.1Edit src/app.py và thay đổi phản hồi từ 1.0 thành 1.1
    @app.route('/')
    def hello_world():
        return 'Hello World v1.1'
    
  5. Xác nhận thay đổi và đẩy đến kho lưu trữ từ xa:
    git add . && git commit -m "updated" && git push gcp new-feature-1
    
  6. Để xem quá trình tạo bản dựng đang diễn ra, hãy truy cập trang Nhật ký bản dựng trên đám mây trong Console.Chuyển đến Bản dựngSau khi quá trình tạo bản dựng hoàn tất, tiếp tục chuyển sang bước tiếp theo
  7. Truy xuất địa chỉ IP ngoài cho dịch vụ nhánh mới triển khai.
    kubectl get service $APP_NAME -n new-feature-1
    
    Sau khi trình cân bằng tải trả về địa chỉ IP, hãy tiếp tục chuyển sang bước tiếp theo
  8. Lưu trữ IP ngoài để sử dụng sau này.
    export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}"  --namespace=new-feature-1 services $APP_NAME)
    
  9. Xem lại ứng dụngKiểm tra kết quả phiên bản của dịch vụ. Tệp này cần có nội dung Hello World v1.0
    curl http://$BRANCH_IP
    

6. Tự động hoá việc triển khai cho nhánh git main

Trước khi phát hành mã cho phiên bản chính thức, chúng ta thường phát hành mã cho một nhóm nhỏ lưu lượng truy cập trực tiếp trước khi di chuyển tất cả lưu lượng truy cập sang cơ sở mã mới.

Trong phần này, bạn triển khai một điều kiện kích hoạt được kích hoạt khi mã được cam kết với nhánh main. Trình kích hoạt này triển khai quá trình triển khai canary nhận 25% tất cả lưu lượng truy cập trực tiếp cho bản sửa đổi mới.

  1. Thiết lập điều kiện kích hoạt cho nhánh main:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/main-trigger.json
    
  2. Để xem xét điều kiện kích hoạt mới, hãy chuyển đến trang Điều kiện kích hoạt của Cloud Build trong Console.Chuyển đến phần Điều kiện kích hoạt
  3. Hợp nhất nhánh với dòng chính và đẩy đến kho lưu trữ từ xa:
    git checkout main
    git merge new-feature-1
    git push gcp main
    
  4. Để xem quá trình tạo bản dựng đang diễn ra, hãy truy cập trang Nhật ký bản dựng trên đám mây trong Console.Chuyển đến Bản dựngSau khi tạo xong bản dựng, tiếp tục chuyển sang bước tiếp theo
  5. Xem xét nhiều phản hồi của serverRun sau đây và lưu ý rằng khoảng 25% phản hồi đang cho thấy phản hồi mới của ứng dụng Hello World v1.1
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    Khi bạn đã sẵn sàng tiếp tục, hãy nhấn Ctrl+c để thoát khỏi vòng lặp.

7. Tự động hoá quy trình triển khai cho thẻ git

Sau khi quá trình triển khai canary được xác thực với một nhóm nhỏ lưu lượng truy cập, bạn phát hành phiên bản triển khai cho phần còn lại của lưu lượng truy cập trực tiếp.

Trong phần này, bạn cần thiết lập một điều kiện kích hoạt. Trình kích hoạt này sẽ được kích hoạt khi bạn tạo thẻ trong kho lưu trữ. Trình kích hoạt sẽ gắn nhãn hình ảnh bằng thẻ phù hợp, sau đó triển khai nội dung cập nhật cho sản phẩm để đảm bảo 100% lưu lượng truy cập đang truy cập vào hình ảnh được gắn thẻ.

  1. Thiết lập trình kích hoạt thẻ:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/tag-trigger.json
    
  2. Để xem xét điều kiện kích hoạt mới, hãy chuyển đến trang Điều kiện kích hoạt của Cloud Build trong Console.Chuyển đến phần Điều kiện kích hoạt
  3. Tạo thẻ mới và đẩy vào kho lưu trữ từ xa:
    git tag 1.1
    git push gcp 1.1
    
  4. Để xem quá trình tạo bản dựng đang diễn ra, hãy truy cập trang Nhật ký bản dựng trên đám mây trong Console.Chuyển đến Bản dựng
  5. Xem xét nhiều phản hồi của máy chủChạy lệnh sau và lưu ý rằng 100% phản hồi đều cho thấy phản hồi mới của Hello World v1.1Quá trình này có thể mất chút thời gian vì các nhóm mới được triển khai và kiểm tra tình trạng trong GKE
    while true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1;  done
    
    Khi bạn đã sẵn sàng tiếp tục, nhấn Ctrl+c để thoát khỏi vòng lặp.Xin chúc mừng! Bạn đã tạo điều kiện kích hoạt CI/CD trong Cloud Build cho các nhánh và thẻ để triển khai ứng dụng cho GKE.

8. Dọn dẹp

Xoá dự án

  1. Trong Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
  2. Trong danh sách dự án, hãy chọn dự án mà bạn muốn xoá, sau đó nhấp vào Delete (Xoá).
  3. Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.