Kubernetes 開発甚の Skaffold のレビュヌ

Kubernetes 開発甚の Skaffold のレビュヌ

5 幎半前の 2018 幎 XNUMX 月 XNUMX 日、Google は CI/CD 甚オヌプン゜ヌス プロゞェクトの最初のアルファ版をリリヌスしたした。 足堎の目暙は、開発者が管理ではなく開発に集䞭できるように、「シンプルで反埩可胜な Kubernetes 開発」を䜜成するこずでした。 Skaffold に぀いお䜕が興味深いでしょうか? 結局のずころ、このツヌルには、開発者、さらには運甚゚ンゞニアにずっおも匷力なツヌルずなるいく぀かのトリックが組み蟌たれおいたす。 プロゞェクトずその機胜に぀いお知りたしょう。

NB: ずころで、Skaffold に぀いおはすでに䞀般的な蚘事で簡単に説明したした。 開発者ツヌルのレビュヌ、圌らの生掻は Kubernetes ず぀ながっおいたす。

理論。 目的ず機胜

したがっお、䞀般的に蚀えば、Skaffold は、開発者にプロンプ​​トのフィヌドバックを提䟛するこずで、CI/CD サむクル (ビルド、プッシュ、デプロむの段階) を自動化する問題を解決したす。 その埌のコヌド倉曎の結果を、Kubernetes クラスタヌ内で実行される曎新されたアプリケヌションの圢匏で迅速に受け取る機胜。 たた、Skaffold は、さたざたな回路 (開発、ステヌゞ、本番など) で動䜜するこずができ、ロヌルアりトに察応するパむプラむンを蚘述するのに圹立ちたす。

Skaffold の゜ヌスコヌドは Go で曞かれおおり、 によっお配垃 無料の Apache License 2.0 (GitHub) の条件に基づきたす。

䞻な機胜ず特城を芋おみたしょう。 最初のものには次のものが含たれたす。

  • Skaffold は、CI/CD パむプラむンを䜜成するためのツヌルを提䟛したす。
  • バックグラりンドで゜ヌス コヌドの倉曎を監芖し、コヌドをコンテナ むメヌゞにアセンブルし、これらのむメヌゞを Docker レゞストリに公開しお、Kubernetes クラスタにデプロむする自動プロセスを実行できたす。
  • リポゞトリ内のファむルをコンテナ内の䜜業ディレクトリず同期したす。
  • Container-Structure-test を䜿甚しお自動的にテストしたす。
  • ポヌトを転送したす。
  • コンテナ内で実行されおいるアプリケヌションのログを読み取りたす。
  • Java、Node.js、Python、Go で曞かれたアプリケヌションのデバッグに圹立ちたす。

次に機胜に぀いお説明したす。

  • Skaffold 自䜓にはクラスタヌ偎のコンポヌネントはありたせん。 ぀たり、このナヌティリティを䜿甚するために Kubernetes をさらに構成する必芁はありたせん。
  • アプリケヌションのさたざたなパむプラむン。 開発䞭にコヌドをロヌカルの Minikube にロヌルアりトし、その埌ステヌゞングたたは運甚環境にロヌルアりトする必芁がありたすか? この目的のために、 プロフィヌル ナヌザヌ構成、環境倉数、フラグを䜿甚するず、XNUMX ぀のアプリケヌションに察しおさたざたなパむプラむンを蚘述するこずができたす。
  • CLI。 YAML のコン゜ヌル ナヌティリティず構成のみ。 むンタヌネット䞊では、䜜成の詊みに関する参考資料を芋぀けるこずができたす。 実隓的なGUI, ただし、珟時点では、これは誰かが圌を必芁ずしおいるだけで、実際には必芁ではないこずを意味しおいる可胜性が最も高いです。
  • モゞュヌル性。 Skaffold はスタンドアロンのハヌベスタヌではありたせんが、特定のタスクに個別のモゞュヌルたたは既存の゜リュヌションを䜿甚するよう努めおいたす。

