Đánh giá Skaffold cho sự phát triển Kubernetes

Đánh giá Skaffold cho sự phát triển Kubernetes

Cách đây một năm rưỡi, vào ngày 5 tháng 2018 năm XNUMX, Google đã phát hành phiên bản alpha đầu tiên của dự án Nguồn mở dành cho CI/CD có tên là giàn giáo, mục tiêu là tạo ra “sự phát triển Kubernetes đơn giản và có thể lặp lại” để các nhà phát triển có thể tập trung vào phát triển hơn là quản trị. Điều gì có thể thú vị về Skaffold? Hóa ra, nó có một số thủ thuật có thể biến nó thành một công cụ mạnh mẽ cho nhà phát triển và thậm chí có thể là kỹ sư vận hành. Hãy làm quen với dự án và khả năng của nó.

NB: Nhân tiện, chúng tôi đã nói ngắn gọn về Skaffold nói chung đánh giá các công cụ dành cho nhà phát triển, cuộc sống của họ được kết nối với Kubernetes.

Lý thuyết. Mục đích và khả năng

Vì vậy, nói chung, Skaffold giải quyết vấn đề tự động hóa chu trình CI/CD (ở các giai đoạn xây dựng, đẩy, triển khai), đưa ra phản hồi nhanh chóng cho nhà phát triển, tức là. khả năng nhanh chóng nhận được kết quả của những thay đổi mã tiếp theo - dưới dạng một ứng dụng cập nhật chạy trong cụm Kubernetes. Và nó có thể hoạt động trong các mạch khác nhau (nhà phát triển, giai đoạn, sản xuất...), trong đó Skaffold giúp mô tả các quy trình triển khai tương ứng.

Mã nguồn của Skaffold được viết bằng Go, phân phối bởi theo Giấy phép Apache 2.0 (GitHub) miễn phí.

Chúng ta hãy xem xét các chức năng và tính năng chính. Đầu tiên bao gồm những điều sau đây:

  • Skaffold cung cấp các công cụ để tạo quy trình CI/CD.
  • Cho phép bạn theo dõi các thay đổi trong mã nguồn ở chế độ nền và chạy quy trình tự động tập hợp mã vào hình ảnh vùng chứa, xuất bản những hình ảnh này trong Docker Register và triển khai chúng vào cụm Kubernetes.
  • Đồng bộ hóa các tệp trong kho lưu trữ với thư mục làm việc trong vùng chứa.
  • Tự động kiểm tra bằng cách sử dụng container-structure-test.
  • Chuyển tiếp cổng.
  • Đọc nhật ký của một ứng dụng đang chạy trong vùng chứa.
  • Giúp gỡ lỗi các ứng dụng được viết bằng Java, Node.js, Python, Go.

Bây giờ về các tính năng:

  • Bản thân Skaffold không có thành phần phía cụm. Tức là không cần phải cấu hình thêm Kubernetes để sử dụng tiện ích này.
  • Các đường dẫn khác nhau cho ứng dụng của bạn. Bạn có cần triển khai mã cho Minikube cục bộ trong khi đang phát triển và sau đó chuyển sang giai đoạn hoặc sản xuất không? Với mục đích này có hồ sơ và cấu hình người dùng, biến môi trường và cờ, cho phép bạn mô tả các quy trình khác nhau cho một ứng dụng.
  • CLI. Chỉ có tiện ích và cấu hình bảng điều khiển trong YAML. Trên Internet, bạn có thể tìm thấy tài liệu tham khảo về những nỗ lực tạo GUI thử nghiệmtuy nhiên, hiện tại điều này rất có thể chỉ có nghĩa là ai đó cần anh ấy, nhưng thực sự không phải vậy.
  • Môđun. Skaffold không phải là một máy thu hoạch độc lập mà cố gắng sử dụng các mô-đun riêng lẻ hoặc các giải pháp hiện có cho các nhiệm vụ cụ thể.

