Tìm hiểu về Skaffold

1. Mục tiêu

Skaffold là một công cụ giúp xử lý quy trình xây dựng, đẩy và triển khai ứng dụng của bạn. Bạn có thể sử dụng Skaffold để dễ dàng định cấu hình không gian làm việc phát triển cục bộ, đơn giản hoá vòng lặp phát triển bên trong và tích hợp với các công cụ khác như KustomizeHelm để giúp quản lý các tệp kê khai Kubernetes của bạn.

Trong hướng dẫn này, bạn tìm hiểu một số khái niệm chính về Skaffold, sử dụng nó để tự động hoá vòng lặp phát triển nội bộ, sau đó triển khai ứng dụng.

Bạn sẽ:

  • Định cấu hình và bật Skaffold để phát triển cục bộ
  • Tạo và chạy một ứng dụng golang đơn giản
  • Quản lý hoạt động triển khai ứng dụng cục bộ bằng Skaffold
  • Kết xuất tệp kê khai và triển khai ứng dụng

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

Chuẩn bị không gian làm việc

  1. Mở trình chỉnh sửa Cloud Shell bằng cách truy cập vào url sau:
https://shell.cloud.google.com

Cho phép cookie của bên thứ ba. Nhấp vào "Trang web không hoạt động" rồi "Allow Cookie" (Cho phép cookie).

7b702066a2135a3d.png.

3394f82132eb4fd4.pngS

  1. Nếu bạn chưa thực hiện thao tác này, trong cửa sổ dòng lệnh, hãy sao chép nguồn ứng dụng bằng lệnh sau:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
  1. Chuyển sang thư mục kho lưu trữ được sao chép:
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
  1. Đặt không gian làm việc Cloud Shell của bạn vào thư mục hiện tại bằng cách chạy lệnh sau:
cloudshell workspace .

Đang chuẩn bị dự án

  1. Đảm bảo dự án của bạn trên Google Cloud được thiết lập chính xác bằng cách chạy lệnh sau:
gcloud config set project {{project-id}}

3. Bắt đầu sử dụng Skaffold

  1. Chạy lệnh sau để tạo tệp cấu hình Skaffold cấp cao nhất, skaffold.yaml:
cat <<EOF > skaffold.yaml
apiVersion: skaffold/v2beta21
kind: Config
metadata:
  name: getting-started-kustomize
build:
  tagPolicy:
    gitCommit:
      ignoreChanges: true
  artifacts:
  - image: skaffold-kustomize
    context: app
    docker:
      dockerfile: Dockerfile
deploy:
  kustomize:
    paths:
    - overlays/dev
profiles:
- name: staging
  deploy:
    kustomize:
      paths:
      - overlays/staging
- name: prod
  deploy:
    kustomize:
      paths:
      - overlays/prod
EOF
  1. Mở tệp skaffold.yaml trong ngăn IDE. Đây là tệp cấu hình cấp cao nhất xác định quy trình Skaffold.

Hãy lưu ý định dạng YAML giống như Kubernetes và các phần sau trong YAML:

  • build
  • deploy
  • profiles

Các phần này sẽ xác định cách xây dựng và triển khai ứng dụng, cũng như hồ sơ cho từng mục tiêu triển khai.

Bạn có thể đọc thêm về danh sách đầy đủ các giai đoạn Skaffold trong tài liệu về Giai đoạn quy trình Skaffold.

4. Tạo

Phần build chứa cấu hình xác định cách xây dựng ứng dụng. Trong trường hợp này, bạn có thể xem cấu hình về cách xử lý thẻ git, cũng như phần artifacts xác định hình ảnh vùng chứa bao gồm ứng dụng.

Ngoài ra, trong phần này, bạn có thể xem thông tin tham chiếu đến Dockerfile sẽ được dùng để tạo hình ảnh. Skaffold cũng hỗ trợ các công cụ xây dựng khác như Jib, Maven, Gradle, Buildpacks, Bazel dựa trên nền tảng đám mây và các tập lệnh tuỳ chỉnh. Bạn có thể đọc thêm về cấu hình này trong tài liệu về Bản dựng SKAdNetwork.

5. Triển khai

Phần deploy chứa cấu hình xác định cách triển khai ứng dụng. Trong trường hợp này, bạn có thể xem ví dụ về quy trình triển khai mặc định, trong đó định cấu hình Skaffold để sử dụng công cụ Kustomize.

Công cụ Kustomize cung cấp chức năng tạo tệp kê khai Kubernetes bằng cách kết hợp một tập hợp các tệp YAML thành phần phổ biến (trong thư mục base) với một hoặc nhiều "lớp phủ" thường tương ứng với một hoặc nhiều mục tiêu triển khai – thường là nhà phát triển, kiểm thử, chạy thửchính thức hoặc tương tự.

Trong ví dụ này, bạn có thể thấy hai lớp phủ cho ba mục tiêu là dev, stagingprod. Lớp phủ dev sẽ được dùng trong quá trình phát triển cục bộ, cũng như lớp phủ chạy thửsản phẩm khi triển khai bằng Skaffold.

6. Hồ sơ

Phần profiles chứa cấu hình xác định các cấu hình bản dựng, kiểm thử và triển khai cho nhiều ngữ cảnh. Các ngữ cảnh khác nhau thường là các môi trường khác nhau trong quy trình triển khai ứng dụng của bạn, như staging hoặc prod trong ví dụ này. Điều này có nghĩa là bạn có thể dễ dàng quản lý các tệp kê khai có nội dung cần khác nhau cho các môi trường mục tiêu khác nhau mà không cần lặp lại cấu hình nguyên mẫu.

Cấu hình trong phần profiles có thể thay thế hoặc vá bất kỳ mục nào từ cấu hình chính (ví dụ: các phần build, test hoặc deploy).

Ví dụ: mở tệp overlays > prod > deployment.yaml. Lưu ý rằng số lượng bản sao của ứng dụng được định cấu hình ở đây là 3 bản, ghi đè cấu hình cơ sở.

  1. Mở tệp app > main.go sau đây trong ngăn IDE. Đây là một ứng dụng golang đơn giản, ghi một chuỗi vào stdout mỗi giây.
  2. Lưu ý rằng ứng dụng cũng xuất ra tên của nhóm Kubernetes mà ứng dụng đang chạy.

Xem Dockerfile

  1. Mở tệp app > Dockerfile trong ngăn IDE. Tệp này chứa một chuỗi các lệnh để tạo hình ảnh vùng chứa ứng dụng cho tệp main.go và được tham chiếu trong tệp skaffold.yaml cấp cao nhất.

7. Phát triển bằng Skaffold

Định cấu hình môi trường Kubernetes

  1. Chạy lệnh sau để đảm bảo cụm Kubernetes cục bộ của bạn đang chạy và được định cấu hình:
minikube start

Quá trình này có thể mất vài phút. Bạn sẽ thấy kết quả sau đây nếu cụm đã khởi động thành công:

Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  1. Chạy lệnh sau để tạo không gian tên Kubernetes cho dev, stagingprod:
kubectl apply -f namespaces.yaml

Bạn sẽ thấy kết quả sau đây:

namespace/dev created
namespace/staging created
namespace/prod created

Dùng Skaffold để phát triển cục bộ

  1. Chạy lệnh sau để xây dựng ứng dụng và triển khai ứng dụng cho một cụm Kubernetes cục bộ đang chạy trong Cloud Shell:
skaffold dev

Bạn sẽ thấy quá trình xây dựng vùng chứa ứng dụng chạy (có thể mất vài phút), sau đó ứng dụng đầu ra lặp lại mỗi giây:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-dev-xxxxxxxxx-xxxxx

Xin lưu ý rằng tên nhóm chính xác sẽ khác với kết quả chung nêu trên.

Thay đổi đơn đăng ký

Hiện tại, ứng dụng đang chạy trong cụm Kubernetes cục bộ, bạn có thể thay đổi mã và Skaffold sẽ tự động tạo lại và triển khai lại ứng dụng cho cụm.

  1. Mở tệp app > main.go trong ngăn IDE rồi thay đổi chuỗi đầu ra:
"Hello world from pod %s!\n"

đến:

"Hello Skaffold world from pod %s!\n"

Khi đã thay đổi, bạn sẽ thấy Skaffold tạo lại hình ảnh và triển khai lại hình ảnh đó cho cụm đồng hồ, với sự thay đổi về đầu ra hiển thị trong cửa sổ dòng lệnh.

  1. Giờ đây, cũng trong tệp "app > main.go&quot; trong ngăn IDE, hãy thay đổi dòng:
time.Sleep(time.Second * 1)

tới

time.Sleep(time.Second * 10)

Một lần nữa, bạn sẽ thấy ứng dụng được xây dựng lại và triển khai lại, với dòng đầu ra xuất hiện 10 giây một lần.

