「Kubernetesネイティブな開発を始めたいけれど、具体的にどんなツールを使えば良いかわからない」という方もいらっしゃるかと思います。そんな読者の皆さまに、今回はKubernetesネイティブなツールを一挙に紹介します。

→連載「Kubernetes入門」の過去回はこちらを参照。

フェーズ/レイヤ別の成果物

ソフトウエアはソースの状態から始まり、その後Dockerコンテナイメージになり、最終的には本番環境にデプロイされます。まるで、各フェーズの成果物が出世魚のように形を変えていくのです。

アーキテクチャのレイヤの観点では、k8sクラスタ上にコンテナベースのアプリケーションがデプロイされます。つまり、以下のようなフェーズ(列)とレイヤ(行)の2軸で成果物を定義することができ、成果物に応じた機能がツールに求められます。

レイヤ/フェーズ A. Dev B. Build C. Ship D. Run
1. アプリケーション 業務プログラム(Go、Java) 実行ファイル(jar、war) アーティファクトレジストリ(NEXUS) WebAPサーバ(nginx、Tomcat)
2. コンテナ コンテナ定義(Dockerfile) Dockerイメージ コンテナレジストリ(DockerHub) コンテナランタイム(containerd)
3. オーケストレータ マニフェスト(YAML) - 設定データストア(etcd) Kubernetesリソース(Pod、Deploymentなど)
※ 代表的な機能 コード補完、静的チェック ビルド レジストリ登録 デバッガ

連載で紹介するツール

本連載では、以下の3分野のツールを紹介していきます。

①開発ツール(A. Dev - B. Build - C. Ship)
DockerfileやKubernetesリソースを開発してデプロイするまで
②運用ツール(D. Run)
コンテナやKubernetesリソースのデバッグ
③セキュリティ関連ツール(Security:A. Dev - B. Build - C. Ship - D. Run)
マニフェストファイルの脆弱性チェックやイメージスキャン

今回は、①の開発ツールを取り上げ、②③については次回以降で紹介する予定です。

①開発ツール(Dev - Build - Ship)

Dev - Build - Shipの各フェーズにおいて求められる代表的な機能・対象・ツールは以下の通りです。

フェーズ 機能 対象 ツール
Dev コード補完、シンタックスチェック マニフェスト(YAML) YAML Language Support、 Visual Studio Code Kubernetes Tools
Dev 異なる環境への接続 クラウド上のインスタンスなど Visual Studio Code Remote Development Extension Pack、 Bridge to Kubernetes
Dev 静的チェック Dockerfile Hadolint、 dockerfile-lint
Dev 静的チェック マニフェスト(YAML) KubeLinter、 kube-score
Dev 差分管理 マニフェスト Kustomize
Dev、Build、Ship ビルド、レジストリ登録、リソース適用 - Skaffold、 Tilt
Build イメージビルド イメージ Docker、 Buildah、 Podman、 Cloud Native BuildPacks、 Jib、 kpack、 Kaniko
Ship 構築 Kubernetesクラスタ Rancher、 Helm、 Kind
Ship デプロイ Kubernetesリソース ArgoCD、 Tekton、 Spinnaker、 Terraform、 Flux2

以降では、いくつかピックアップして紹介します。

VSCodeで効率的に開発する:VSCode Extensions

まずは、開発する上でベースとなるIDE(VSCode)を使った機能を紹介します。「VSCode Extension」としてさまざまな機能が提供されています。今回紹介するExtension以外にもいろいろな機能が提供されていますので、お好みのものを使ってみると良いでしょう。

◆マニフェストの記述:Visual Studio Code Kubernetes Tools

Kubernetesマニフェストなどを記述する際は、VSCodeなどのIDEの利用が便利です。Kubernetes用のVSCode Extensionを追加し、効率的な作業を実現します。例えば、「Visual Studio Code Kubernetes Tools」を利用することで、コード補完やシンタックスチェックなどの機能が活用できます。

◆リモート環境への接続:Visual Studio Code Remote Development Extension Pack、Bridge to Kubernetes

「Visual Studio Code Remote Development Extension Pack」を利用することで、VSCodeからコンテナ、リモートマシン、WSL(Windows Subsystem for Linux)のファイル操作が可能になります。また、「Bridge to Kubernetes」を使うと、異なる環境に置かれたKubernetesクラスタへ接続しながら開発することができます。

このように、異なる環境を開発PCから透過的に利用可能な状態にすることで、開発作業の効率化を図ることができます。

CLIベースのツールで開発する

VSCodeの環境以外にもCLI(Command Line Interface)ベースのツールを活用して、ターミナルでの作業を行うこともあります。以下に紹介するCLIベースのツールはCI/CDへの組み込みにも活用可能です。今回紹介するもの以外にもさまざまなツールがあるので、ローカルでのCLIを用いた開発や、CI/CD環境の構築のためにいろいろなツールを試してみると良いでしょう。

