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ư Kustomize và Helm để 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
- 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).
- 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
- Chuyển sang 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 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
- Đả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
- 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 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ử và 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, staging và prod. 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ử và 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ở.
Điều hướng mã nguồn của ứng dụng.
- 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àostdout
mỗi giây. - 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
- 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ệ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
Dùng Skaffold để phát triển cục bộ
- 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.
- 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.
- Giờ đây, 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 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.
- 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.
- 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.
- 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.
- 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.
- 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
- 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!
- Nhấn Ctrl-C trong cửa sổ dòng lệnh để dừng kết quả Skaffold.
- 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
- 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!
- 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.
- 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
- Chạy lệnh sau để tắt cụm cục bộ:
minikube delete