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ư Kustomize và Helm để 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
- 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".
- 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
- Thay đổi thành thư mục kho lưu trữ được sao chép:
cd software-delivery-workshop/labs/understanding-skaffold/getting-started
- Đặ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
- Đả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
- 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
- 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, staging và production 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, staging và prod. Lớp phủ dev sẽ được sử dụng trong quá trình phát triển cục bộ và lớp phủ staging và prod 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ở.
Di chuyển trong mã nguồn của ứng dụng.
- 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àostdout
mỗi giây. - 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
- 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ệpmain.go
và được tham chiếu trong tệpskaffold.yaml
cấp cao nhất.
7. Phát triển bằng Skaffold
Định cấu hình môi trường Kubernetes
- 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
- Chạy lệnh sau để tạo không gian tên Kubernetes cho
dev
,staging
vàprod
:
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ộ
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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
- 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!
- Nhấn tổ hợp phím Ctrl-C trong cửa sổ dòng lệnh để dừng đầu ra Skaffold.
- 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
- 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!
- 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.
- 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
- Chạy lệnh sau để tắt cụm cục bộ:
minikube delete