Thay đổi cấu hình Kubernetes

Tiếp theo, bạn sẽ thay đổi cấu hình Kubernetes và một lần nữa Skaffold sẽ tự động triển khai lại.

  1. Mở tệp base > deployment.yaml trong IDE rồi thay đổi dòng:
replicas: 1

tới

replicas: 2

Sau khi triển khai lại ứng dụng, bạn sẽ thấy hai nhóm đang chạy – mỗi nhóm sẽ có một tên khác nhau.

  1. Bây giờ, hãy thay đổi chính dòng này trong tệp base > deployment.yaml thành:
replicas: 1

Bạn sẽ thấy một trong các nhóm bị xóa khỏi dịch vụ và chỉ còn một nhóm.

  1. Cuối cùng, hãy nhấn Ctrl-C trong cửa sổ dòng lệnh để dừng quá trình phát triển cục bộ Skaffold.

Cắt một bản phát hành

Tiếp theo, bạn sẽ tạo một bản phát hành bằng cách tạo hình ảnh bản phát hành rồi triển khai hình ảnh đó trên một cụm.

  1. Chạy lệnh sau để tạo bản phát hành:
skaffold build --file-output artifacts.json

Lệnh này sẽ tạo hình ảnh hoàn thiện (nếu cần) và xuất thông tin chi tiết về bản phát hành sang tệp artifacts.json.

Nếu bạn muốn sử dụng một công cụ như Cloud Deploy để triển khai cho các cụm của mình, thì tệp này sẽ chứa thông tin phát hành. Tức là(các) cấu phần phần mềm đó là không thể thay đổi trong quá trình hoạt động.

  1. Chạy lệnh sau để xem nội dung của tệp artifacts.json:
cat artifacts.json | jq

Lưu ý rằng tệp này chứa tham chiếu đến hình ảnh sẽ được dùng trong lần triển khai cuối cùng.

Triển khai vào giai đoạn thử nghiệm

  1. Chạy lệnh sau để triển khai bản phát hành bằng cấu hình staging:
skaffold deploy --profile staging --build-artifacts artifacts.json --tail

Sau khi triển khai xong, bạn sẽ thấy kết quả từ hai nhóm tương tự như sau:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. Nhấn Ctrl-C trong cửa sổ dòng lệnh để dừng kết quả Skaffold.
  2. Chạy lệnh sau để quan sát quá trình ứng dụng của bạn đang hoạt động và đang chạy trong cụm:
kubectl get all --namespace staging

Bạn sẽ thấy 2 tên nhóm riêng biệt vì hồ sơ staging của ứng dụng chỉ định rằng phải có 2 bản sao trong quá trình triển khai.

Triển khai vào giai đoạn sản xuất

  1. Bây giờ, hãy chạy lệnh sau để triển khai bản phát hành bằng cấu hình prod:
skaffold deploy --profile prod --build-artifacts artifacts.json --tail

Sau khi triển khai xong, bạn sẽ thấy kết quả từ 3 nhóm tương tự như sau:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
  1. Nhấn Ctrl-C trong cửa sổ dòng lệnh để dừng kết quả Skaffold.

Bạn sẽ thấy 3 tên nhóm riêng biệt vì hồ sơ prod của ứng dụng chỉ định rằng cần có 3 bản sao trong quá trình triển khai.

  1. Chạy lệnh sau để quan sát quá trình ứng dụng của bạn đang hoạt động và đang chạy trong cụm:
kubectl get all --namespace prod

Bạn sẽ thấy kết quả chứa các dòng tương tự như sau để cho thấy quá trình triển khai sản phẩm:

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/skaffold-kustomize-prod   3/3     3            3           16m

Bạn cũng sẽ thấy 3 nhóm ứng dụng đang chạy.

NAME                                           READY   STATUS    RESTARTS   AGE
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m
pod/skaffold-kustomize-prod-xxxxxxxxxx-xxxxx   1/1     Running   0          10m

8. Xin chúc mừng!

Xin chúc mừng! Bạn đã hoàn thành phòng thí nghiệm Understanding Skaffold và tìm hiểu cách định cấu hình cũng như sử dụng Skaffold để phát triển và triển khai ứng dụng cục bộ.

Bước tiếp theo:

Tiếp tục tìm hiểu thêm về Skaffold:

Dọn dẹp

  1. Chạy lệnh sau để tắt cụm cục bộ:
minikube delete