Minh họa sau:

  • Ở giai đoạn lắp ráp, bạn có thể sử dụng:
    • docker xây dựng cục bộ, trong một cụm bằng kaniko hoặc trong Google Cloud Build;
    • Bazel tại địa phương;
    • Jib Maven và Jib Gradle cục bộ hoặc trong Google Cloud Build;
    • tập lệnh xây dựng tùy chỉnh chạy cục bộ. Nếu bạn cần chạy một giải pháp xây dựng khác (linh hoạt hơn/quen thuộc/...), nó được mô tả trong tập lệnh để Skaffold khởi chạy nó (ví dụ từ tài liệu). Điều này cho phép bạn sử dụng bất kỳ bộ sưu tập nào có thể được gọi bằng tập lệnh;
  • Ở giai đoạn thử nghiệm, đã được đề cập kiểm tra cấu trúc container;
  • Để triển khai, những điều sau đây được cung cấp:
    • Kubectl;
    • Mũ bảo hiểm;
    • tùy chỉnh.

Nhờ điều này, Skaffold có thể được gọi là độc nhất khuôn khổ xây dựng CI/CD. Đây là một quy trình làm việc mẫu khi sử dụng nó (từ tài liệu dự án):

Đánh giá Skaffold cho sự phát triển Kubernetes

Nhìn chung công việc của Skaffold trông như thế nào?

  1. Tiện ích này giám sát những thay đổi trong thư mục mã nguồn. Nếu các sửa đổi được thực hiện đối với các tệp, chúng sẽ được đồng bộ hóa với nhóm ứng dụng trong cụm Kubernetes. Nếu có thể, không cần ghép lại hình ảnh. Nếu không, một hình ảnh mới sẽ được lắp ráp.
  2. Hình ảnh đã lắp ráp được kiểm tra bằng cách sử dụng thử nghiệm cấu trúc vùng chứa, được gắn thẻ và gửi đến Sổ đăng ký Docker.
  3. Sau đó, image được triển khai - triển khai trong cụm Kubernetes.
  4. Nếu quá trình khởi chạy được khởi tạo bằng lệnh skaffold dev, sau đó chúng tôi bắt đầu nhận nhật ký từ ứng dụng và Skaffold chờ các thay đổi để lặp lại tất cả các hành động.

Đánh giá Skaffold cho sự phát triển Kubernetes
Minh họa các giai đoạn chính của hoạt động Skaffold

Luyện tập. Đang dùng thử Skaffold

Để chứng minh việc sử dụng Skaffold, tôi sẽ lấy một ví dụ từ Kho lưu trữ dự án GitHub. Nhân tiện, ở đó Bạn có thể tìm thấy nhiều ví dụ khác có tính đến các chi tiết cụ thể khác nhau. Tôi sẽ thực hiện mọi hành động cục bộ trong Minikube. Quá trình cài đặt rất đơn giản, chỉ mất vài phút và bạn sẽ cần kubectl để bắt đầu.

Cài đặt Skaffold:

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin
skaffold version
v0.37.1

Hãy sao chép kho lưu trữ của Skaffold với các ví dụ cần thiết:

git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservices

Tôi đã chọn một ví dụ có hai nhóm, mỗi nhóm chứa một ứng dụng Go nhỏ. Một ứng dụng là giao diện người dùng (leeroy-web), chuyển hướng yêu cầu đến ứng dụng thứ hai - phần phụ trợ (leeroy-app). Hãy xem nó trông như thế nào:

~/skaffold/examples/microservices # tree
.
├── leeroy-app
│   ├── app.go
│   ├── Dockerfile
│   └── kubernetes
│       └── deployment.yaml
├── leeroy-web
│   ├── Dockerfile
│   ├── kubernetes
│   │   └── deployment.yaml
│   └── web.go
├── README.adoc
└── skaffold.yaml
 
4 directories, 8 files

leeroy-app và leeroy-web chứa mã Go và các Dockerfile đơn giản để xây dựng mã này cục bộ:

~/skaffold/examples/microservices # cat leeroy-app/Dockerfile
FROM golang:1.12.9-alpine3.10 as builder
COPY app.go .
RUN go build -o /app .
 
