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 nội bộ và tích hợp với các công cụ khác như KustomizeHelm để giúp quản lý tệp kê khai Kubernetes.

Trong hướng dẫn này, bạn sẽ tìm hiểu một số khái niệm cốt lõi của Skaffold, sử dụng công cụ này để tự động hoá vòng lặp phát triển nội bộ, sau đó triển khai một ứ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ý việc 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 nhấp vào "Cho phép cookie".

7b702066a2135a3d.png

3394f82132eb4fd4.pngS

  1. Nếu bạn chưa thực hiện việc này, hãy sao chép nguồn ứng dụng trong cửa sổ dòng lệnh bằng lệnh sau:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
  1. Thay đổi thành 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 thành thư mục hiện tại bằng cách chạy lệnh sau:
cloudshell workspace .

Chuẩn bị dự án

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

3. Làm quen với 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 tệp 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 tạo ứng dụng. Trong trường hợp này, bạn có thể thấy 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ể thấy thông tin tham chiếu đến Dockerfile để tạo hình ảnh. Ngoài ra, Skaffold còn hỗ trợ các công cụ xây dựng khác như Jib, Maven, Gradle, Buildpacks gốc trên đám mây, Bazel và 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 Skaffold.

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ề một quá trình triển khai mặc định đị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à dev, test, stagingproduction 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, dev, stagingprod. Lớp phủ dev sẽ được sử dụng trong quá trình phát triển cục bộ và lớp phủ stagingprod sẽ được sử dụng khi triển khai bằng Skaffold.

6. Hồ sơ

Phần profiles chứa cấu hình xác định 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, chẳng hạ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 trong 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 cho ứng dụng được định cấu hình ở đây là 3, ghi đè cấu hình cơ sở.

  1. Mở tệp app > main.go sau 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 vùng chứa Kubernetes mà ứng dụng đang chạy.

Xem tệp Dockerfile

  1. Mở tệp app > Dockerfile trong ngăn IDE. Tệp này chứa một trình tự 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

Sử dụng Skaffold để phát triển cục bộ

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

Bạn sẽ thấy quá trình tạo bản dựng vùng chứa ứng dụng chạy (có thể mất một phút), sau đó kết quả của ứng dụng sẽ 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.

Thực hiện thay đổi đối với ứng dụng

Giờ đây, khi ứng dụng đang chạy trong cụm Kubernetes cục bộ, bạn có thể thực hiện các thay đổi đối vớ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 thực hiện 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, với thay đổi về đầu ra hiển thị trong cửa sổ dòng lệnh.

  1. Bây giờ, cũng trong tệp "app > main.go" 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 tạo 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 và 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 pod bị xoá khỏi dịch vụ nên chỉ còn một pod.

  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ộ của 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 phát hành và triển khai hình ảnh đó cho 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 cuối cùng (nếu cần) và xuất thông tin chi tiết về bản phát hành vào 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. Điều này có nghĩa là(các) cấu phần phần mềm không thể thay đổi trên tuyến đường đến trực tiếp.

  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 sử 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 vùng chứa tương tự như sau:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-staging-xxxxxxxxxx-xxxxx!
  1. Nhấn tổ hợp phím Ctrl-C trong cửa sổ dòng lệnh để dừng đầu ra Skaffold.
  2. Chạy lệnh sau để quan sát ứng dụng của bạn khởi động và 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 hồ sơ 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ừ ba nhóm tương tự như sau:

[skaffold-kustomize] Hello world from pod skaffold-kustomize-prod-xxxxxxxxxx-xxxxx!
  1. Nhấn tổ hợp phím Ctrl-C trong cửa sổ dòng lệnh để dừng đầu ra của Skaffold.

Bạn sẽ thấy ba tên pod khác nhau, vì hồ sơ prod cho ứng dụng chỉ định rằng sẽ có ba bản sao trong quá trình triển khai.

  1. Chạy lệnh sau để quan sát ứng dụng của bạn khởi động và 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 để minh hoạ quá trình triển khai chính thức:

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 lớp học lập trình 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 cục bộ và triển khai ứng dụng.

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