用於 Kubernetes 開發的 Skaffold 回顧

用於 Kubernetes 開發的 Skaffold 回顧

一年半前,也就是 5 年 2018 月 XNUMX 日,Google 發布了 CI/CD 開源專案的第一個 alpha 版本,名為 斯卡福德其目標是創建“簡單且可重複的 Kubernetes 開發”,以便開發人員可以專注於開發而不是管理。 Skaffold 有什麼有趣的地方? 事實證明,它有一些技巧可以使其成為開發人員甚至是營運工程師的強大工具。 讓我們熟悉一下該項目及其功能。

NB:順便說一句,我們已經在我們的通用中簡要討論過 Skaffold 開發者工具審查,他們的生活與 Kubernetes 息息相關。

理論。 目的和能力

因此,一般來說,Skaffold 解決了 CI/CD 週期(在建置、推送、部署階段)自動化的問題,為開發人員提供及時的回饋,即能夠快速接收後續程式碼變更的結果 - 以在 Kubernetes 叢集中執行的更新應用程式的形式。 它可以在不同的電路(開發、階段、生產...)中工作,為此 Skaffold 幫助描述了相應的部署流程。

Skaffold的原始碼是用Go寫的, 分發者 根據免費的 Apache License 2.0 (GitHub)。

讓我們來看看主要功能和特點。 第一個包括以下內容:

  • Skaffold 提供用於建立 CI/CD 管道的工具。
  • 允許您在背景監視原始程式碼的更改,並執行將程式碼組裝到容器映像中的自動化過程,在 Docker 註冊表中發布這些映像並將它們部署到 Kubernetes 叢集。
  • 將儲存庫中的檔案與容器中的工作目錄同步。
  • 使用容器結構測試自動測試。
  • 轉送連接埠。
  • 讀取容器中執行的應用程式的日誌。
  • 幫助調試用 Java、Node.js、Python、Go 編寫的應用程式。

現在介紹一下功能:

  • Skaffold本身沒有集群端組件。 也就是說,無需進一步配置 Kubernetes 即可使用此實用程式。
  • 適合您應用的不同管道。 您在開發時是否需要將程式碼部署到本機 Minikube,然後再進行階段或生產? 為此目的有 型材 以及用戶配置、環境變數和標誌,它們允許您描述一個應用程式的不同管道。
  • CLI的。 僅 YAML 中的控制台實用程式和設定。 在互聯網上,您可以找到嘗試建立的參考資料 實驗性圖形使用者介面不過,目前這很可能只是代表有人需要他,但並不是真的。
  • 模塊化。 Skaffold 不是獨立的收割機,而是努力使用單獨的模組或現有的解決方案來完成特定任務。

後者的說明:

  • 在組裝階段您可以使用:
    • docker 在本地、使用 kaniko 的叢集中或在 Google Cloud Build 中建置;
    • 本地巴澤爾;
    • Jib Maven 和 Jib Gradle 本地或 Google Cloud Build 中;
    • 自訂建置腳本在本地運行。 如果您需要執行另一個(更靈活/熟悉/...)建置解決方案,則腳本中會對此進行描述,以便 Skaffold 啟動它(文檔中的示例)。 這允許您使用任何可以透過腳本呼叫的收集器;
  • 在測試階段,已經提過 容器結構測試;
  • 對於部署,提供以下內容:
    • 庫貝克特;
    • 舵;
    • 定制。

正因如此,Skaffold 堪稱獨一無二 建構 CI/CD 的框架。 這是使用它時的範例工作流程(來自專案文件):

用於 Kubernetes 開發的 Skaffold 回顧

斯卡福德的作品整體來說是什麼樣的?

  1. 該實用程式監視原始程式碼目錄中的變更。 如果對檔案進行修改,它們會與 Kubernetes 叢集中的應用程式 pod 同步。 如果可能,無需重新組裝影像。 否則,將組裝一個新圖像。
  2. 使用容器結構測試檢查組裝的映像,標記並傳送到 Docker 註冊表。
  3. 之後,鏡像就被部署了-部署在 Kubernetes 叢集中。
  4. 如果啟動是使用命令初始化的 skaffold dev,然後我們開始從應用程式接收日誌,Skaffold 等待更改以再次重複所有操作。

用於 Kubernetes 開發的 Skaffold 回顧
Skaffold 操作主要階段圖解

實踐。 嘗試斯卡福德

為了示範 Skaffold 的使用,我將舉一個例子 GitHub 專案儲存庫。 順便一提, 那裡 您可以找到許多其他考慮到各種具體情況的範例。 我將在 Minikube 本地執行所有操作。 安裝很簡單,只需幾分鐘,您需要 kubectl 才能開始。

安裝鷹架:

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

讓我們使用必要的範例克隆 Skaffold 的儲存庫:

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

我選擇了一個包含兩個 Pod 的範例,每個 Pod 包含一個小型 Go 應用程式。 第一個應用程式是前端 (leeroy-web),它將請求重定向到第二個應用程式 - 後端 (leeroy-app)。 讓我們看看它是什麼樣子的:

~/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 和 leeroy-web 包含 Go 程式碼和用於在本機建置此程式碼的簡單 Dockerfile:

~/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 .

我不會給出應用程式程式碼 - 知道這一點就足夠了 leeroy-web 接受請求並將其代理給 leeroy-app。 因此在文件中 Deployment.yaml 有一項服務僅用於 app (用於內部路由)。 Pod 連接埠 web 我們會將其轉發給我們自己以便快速存取該應用程式。

看起來像 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

這裡描述了上面提到的所有階段。 除了這個配置之外,還有一個具有全域設定的檔案 - ~/.skaffold/config。 它可以手動或透過 CLI 進行編輯 - 例如,如下所示:

skaffold config set --global local-cluster true

該命令將設定全域變數 local-cluster 進入意義 true,之後 Skaffold 將不會嘗試將映像推送到遠端註冊表。 如果您在本機開發,可以使用此命令在本機上建立鏡像。

回到 skaffold.yaml:

  • 在舞台上 build 我們指定您需要在本地收集並保存圖像。 第一次建置運行後,我們將看到以下內容:
    // т.к. 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

    正如您所看到的,斯卡福德自己為這些圖像添加了標籤。 順便說一句,支援多種標記策略。

  • 進一步在配置中指出 context: ./leeroy-app/, IE。 指定收集圖像的上下文。
  • 在部署階段,我們確定將使用 kubectl 和遮罩來取得必要的清單。
  • PortForward:類似於我們通常使用的轉發連接埠的方式 kubectl port-forward,我們指示 Skaffold 呼叫此命令。 在本例中,本機連接埠 9000 被轉送到 Deployment 中的 8080,名稱為 leeroy-web.

是時候啟動了 skaffold dev:團隊將創建一個持續的“回饋循環”,即它不僅會收集所有內容並將其部署到集群,還會告訴您當前 pod 的狀態、監視變更並更新 pod 的狀態。

這是啟動結果 skaffold dev --port-forward 重新組裝時:

用於 Kubernetes 開發的 Skaffold 回顧

首先,您可以看到快取正在被使用。 接下來,組裝、部署應用程式並轉發連接埠。 既然指定了 --port-forward, Skaffold 將連接埠轉送到 web,正如他被問到的,但是在這裡 app 他自行決定投擲(選擇最近的免費投擲)。 此後,我們收到來自應用程式的第一個日誌。

讓我們來看看它是否有效?

~/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!!!

修改文件 leeroy-app/app.go - 幾秒鐘過去了...然後:

~/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!!!

同時,Skaffold 本身在控制台中顯示的內容與之前相同,但有一點例外:它只推出了 leeroy-app,而且不是一下子全部完成。

多練

另外值得一提的是,在建立新專案時,可以使用以下指令引導 Skaffold 的配置 init,非常方便。 另外,還可以寫幾個配置:在預設配置上進行開發,然後用指令roll to stage run (與相同的過程 dev,只是不監視更改),使用不同的配置。

在卡塔科達上有 領導 舉個例子就更容易了。 但它提供了一個帶有 Kubernetes、應用程式和 Skaffold 的現成沙箱。 如果您有興趣親自嘗試基礎知識,這是一個不錯的選擇。

Skaffold 的一種可能的用例是在遠端叢集上進行開發。 並不是每個人都願意在自己的硬體上運行Minikube,然後推出應用程式並期望它能夠充分運行......在這種情況下,Skaffold 完美地解決了問題,這一點可以得到Reddit 工程師的證實,因為我們有已經討論過了 писали 在我們的部落格上。

而在 本出版品 您可以從 Weaveworks 找到建立生產管道的範例。

結論

Skaffold 是一個方便的工具,用於建立管道,涉及將應用程式部署到 Kubernetes,並且主要專注於開發需求。 它使得創建考慮到開發人員的基本需求的「短」管道變得非常容易,但如果需要,您可以組織更大的流程。 作為在 CI/CD 流程中使用 Skaffold 的明顯範例之一 給出 這樣 測試項目 使用 Kubernetes、gRPC、Istio 和 OpenCensus Tracing 功能的 10 個微服務。

Skaffold 在 GitHub 上已經擁有近 8000 多個 star,由 Google 開發,是 Google容器工具 ——總的來說,目前有充分的理由相信該計畫將永遠幸福地發展。

聚苯乙烯

另請閱讀我們的博客:

來源: www.habr.com

添加評論