FROM alpine:3.10
CMD ["./app"]
COPY --from=builder /app .

Tôi sẽ không cung cấp mã ứng dụng - chỉ cần biết điều đó là đủ leeroy-web chấp nhận các yêu cầu và ủy quyền cho họ leeroy-app. Vì vậy trong các tập tin Deployment.yaml có một Dịch vụ chỉ dành cho app (để định tuyến nội bộ). Cổng nhóm web chúng tôi sẽ chuyển tiếp nó cho chính chúng tôi để truy cập nhanh vào ứng dụng.

Có vẻ như skaffold.yaml:

~/skaffold/examples/microservices # cat skaffold.yaml
apiVersion: skaffold/v1beta13
kind: Config
build:
  artifacts:
    - image: leeroy-web
      context: ./leeroy-web/
    - image: leeroy-app
      context: ./leeroy-app/
deploy:
  kubectl:
    manifests:
      - ./leeroy-web/kubernetes/*
      - ./leeroy-app/kubernetes/*
portForward:
  - resourceType: deployment
    resourceName: leeroy-web
    port: 8080
    localPort: 9000

Tất cả các giai đoạn được đề cập ở trên được mô tả ở đây. Ngoài cấu hình này, còn có một tệp có cài đặt chung - ~/.skaffold/config. Nó có thể được chỉnh sửa thủ công hoặc thông qua CLI - ví dụ: như thế này:

skaffold config set --global local-cluster true

Lệnh này sẽ đặt biến toàn cục local-cluster thành ý nghĩa true, sau đó Skaffold sẽ không cố gắng đẩy hình ảnh vào sổ đăng ký từ xa. Nếu bạn đang phát triển cục bộ, bạn có thể sử dụng lệnh này để xây dựng hình ảnh cục bộ.

Quay lại skaffold.yaml:

  • Trên sân khấu build chúng tôi chỉ định rằng bạn cần thu thập và lưu hình ảnh cục bộ. Sau khi build chạy lần đầu tiên, chúng ta sẽ thấy như sau:
    // т.к. Minikube создает кластер в отдельной виртуальной машине,
    // придется проникнуть внутрь, чтобы найти образы
    # minikube ssh
    $ docker images
    REPOSITORY                                TAG                                                                IMAGE ID            CREATED             SIZE 
    leeroy-app                                7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e   7d55a5080359        4 hours ago         13MB 
    leeroy-app                                v0.37.1-171-g0270a0c-dirty                                         7d55a5080359        4 hours ago         13MB
    leeroy-web                                5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681   5063bfb29d98        5 hours ago         13.1MB
    leeroy-web                                v0.37.1-171-g0270a0c-dirty                                         5063bfb29d98        5 hours ago         13.1MB

    Như bạn có thể thấy, Skaffold đã tự mình gắn thẻ cho các hình ảnh. Nhân tiện, một số chính sách gắn thẻ được hỗ trợ.

  • Hơn nữa trong cấu hình nó được chỉ định context: ./leeroy-app/, I E. bối cảnh trong đó hình ảnh được thu thập được chỉ định.
  • Ở giai đoạn triển khai, chúng tôi xác định rằng chúng tôi sẽ sử dụng kubectl và mặt nạ cho các bảng kê khai cần thiết.
  • PortForward: tương tự như cách chúng ta thường chuyển tiếp cổng bằng cách sử dụng kubectl port-forward, chúng ta hướng dẫn Skaffold gọi lệnh này. Trong trường hợp này, cổng cục bộ 9000 được chuyển tiếp tới 8080 trong Triển khai với tên leeroy-web.

Đã đến lúc khởi động skaffold dev: Nhóm sẽ tạo một “vòng phản hồi” đang diễn ra, tức là. nó không chỉ thu thập mọi thứ và triển khai vào cụm mà còn cho bạn biết về trạng thái của các nhóm tại thời điểm hiện tại, theo dõi các thay đổi và cập nhật trạng thái của các nhóm.

Đây là kết quả ra mắt skaffold dev --port-forward khi lắp ráp lại:

Đánh giá Skaffold cho sự phát triển Kubernetes

Đầu tiên, bạn có thể thấy bộ đệm đang được sử dụng. Tiếp theo, ứng dụng được tập hợp, triển khai và chuyển tiếp các cổng. Kể từ khi được chỉ định --port-forward, Skaffold đã chuyển tiếp cổng tới web, như anh ấy đã được hỏi, nhưng ở đây app anh ta ném theo ý mình (chọn cái miễn phí gần nhất). Sau này, chúng tôi nhận được nhật ký đầu tiên từ các ứng dụng.

Hãy kiểm tra xem nó có hoạt động không?

~/skaffold/examples/microservices # kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
leeroy-app-6998dfcc95-2nxvf   1/1     Running   0          103s
leeroy-web-69f7d47c9d-5ff77   1/1     Running   0          103s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy app!!!

Sửa đổi tập tin leeroy-app/app.go - vài giây trôi qua... và:

~/skaffold/examples/microservices # kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
leeroy-app-ffd79d986-l6nwp    1/1     Running   0          11s
leeroy-web-69f7d47c9d-5ff77   1/1     Running   0          4m59s
~/skaffold/examples/microservices # curl localhost:9000
leeroooooy Habr!!!

Đồng thời, bản thân Skaffold cũng hiển thị điều tương tự trong bảng điều khiển như trước đây, ngoại trừ một điểm: nó chỉ tung ra leeroy-app, và không phải tất cả cùng một lúc.

Thực hành thêm

Một điều đáng nói nữa là khi tạo một dự án mới, các cấu hình cho Skaffold có thể được khởi động bằng lệnh init, rất thuận tiện. Ngoài ra, bạn có thể viết một số cấu hình: tiến hành phát triển trên cấu hình mặc định, sau đó triển khai bằng lệnh run (quy trình tương tự như dev, chỉ không giám sát các thay đổi), sử dụng cấu hình khác.

Trên katacoda có khả năng lãnh đạo Nó thậm chí còn dễ dàng hơn với một ví dụ. Nhưng nó cung cấp một hộp cát làm sẵn với Kubernetes, một ứng dụng và Skaffold. Một lựa chọn tuyệt vời nếu bạn muốn tự mình thử những điều cơ bản.

Một trường hợp sử dụng có thể có của Skaffold là tiến hành phát triển trên một cụm từ xa. Không phải ai cũng cảm thấy thoải mái khi chạy Minikube trên phần cứng của riêng mình, sau đó triển khai ứng dụng và mong đợi nó hoạt động đầy đủ... Trong trường hợp này, Skaffold giải quyết vấn đề một cách hoàn hảo, điều này có thể được xác nhận, chẳng hạn như các kỹ sư Reddit, như chúng tôi có đã thảo luận rồi писали trong blog của chúng tôi.

Và trong ấn phẩm này từ Weaworks, bạn có thể tìm thấy ví dụ về cách tạo quy trình sản xuất.

Kết luận

Skaffold là một công cụ thuận tiện để xây dựng các quy trình liên quan đến việc triển khai các ứng dụng cho Kubernetes và chủ yếu tập trung vào nhu cầu phát triển. Việc tạo một quy trình “ngắn” có tính đến các nhu cầu cơ bản của nhà phát triển khá dễ dàng, nhưng nếu muốn, bạn có thể tổ chức các quy trình lớn hơn. Là một trong những ví dụ rõ ràng về việc sử dụng Skaffold trong quy trình CI/CD được đưa ra như vậy dự án thử nghiệm trong số 10 vi dịch vụ sử dụng khả năng của Kubernetes, gRPC, Istio và OpenCensus Tracing.

Skaffold đã có gần 8000+ sao trên GitHub, được phát triển bởi Google và là một phần của Công cụ GoogleContainer — nói chung, hiện tại có mọi lý do để tin rằng dự án sẽ phát triển hạnh phúc mãi mãi.

PS

Đọc thêm trên blog của chúng tôi:

Nguồn: www.habr.com

Thêm một lời nhận xét