◆Dockerfileのチェック:Hadolint

「Hadolint(Haskell Dockerfile Linter)」はDockerfileの静的解析ツールです。Dockerfileを解析して、構文エラーやベストプラクティスに沿っていない記述などの警告やエラーを検出します。これにより、開発者は手作業でDockerfileをチェックする手間を省くことができます。

brewコマンド1つで非常に簡単にインストールできます。

$ brew install hadolint

対象のDockerfileを指定し、CLIベースで実行します。

$ hadolint Dockerfile

例えば、以下のようなチェック結果が出力されます。

Dockerfile:1 DL3006 warning: Always tag the version of an image explicitly

どのようなチェックルールがあるかは、公式サイトをご参照ください。 以下のようにconfigファイルを渡すことで、カスタムルールを追加することもできます。

$ hadolint --config /path/to/config.yaml Dockerfile

また、CIへの組み込みも容易で、GitHub ActionsやGitlab CIなどへ組み込むことができます。

◆マニフェストのチェック:KubeLinter

「KubeLinter」は、Kubernetesのマニフェスト(YAML)やHelmチャートの静的解析ツールです。マニフェストやHelmチャートを解析して構文エラーやベストプラクティスに沿っていない記述などの警告やエラーを検出します。これにより、開発者は手作業でマニフェストやHelmチャートをチェックする手間を省くことができます。

KubeLinterも、brewコマンド1つで非常に簡単にインフトールできます。

$ brew install kube-linter

対象のマニフェストを指定し、CLIベースで実行します。

$ kube-linter lint pod.yaml

例えば、以下のようなチェック結果が出力されます。

pod.yaml: (object: /security-context-demo /v1, Kind=Pod) container "sec-ctx-demo" does not have a read-only root file system (check: no-read-only-root-fs, remediation: Set readOnlyRootFilesystem to true in your container's securityContext.)

~中略~

Error: found 3 lint errors

どのようなチェックルールがあるかは公式サイトをご参照ください。カスタムルールを追加することもできます。

前述のHadolintと同様CIへの組み込みも容易です。例えば、GitHub Actionsの[.github/workflows/]フォルダに、kubelint.ymlを設定することでCIパイプラインに組み込むことができます。詳細は公式サイトをご参照ください。

- name: Scan yamls
  id: kube-lint-scan
  uses: stackrox/kube-linter-action@v1
  with:
    directory: yamls
    config: .kube-linter/config.yaml

◆複数環境を差分管理する:Kustomize

「Kustomize」は、複数の環境や設定を効率的に管理ができるツールです。例えば、開発環境、ステージング環境、本番環境などの複数の環境があったとしても、共通部分をテンプレート化しておき、環境差分のみオーバレイとしてを適用・管理することができます。

詳細は本連載の第22回「Kustomizeを使ってKubernetesでDevOps」をご参照ください。

一気通貫の開発を実現する:Skaffold

「Skaffold」は、Kubernetes上でアプリケーションの開発、テスト、デプロイを効率的に行うためのツールです。

brewコマンド1つで非常に簡単にインフトールできます。

$ brew install skaffold

対象のマニフェストを指定し、CLIベースで実行します。

以下のコマンドを実行することでSkaffoldの設定ファイル(skaffold.yaml)を構築できます。

$ skaffold init

以下のコマンドを実行することで継続的デプロイメントを実現できます。 Skaffoldがファイル変更を検知するとアプリケーションがリビルドされます。

$ skaffold dev

CI/CDパイプラインに組み込むには以下のコマンドを利用します。

$ skaffold build
$ skaffold test
$ skaffold deploy

より詳細に知りたい方は、公式サイトのクイックスタートや、各コマンドの説明をご参照ください。

クラスタを構築する

Kubernetesを利用する際にベースとなる環境がKubernetesクラスタです。 MasterノードとWorkerノードから構成され、Kubernetesベースのアプリケーションの実行・管理します。 Kubernetesクラスタ構築ツールに関しては、本連載の第11回~第14回をご参照ください。

CI/CDやDevOpsを実現する

Kubernetesネイティブなアプリケーション構築・管理には、CI/CDやDevOpsは欠かせない機能要素です。CI/CDやDevOpsを実現するデプロイ関連ツールは、本連載の第15回~第21回をご参照ください。

* * *

今回は、Kubernetesネイティブな開発ツールにはどんなものがあるかを紹介しました。もちろん、今回紹介したツールが全てではありません。Dev-Build-Shipといったフェーズごとにさまざまなツールが存在します。いろいろなツールを試してみて、読者の皆様の開発を効率化する最強の環境を作ってみてはいかがでしょうか。本連載がそのきっかけになれば幸いです。

次回は、Kubernetesネイティブな運用ツールを紹介します。