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

1. Tổng quan

Trong bài tập thực hành này, bạn sẽ tìm hiểu cách thiết lập một quy trình phân phối liên tục cho GKE bằng Cloud Build. Lớp học này nêu bật cách kích hoạt các công việc 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 thử nghiệm tự động trong GKE.

Bạn sẽ 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 chính của git
  • Tự động hoá quy trình triển khai cho thẻ git

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

Để sử dụng 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 một dự án mới hoặc chọn một 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ị giữ chỗ trong kho lưu trữ mẫu bằng PROJECT_ID của bạn:Trong bước này, bạn sẽ tạo các phiên bản của nhiều tệp cấu hình riêng biệt cho môi trường hiện tại.Để xem 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 thay thế biến bằng cách thực thi lệnh sau.
    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 từng sử dụng Git trong Cloud Shell, hãy đặt các giá trị user.nameuser.email mà bạn muốn sử 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 Cloud Build cho cụm của bạn.Cloud Build sẽ triển khai ứng dụng vào Cụm GKE của bạn và cần có quyền để làm như vậ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ẽ tạo và triển khai ứng dụng phát hành công khai ban đầu 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à Production:Tạo các dịch vụ và hoạt động triển khai production và canary bằng cách sử dụng các 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 đến cả bản triển khai canary và bản triển khai prod.
  3. Kiểm tra số lượng nhóm đang chạyXá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 nhóm cho bản phát hành thử nghiệm. Điều này có nghĩa là các thay đổi đối với bản phát hành thử nghiệm chỉ ảnh hưởng đến 1 trong 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 bộ 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 xét ứng dụng Kiểm tra đầu ra phiên bản của dịch vụ. Nội dung sẽ là Hello World phiên bản 1.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 các điều kiện kích hoạt để liên tục triển khai các thay đổi.

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 để thực thi một công việc Cloud Build khi bạn xác nhận mọi nhánh khác ngoà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 nhánh mới, cho phép nhà phát triển xem trước mã của họ 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à việc sử dụng tham số branchName để so khớp main và tham số invertRegex được đặt thành true và thay đổi mẫu branchName để so khớp với mọi thứ không phải là main. Để tham khảo, bạn có thể tìm thấy các dòng sau trong build/branch-trigger.json.
      "branchName": "main",
      "invertRegex": true
    
    Ngoài ra, một vài dòng cuối cùng của tệp Cloud Build được dùng với trình kích hoạt này sẽ tạo một không gian tên được đặt theo tên của 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. Để tham khảo, bạn có thể tìm thấy các 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ờ đây, khi đã hiểu rõ các cơ chế đang được sử dụng, hãy tạo trình 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 Cloud Build trong Bảng điều khiển.Chuyển đế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 v1.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à chuyển đến kho lưu trữ từ xa:
    git add . && git commit -m "updated" && git push gcp new-feature-1
    
  6. Để xem xét bản dựng đang tiến hành, hãy chuyển đến trang Nhật ký Cloud Build trong Bảng điều khiển.Chuyển đến phần Bản dựngSau khi bản dựng hoàn tất, hãy tiếp tục 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 bộ 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ụng. Kiểm tra đầu ra phiên bản của dịch vụ. Nội dung sẽ là Hello World phiên bản 1.0
    curl http://$BRANCH_IP
    

6. Tự động hoá quy trình triển khai cho nhánh chính của git

Trước khi phát hành mã cho bản phát hành công khai, bạn nên phát hành mã cho một nhóm nhỏ lưu lượng truy cập thực 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 sẽ triển khai một trình kích hoạt được kích hoạt khi mã được xác nhận vào nhánh chính. Trình kích hoạt triển khai quy trình triển khai thử nghiệm nhận 25% tổng lưu lượng truy cập trực tiếp đến bản sửa đổi mới.

  1. Thiết lập điều kiện kích hoạt cho nhánh chính:
    gcloud beta builds triggers create cloud-source-repositories \
      --trigger-config build/main-trigger.json
    
  2. Để xem xét trình kích hoạt mới, hãy chuyển đến trang Trình kích hoạt Cloud Build trong Bảng điều khiển.Chuyển đến Trình kích hoạt
  3. Hợp nhất nhánh vào dòng chính và đẩy vào kho lưu trữ từ xa:
    git checkout main
    git merge new-feature-1
    git push gcp main
    
  4. Để xem xét bản dựng đang diễn ra, hãy chuyển đến trang Nhật ký Cloud Build trong Bảng điều khiển.Chuyển đến phần Bản dựngSau khi bản dựng hoàn tất, hãy tiếp tục bước tiếp theo
  5. Xem nhiều phản hồi từ máy chủ Chạy lệnh sau và lưu ý rằng khoảng 25% phản hồi đang hiển thị phản hồi mới của Hello World phiên bản 1.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 xác thực việc triển khai thử nghiệm với một lượng nhỏ lưu lượng truy cập, bạn sẽ phát hành bản triển khai cho phần còn lại của lưu lượng truy cập thực.

Trong phần này, bạn sẽ thiết lập một điều kiện kích hoạt được kích hoạt khi bạn tạo một thẻ trong kho lưu trữ. Trình kích hoạt gắn nhãn hình ảnh bằng thẻ thích hợp, sau đó triển khai các bản cập nhật cho prod để đả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 trình kích hoạt mới, hãy chuyển đến trang Trình kích hoạt Cloud Build trong Bảng điều khiển.Chuyển đến Trình kích hoạt
  3. Tạo thẻ mới và đẩy đến kho lưu trữ từ xa:
    git tag 1.1
    git push gcp 1.1
    
  4. Để xem bản dựng đang tiến hành, hãy chuyển đến trang Cloud Build History (Nhật ký Cloud Build) trong Bảng điều khiển.Chuyển đến phần Builds (Bản dựng)
  5. Xem xét nhiều phản hồi từ máy chủ Chạy lệnh sau và lưu ý rằng 100% phản hồi đang hiển thị phản hồi mới của Hello World phiên bản 1.1 Quá trình này có thể mất 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, hãy nhấn Ctrl+c để thoát khỏi vòng lặp.Xin chúc mừng! Bạn đã tạo các trình kích hoạt CI/CD trong Cloud Build cho các nhánh và thẻ để triển khai ứng dụng của mình lên 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á, rồi nhấp vào 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.