Kubernetesのアプリケーション開発で楽をしたい。そうだ、Skaffoldを使ってみよう!

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Skaffoldとは?

Skaffold(https://skaffold.dev)は、Kubernetesアプリケーションの継続的開発を促進するコマンドラインツールです。SkaffoldはGoogleによって設計されたオープンソースのツールです。Skaffoldを利用する目的は、ローカル開発のワークフローの高速化するところにあります。Skaffoldがアプリケーションのソースコードの変更を検知して、自動的にコンテナの再作成を行います。コンテナの再作成後、SkaffoldがローカルやリモートのKubernetes環境へプッシュ、デプロイを行ってくれます。Skaffoldを利用することで、ローカル開発環境でのビルドからデプロイまでの手間を省くことができるので、アプリケーション開発者は開発に集中することができます。

本記事では、Skaffoldの概要とローカル環境での基本的な使い方の紹介を行います。

 

Skaffoldの特徴は?

Skaffoldの特徴を紹介します。

ローカルでのKubernetesアプリケーション開発の高速化

アプリケーションのソースコードの変更をSkaffoldが自動で検知し、コンテナのビルド、プッシュ、デプロイを自動で行います。アプリケーションの開発者が docker buildkubectl applyコマンドを実行する手間がなくなります。

どこでも動作できる

作成したSkaffoldプロジェクトは簡単に共有をすることができます。コンテキスト(環境)ごとの設定変更も、プロファイルなどの切り替えで簡単に行うことができます。

軽量である

Skaffoldはクライアント側のコンポーネントだけで、Kubernetesクラスタ側の設定や管理は不要です。またパイプラインも必要最低限の機能に絞り込むことで、簡単で分かりやすいパイプラインを維持できます。

 

Skaffoldは何をしてくれるの?

Skaffoldの動作はとても簡単で分かりやすく、たった一つのコマンド skaffold devを実行するだけです。 skaffold dev コマンドは、以下の操作を順番に実行します。

1. ソースコードの変更を監視する。

Skaffoldはデフォルトで1秒間隔でソースファイルの変更を監視します。監視の間隔は、 --watch-pool-intervalオプションで変更が可能です。

2. 開発者が同期対象(sync)としているものである場合、Podに直接同期する。

Skaffoldは、コンテナの再作成やPodの再起動を避けるために、ファイルのコピーだけでアプリケーションに反映できるものは、Podに直接コピーを行うことができます。skaffold.yamlファイルのsyncセクションで対象のファイルもしくはディレクトリを指定することで、設定を行います。この機能はファイルの更新かつローカルのソースファイルのみを対象とするなどの制限があります。また、2019年5月17日時点ではアルファ版としてのリリースとなっています。

3. ソースコードからビルドを行う。

指定したツールを利用してDockerイメージをビルドします。サポートしているビルドツールは以下の通りです。

  • ローカルのDockerfile
  • Google Cloud BuildのリモートDockerfile
  • Kanikoのクラスタ内Dockerfile
  • ローカルのBazel
  • ローカルのMavenもしくはGradleを用いたJib
  • Google Cloud BuildのリモートJib
  • ローカルのカスタムビルドスクリプト

4. ビルドしたイメージのテストを行う。

container-structure-test(https://github.com/GoogleContainerTools/container-structure-test)を利用して、ビルドしたコンテナのテストを行います。テストを行うには、container-structure-testのバイナリファイルをインストールしておく必要があります。

5. タグ付けを行う。

コンテナのタグ付けを行います。サポートしているタグ付けポリシーは、以下の通りです。

  • gitCommit
    Git Commit IDをタグに利用します。
  • sha256
    コンテンツのsha256ハッシュをタグに利用します。
  • envTemplate
    環境変数の値をタグに利用します。
  • dateTime
    日時をタグに利用します。

6. プッシュを行う。

コンテナイメージをリポジトリにプッシュします。ローカル開発でリポジトリへのプッシュが不要な場合は、プッシュをスキップさせることもできます。コンテキスト名が以下に該当する場合、ローカルクラスタと判定され、プッシュはスキップされます。

  • docker-for-desktop
  • docker-desktop
  • minikube

7. デプロイを行う。

Kubernetesクラスタへのデプロイを行います。サポートしているデプロイ方法は以下の通りです。

  • kubectl
  • helm
  • kustomize

デプロイの完了後、ソースコードの変更がKubernetes上に反映され、修正したアプリケーションの確認ができるようになります。

8. ソースコードの変更監視をつづける。

デプロイの完了後、”1. ソースコードの変更を監視する。“の処理に戻り、ソースコードの変更監視を続けます。

Skaffoldを終了(Ctrl + C)した場合、デプロイの跡片付けを行う。

起動したSkaffoldはターミナル上でCtrl + Cを押すことで終了することができます。Skaffoldが終了するタイミングで、Kubernetes上にデプロイされたアプリケーションも削除されます。

なお、ソースコードの変更監視やSkaffold終了後のデプロイ削除を行いたくない場合は、skaffold runコマンドを実行します。

 

Skaffoldのインストール(Windows WSL編)

WindowsのWSL for Ubuntu18.04にSkaffoldをインストールしてみます。

事前準備

Dockerとkubectlが必要になるので、利用する環境にあわせてインストールを行ってください。

kubectlはSkaffoldのデプロイ対象のKubernetesクラスタに接続できるように設定をしておいてください。ここでは、WSLのUbuntu18.04環境にkubectlのインストールと設定を行う方法を紹介します。

Docker for DesktopのKubernetesの有効化

Docker for Desktopのインストーラーを起動し、Dockerのインストールを完了させておいてください。インストール完了後、Dockerの設定画面を開き、Kubernetesを有効化してください。

※Settings -> Kubernetes -> Enable Kubernetesのチェックボックスをオン

Windowsの再起動後、Dockerの設定画面の左下で”Kubernetes is running”が表示されていれば、Kubernetesが起動しています。

kubectlのインストール

WSLのターミナルからkubectlのインストールを行います。

kube configのコピー

Docker for Desktopのkube configファイルをWSLのホームディレクトリにコピーします。

kubectlの実行確認

kubectlの実行確認を行います。Client、Serverのバージョンが取得できれば成功です。

Skaffoldのインストール

公式ページのインストール手順(https://skaffold.dev/docs/getting-started/)に従って、Skaffoldのインストールを行います。ここではWSLのUbuntu18.04環境にSkaffoldをインストールをしてみます。

WSLのターミナルから以下のコマンドを実行します。

skaffoldコマンドでバージョンを表示して、インストールの成功を確認します。

kubectlコマンドで現在のコンテキストも確認しておきましょう。

現在のコンテキストは”docker-for-desktop”になっています。

Dockerクライアントの設定

WSLからDocker for Desktopのデーモンを利用できるようにします。はじめにWSL上のUbuntu18.04にDockerクライアントのインストールを行います。

dockerコマンドを実行してDockerクライアントの動作確認を行います。

最後のメッセージはWSL上にDockerデーモンが動作していないので出力されるエラーです。現時点ではこのメッセージが表示されていても問題ありません。

Docker for Desktopの設定

Dockerの設定画面からlocalhost:2375を利用できるようにチェックをいれます。

※Settings -> General -> Expose daemon on tcp://localhost:2375 without TLSのチェックボックスをオン

Dockerクライアントを利用するWSLユーザのDOCKER_HOST環境変数を設定します。

再度、dockerのバージョンを取得してみます。

今度は正常にServerのバージョンも取得できました。

 

サンプルアプリケーションの実行

Skaffoldの公式ページで提供されているサンプルのGoアプリケーションでSkaffoldの動作を確認してみます。このサンプルアプリケーションで、Skaffoldの以下の機能を体験してみましょう。

  • Skaffoldでソースコードの変更検知を行う
  • Skaffoldが自動でコンテナイメージのビルドを行う
  • Skaffoldが自動でコンテナイメージをKubernetesにデプロイする

それでは、以下の手順にしたがってSkaffoldの世界を体験してみてください。

サンプルアプリケーションのリポジトリをcloneする

サンプルアプリケーションのGitリポジトリをcloneします。

skaffold devの実行

サンプルアプリケーションのディレクトリに移動し、skaffold devコマンドを実行してみます。

起動に成功するとターミナル上に1秒ごとに[getting-started] Hello world!が表示されます。KubernetesのPodを見てみましょう。

Kubernetes上で正常にPodが起動しています。続いて、ソースコードの編集をしてみます。編集するファイルはSkaffoldを起動したディレクトリにあるmain.goファイルです。

fmt.Println("Hello world!")の部分を適当な文言に修正して、保存をしてください。以下の例では”Hello Hello!”という文言に変更してみました。

保存が完了すると、Skaffoldがソースコードの変更を検知し、再度ビルドからデプロイまでのフローが実行されます。ターミナル上には修正した文言が新たに表示されることが確認できます。

 

サンプルアプリケーションの停止

サンプルアプリケーションをCtrl + cで停止します。skaffold devで実行したアプリケーションを停止した場合、skaffoldのクリーニング処理が実行され、対象のリソースが削除されます。

Kubernetes上のPodが削除されか確認をしてみましょう。

Podも削除されました。

 

さいごに

Skaffoldを利用することで、ローカルでのKubernetesアプリケーション開発を楽にすることができます。ソースコードの変更をトリガーとしてコンテナのビルドからデプロイが自動化されるので、ビルドやデプロイのミスもなくすことができます。

ローカルでのビルドやデプロイなど、何度も繰り返し行う作業は可能な限り自動化して、手間やミスの削減につなげていきましょう。

スカイアーチ ファンタジー研究室

スカイアーチ ファンタジー研究室

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.