一年半前,也就是 5 年 2018 月 XNUMX 日,Google 發布了 CI/CD 開源專案的第一個 alpha 版本,名為
NB:順便說一句,我們已經在我們的通用中簡要討論過 Skaffold
理論。 目的和能力
因此,一般來說,Skaffold 解決了 CI/CD 週期(在建置、推送、部署階段)自動化的問題,為開發人員提供及時的回饋,即能夠快速接收後續程式碼變更的結果 - 以在 Kubernetes 叢集中執行的更新應用程式的形式。 它可以在不同的電路(開發、階段、生產...)中工作,為此 Skaffold 幫助描述了相應的部署流程。
Skaffold的原始碼是用Go寫的,
讓我們來看看主要功能和特點。 第一個包括以下內容:
- 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 叢集中的應用程式 pod 同步。 如果可能,無需重新組裝影像。 否則,將組裝一個新圖像。
- 使用容器結構測試檢查組裝的映像,標記並傳送到 Docker 註冊表。
- 之後,鏡像就被部署了-部署在 Kubernetes 叢集中。
- 如果啟動是使用命令初始化的
skaffold dev
,然後我們開始從應用程式接收日誌,Skaffold 等待更改以再次重複所有操作。
Skaffold 操作主要階段圖解
實踐。 嘗試斯卡福德
為了示範 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
讓我們使用必要的範例克隆 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
重新組裝時:
首先,您可以看到快取正在被使用。 接下來,組裝、部署應用程式並轉發連接埠。 既然指定了 --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
,只是不監視更改),使用不同的配置。
在卡塔科達上有
Skaffold 的一種可能的用例是在遠端叢集上進行開發。 並不是每個人都願意在自己的硬體上運行Minikube,然後推出應用程式並期望它能夠充分運行......在這種情況下,Skaffold 完美地解決了問題,這一點可以得到Reddit 工程師的證實,因為我們有已經討論過了
而在
結論
Skaffold 是一個方便的工具,用於建立管道,涉及將應用程式部署到 Kubernetes,並且主要專注於開發需求。 它使得創建考慮到開發人員的基本需求的「短」管道變得非常容易,但如果需要,您可以組織更大的流程。 作為在 CI/CD 流程中使用 Skaffold 的明顯範例之一
Skaffold 在 GitHub 上已經擁有近 8000 多個 star,由 Google 開發,是
聚苯乙烯
另請閱讀我們的博客:
- «
為 Kubernetes 上運行的應用程式開發人員提供的工具 “; - «
werf - 我們在 Kubernetes 中的 CI / CD 工具(概述和視頻報告) “; - «
Garden v0.10.0:您的筆記本電腦不需要 Kubernetes “; - «
Kubernetes 提示和技巧:關於本地開發和網真 “。
來源: www.habr.com