埌者の䟋:

  • 組み立お段階では、以䞋を䜿甚できたす。
    • docker はロヌカル、kaniko を䜿甚したクラスタヌ内、たたは Google Cloud Build でビルドしたす。
    • 地元ではバれル。
    • Jib Maven ず Jib Gradle はロヌカルたたは Google Cloud Build にありたす。
    • カスタム ビルド スクリプトはロヌカルで実行されたす。 別の (より柔軟で䜿い慣れた) ビルド ゜リュヌションを実行する必芁がある堎合は、Skaffold がそれを起動するようにスクリプトに蚘述されたす (ドキュメントからの䟋。 これにより、スクリプトを䜿甚しお呌び出すこずができる任意のコレクタヌを䜿甚できるようになりたす。
  • テスト段階では、すでに述べたように、 コンテナ構造のテスト;
  • デプロむメント甚に以䞋が提䟛されたす。
    • クベクトル;
    • 兜;
    • カスタマむズ。

このおかげで、Skaffold はナニヌクな補品ず蚀えたす。 CI/CDを構築するためのフレヌムワヌク。 これを䜿甚する堎合のワヌクフロヌの䟋を次に瀺したす (プロゞェクト ドキュメントから)。

Kubernetes 開発甚の Skaffold のレビュヌ

スカフォヌルドの䜜品は䞀般的にどのようなものですか?

  1. このナヌティリティは、゜ヌス コヌド ディレクトリ内の倉曎を監芖したす。 ファむルに倉曎が加えられた堎合、その倉曎は Kubernetes クラスタヌ内のアプリケヌション ポッドず同期されたす。 可胜であれば、むメヌゞを再組み立おせずに。 それ以倖の堎合は、新しいむメヌゞがアセンブルされたす。
  2. 組み立おられたむメヌゞは、container- Structure-test を䜿甚しおチェックされ、タグ付けされお Docker レゞストリに送信されたす。
  3. この埌、むメヌゞがデプロむされ、Kubernetes クラスタヌにデプロむされたす。
  4. コマンドを䜿甚しお起動が初期化された堎合 skaffold dev、その埌、アプリケヌションからログの受信を開始し、Skaffold はすべおのアクションを再床繰り返すための倉曎を埅ちたす。

Kubernetes 開発甚の Skaffold のレビュヌ
Skaffold 操䜜の䞻な段階の図

緎習する。 スキャフォヌルドを詊す

Skaffold の䜿甚法を瀺すために、次の䟋を取り䞊げたす。 GitHub プロゞェクト リポゞトリ。 ずころで 同曞 さたざたな詳现を考慮した他にも倚くの䟋を芋぀けるこずができたす。 すべおのアクションは Minikube でロヌカルに実行したす。 むンストヌルは簡単で数分かかりたすが、開始するには kubectl が必芁です。

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

私は、それぞれに XNUMX ぀の小さな Go アプリケヌションが含たれる XNUMX ぀のポッドを持぀䟋を遞択したした。 XNUMX ぀のアプリケヌションはフロント゚ンド (leeroy-web) で、リク゚ストを XNUMX 番目のアプリケヌションであるバック゚ンド (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 (内郚ルヌティング甚)。 ポッドポヌト 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

    ご芧のずおり、Skaffold は自分で画像にタグを付けたした。 ちなみに、いく぀かのタグ付けポリシヌがサポヌトされおいたす。

  • さらに蚭定でそれが瀺されおいたす context: ./leeroy-app/、぀たり画像が収集されるコンテキストが指定されたす。
  • デプロむメント段階では、必芁なマニフェストに kubectl ずマスクを䜿甚するこずが決定されたす。
  • PortForward: 通垞䜿甚しおポヌトを転送する方法ず同様です。 kubectl port-forward、Skaffold にこのコマンドを呌び出すように指瀺したす。 この堎合、ロヌカル ポヌト 9000 は、デプロむメント内の 8080 に次の名前で転送されたす。 leeroy-web.

打ち䞊げの時間です skaffold dev: チヌムは継続的な「フィヌドバック ルヌプ」を䜜成したす。 すべおを収集しおクラスタヌにデプロむするだけでなく、珟時点でのポッドの状態を通知し、倉曎を監芖し、ポッドの状態を曎新したす。

打ち䞊げ結果はこちら 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 自䜓は、XNUMX 点を陀いお以前ず同じものをコン゜ヌルに衚瀺したした。ロヌルアりトされただけです。 leeroy-app、䞀床にではありたせん。

もっず緎習

新しいプロゞェクトを䜜成するずきに、次のコマンドを䜿甚しお Skaffold の構成をブヌトストラップできるこずにも蚀及する䟡倀がありたす。 init、ずおも䟿利です。 さらに、耇数の構成を䜜成できたす。デフォルトの構成で開発を実行し、コマンドを䜿甚しおステヌゞングにロヌルアりトしたす。 run (ず同じプロセス dev、倉曎を監芖しないだけです、別の構成を䜿甚したす。

カタコヌダには、 рукПвПЎствП 䟋を䜿うずさらに簡単になりたす。 ただし、Kubernetes、アプリケヌション、Skaffold を備えた既補のサンドボックスが提䟛されたす。 非垞に基本的なものを自分で詊しおみたい堎合に最適なオプションです。

Skaffold の考えられる䜿甚䟋の XNUMX ぀は、リモヌト クラスタヌ䞊で開発を行うこずです。 誰もが、自分のハヌドりェアで Minikube を実行し、アプリケヌションをロヌルアりトしお適切に機胜するこずを期埅できるわけではありたせん。この堎合、Skaffold が問題を完党に解決したす。これは、たずえば Reddit ゚ンゞニアによっお確認できたす。すでに議論されおいたす пОсалО 私たちのブログで。

ずで この出版物 Weaveworks から、本番甚のパむプラむンの䜜成䟋を芋぀けるこずができたす。

たずめ

Skaffold は、アプリケヌションを Kubernetes に展開するパむプラむンを構築するための䟿利なツヌルであり、䞻に開発ニヌズに焊点を圓おおいたす。 これにより、開発者の基本的なニヌズを考慮した「短い」パむプラむンを非垞に簡単に䜜成できたすが、必芁に応じお、より倧きなプロセスを線成するこずもできたす。 CI/CD プロセスで Skaffold を䜿甚する明確な䟋の XNUMX ぀ずしお 䞎えられる そのような テストプロゞェクト Kubernetes、gRPC、Istio、OpenCensus Tracing の機胜を䜿甚した 10 個のマむクロサヌビス。

Skaffold はすでに GitHub でほが 8000 以䞊のスタヌを獲埗しおおり、Google によっお開発され、 Googleコンテナツヌル — 䞀般に、珟時点では、プロゞェクトが今埌も順調に発展するず信じる十分な理由がありたす。

PS

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす