「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回をご参照ください。
- 第11回:k8s構築ツールの選択肢「Rancher」
- 第12回:k8s構築ツールの選択肢「Helm」
- 第13回:k8s構築ツールの選択肢「Kubespray/kops」
- 第14回:その他の学習用サービス - MicroK8s/k3s/Katacoda
CI/CDやDevOpsを実現する
Kubernetesネイティブなアプリケーション構築・管理には、CI/CDやDevOpsは欠かせない機能要素です。CI/CDやDevOpsを実現するデプロイ関連ツールは、本連載の第15回~第21回をご参照ください。
- 第15回:CI/CDにおける潮流 - CIOpsからGitOpsへ
- 第16回:Jenkins Xを使ってKubernetesでDevOps
- 第17回:「ArgoCD」を使ってKubernetesでDevOps
- 第18回:Tektonを使ってKubernetesでDevOps
- 第19回:Spinnakerを使ってKubernetesでDevOps
- 第20回:Terraformを使ってKubernetesでDevOps
- 第21回:Flux2(GitOps Toolkit)を使ってKubernetesでDevOps
* * *
今回は、Kubernetesネイティブな開発ツールにはどんなものがあるかを紹介しました。もちろん、今回紹介したツールが全てではありません。Dev-Build-Shipといったフェーズごとにさまざまなツールが存在します。いろいろなツールを試してみて、読者の皆様の開発を効率化する最強の環境を作ってみてはいかがでしょうか。本連載がそのきっかけになれば幸いです。
次回は、Kubernetesネイティブな運用ツールを紹介します。