はじめまして。VMware の伊藤です。Tanzu 製品のプラットフォームアーキテクトとして働いており、開発と運用双方の経験があります。この記事では Kubernetes にソースコードから Dockerfile なしにセキュアなコンテナイメージをビルドする Tanzu Build Service のバージョン 1.2.1 のインストール法を紹介します。
Tanzu Build Service (以下TBS)はコンテナイメージをビルドする Kubernetes (以下K8s)アプリケーションです。多くのコンテナユーザーは「docker コマンドで Dockerfile をビルドする」ということを手動なり、CI パイプラインなりで実現していますが、TBS はそれと似たようなことを以下の特徴をもって実施します。
- サービスがソースコードを判定してビルド手法を決定する(Dockerfile不要)
- アプリケーションのGitリポジトリが更新されたら自動でビルド
- システムにセキュリティアップデートを施すと、既存アプリのイメージを自動でビルド
- ビルドしたイメージはレジストリに自動でPushされる
- サービス側でアプリ(言語やフレームワーク)のベストプラクティスを適用する
- サービス側でイメージの脆弱性対応の対処を実施する
上記をまとめると、TBS はセキュアなベストプラクティスに沿ったコンテナイメージを構築するための「簡易的な CI パイプライン」を労力少なく提供するということです。簡易的なパイプラインでよければ自ら構築する手間を省けますし、ユニットテストやコンテナスキャンを CI に含める場合であっても TBS を使うことで全体構成を簡素化できます。
以下に TBS の構成とコンテナイメージのビルドの流れをイメージ図として記載します。
また、参考までに同一の Java Spring Boot アプリケーションの Dockerfile と TBS でのビルド結果の脆弱性比較図を以下に記載します。
脆弱性の数を比較すると、Dockerfile でのビルドより、TBS でのビルドのほうが脆弱性が少ないことが確認できるかと思います。「脆弱性を放置する」という対応を許容しないのであれば、これは開発者なり運用者なりが Dockerfile を頑張って調整して解消する必要があります。一方、TBS はそれらの作業を開発者/運用者のかわりにシステムが肩代わりします。
なお、TBS でビルドされたコンテナイメージは、TBS を持つ K8s クラスタだけでなく、他の K8s クラスタで利用することも可能です。たとえば、AWS 上の K8s でビルドして作成したイメージを、オンプレミスの K8s 環境に持ってきて利用するといったことも可能です。もちろん、弊社以外の K8s で利用していただいて問題ありません。
TBS を構築できる K8s 環境と導入手順
TBS は一般的な K8s のアプリというかたちで提供されていますので、弊社の K8s 製品である TKG や vSphere with Tanzu はもちろん、OSS の K8s や弊社以外のおおかたのベンダー製 K8s (DaemonSetなどの一部機能を省いた特殊なK8sなどは除く)にもインストールをして動作させることができます。そのため、TBS の利用ユーザーとしては「基盤としては VMware の K8s は使っていないものの、ビルドする仕組みのみ TBS を採用している」というパターンも多いです。
この記事では誰でも利用できる OSS の Minikube 上に TBS を構築する流れを紹介しますが、弊社や他ベンダー様の K8s を利用している場合も同様の手順で導入することが可能です。
この記事では以下の流れで TBS のインストールの作業とその解説を実施します。
- K8s 基盤の用意 (Ubuntu 20.04 LTS への Minikube のインストール)。一般的トピックなので割愛
- K8s 操作端末への TBS インストールに必要なツールの用意
- TBS インストール作業
- インストールできたかの確認
TBS をインストールする K8s の基盤の注意事項ですが「ビルドをするためのコンテナイメージ(たとえば言語のビルドパックや、ベース OS イメージ)を大量に利用する」ため、K8s のノード自体のストレージを最低 50G 程度与えるようにしてください。今回は Minikube をインストールする Ubuntu (K8sノードとなる)を以下のスペックで用意しました。
- OS: Ubuntu 20.04 LTS
- IP: 固定
- CPU: 2コア
- メモリ: 8G
- ストレージ: 100G
また、ビルドをするための一時的な「コンテナがマウントするストレージ」が必要ですので、K8s の Storage Class にデフォルトのものを用意しておいてください。Minikube や VMware の K8s には最初から Storage Class のデフォルトが用意されていますので、これらでは特に考慮は不要です。
なお、この例では TBS 自体に話を集中させるために K8s の構成を簡素化していますが、冗長化や Day2運用(アップグレードや増設、故障時の対応)などを考慮すると、大切な環境では自組織で利用しているプロダクションレディな K8s を利用するようにしてください。
K8s操作端末へのTBSインストールのためのツールの準備
TBS は K8s のアプリケーションとして動作しますので、TBS をいれたい K8s の操作端末にインストールを実施するのに必要なファイル群を用意します。今回は K8s として Minikube を利用しますので、その Minikube を動かしている Ubuntu 自体を操作端末として扱います。K8s を操作できる端末であればなんでも構わないため、お手元の Windows や MacOS でも構いません。
すでに Kubernetes 周りのツール群(kubectl)などは用意されているはずなので、それ以外の必要なツールを列挙します。
- Docker (コンテナイメージのPush/Pullのため)
- kpコマンドのバイナリ (TBSの操作ツール)
- Carvel Tools (インストール作業のヘルパーとなるバイナリファイル群)
- セキュリティ定義ファイル (descriptorと呼ばれる)
これらを Ubuntu にインストールしたり、実行ファイルとして配置したりします。
他には Ubuntu 上のツールではありませんが、以下も必要です。
- TBS のイメージをダウンロードできるVMwareアカウント (試用版などもあるので、試したければ弊社営業にお問い合わせください)
- TBS を構成するコンテナイメージを置くコンテナレジストリとそのアカウント
今回はコンテナレジストリとして自前で構築した Harbor を利用しますが、Docker Hub や AWS の ECR(Elastic Container Registry)のようなパブリックなレジストリを利用することも可能です。なお、TBSのコンテナイメージは無償公開されていない弊社製品ですので、Docker Hub のパブリックリポジトリなどにはシステムのコンテナイメージは置かないようにしてください。TBS でビルドをしたコンテナイメージをお客様判断でパブリックリポジトリに置くことは問題ありません。
それでは、ここからは TBS の公式ドキュメントに沿ってツール類の準備を実施します。
まず、公式ドキュメントにかかれている用に4つの Carvel のツール群をダウンロードしてください。
Installing Tanzu Build Service
- kapp
- ytt
- kbld
- imgpkg
英語となり申し訳ないのですが、リンク切れや古くなることを防ぐために、上記の本家ドキュメントのリンクをご利用ください。以下の図の場所です。
これらのツールは Linux/Windows/Mac と利用環境ごとにバイナリが用意されていますので、使う環境に応じたものをダウンロードしてください。今回は Ubuntu を使っていますので、Linux 用のイメージをダウンロードしています。
次に、利用するコンテナイメージの EULA(End User License Agreement)を承認してください。
- Tanzu Build Service
- Tanzu Build Service Dependencies
- Buildpacks for VMware Tanzu
- Stacks for VMware Tanzu
これは弊社が提供するコンテナイメージを犯罪などに利用しませんという誓約となります。これも以下の図の場所を参考に承認してください。
この作業は1アカウントにつき、1回だけ実施すれば大丈夫です。一度承認したら、今までのところは再度承認を求められたことはありません。
次に指定された残り2つのファイルをダウンロードします。
- kp CLI コマンド
- セキュリティ定義ファイル (Dependency Descriptor)
これも以下の図にかかれた箇所のリンクとなります。
ファイルのダウンロードが完了したら、それを Ubuntu の適切なフォルダに適切な権限で配置します。
今回はCarvelやkpなどのツール系は「/usr/local/bin」配下に実行権限をもたせてバージョンなどを省いた正しいコマンド名で配置し、TBSのセキュリティ定義ファイル(dscriptor-***)はユーザー root のホームディレクトリに配置しています。これらのファイルはこのサンプルにあるものではなく、ドキュメントで指定された最新のバージョンをご利用ください。
ファイル群を置く操作が完了したら、つづいて dockerのインストールをし、この作業ホスト(Minikube をインストールした Ubuntu)で docker と K8s がともに正常に使えるかを確認します。
今回は「docker container ls」「kubectl get nodes」が正常に使えているので、Docker と K8s はともに問題ありません。
以上で K8s クライアントでの下準備は終了です。
なお、今回は手作業の工程を示しましたが、私はこのインストーラーの環境セットアップは Ansible にて自動化しております。TBSを様々な場所で利用する場合は導入を自動化することをおすすめします。
TBSのインストール作業
下準備が揃いましたので、ここからは TBS のインストール作業を開始します。インストールのおおまかな流れは以下となります。
- 利用するコンテナレジストリに docker コマンドでログイン
- VMware のコンテナレジストリから TBS 用のイメージを取得
- 取得した TBS のイメージを自分のコンテナレジストリのリポジトリにアップロード
- TBSを K8s アプリケーションとして展開
- TBS にセキュリティ定義ファイルを適用する
主要なステップを以下に図示します。
今回はこれらの作業を root ユーザーとして実施してしまいます。
まず最初に2つのコンテナレジストリにログインをします。自分のレジストリやリポジトリといった情報は今後何度も利用しますのでシェル上で変数登録していますが、毎回手打ちでも構いません。今回は「harbor.yuichi.cloud」という Let’s encrypt の証明書を持った私個人の Harbor で構築されたコンテナレジストリをユーザー admin として利用しています。なお、自己証明書を使ったコンテナレジストリを使う場合は、Docker にその対処をしてください。
次に TBS のコンテナイメージを自分のコンテナリポジトリにコピーする作業を実施します。これには Carvel のツールを使います。
コピーが終了したら、このイメージをローカルに落とす作業を実施します。これも Carvel のツールを使います。
そして、K8s にたいして TBS をインストールする作業を実施します。これも Carvel のツールを使います。
これらのコマンドの詳細は先に提示した TBS の公式ドキュメントのインストールページをご参照ください。
最後にインストールした TBS にたいして、セキュリティ定義を与えます。こうすることで、イメージのビルドに必要なビルドパックと呼ばれるビルド用のコンテナや、作成するイメージのベースとなるベースOSのコンテナイメージを TBS が取得してきます。
これらの作業も複数環境で毎回手で実施すると大変ですので、スクリプト化などを実施してもよいかもしれません。
インストールが完了したかの確認
最後にインストールが完了したかを、TBS のビルドパックが取り込まれているかを kp コマンドで確認することでチェックします。
kp コマンドの詳細は TBS 利用法の記事で紹介します。
以上で TBS のインストールに関する本記事を終了します。TBS の具体的な利用法に関しては別の記事にて取り扱います。ご拝読ありがとうございました。