Pod から外部のVault を利用する - その1
自分備忘録用メモ。前の記事でデプロイしたTKGm v1.4 環境にデプロイしたPod から、外部Vault を利用する際の手順です。
手順
- Vault のデプロイ
- Vault Key-Value シークレットエンジンの有効化
- Kubernetes 環境の準備
- Pod のデプロイ
- 外部Vault 用のサービスとエンドポイントのデプロイ
- Vault Agent Injector のデプロイ
- Vault Agent Injector を使ったPod / 外部Vault 連携
Vault のデプロイ
Vault のバックエンドにはConsul を利用し、Vault をデプロイしていきます。Vault のconfiguration は以下の様な形で設定しています。
Consul は以下のコマンドでVault と同じホスト上にデプロイしています。
Consul を起動したら、Vault を以下の様に起動します。
別ターミナルから、Vault の初期化を行います。
Vault Key-Value シークレットエンジンの有効化
Vault はsealed
状態なので、init.out
に記載されているUnseal Key
を利用して、unseal
します。3つのUnseal Key
の任意の2つを使って、vault operator unseal
コマンドを2度実行します。
unseal
されたら、vault login $ROOT_TOKEN
します。最初の状態で利用出来るシークレットエンジンを確認してみます。
Vault Key-Value シークレットエンジンの有効化
まず、Vault のKey-Value シークレットエンジンを有効化します。パスはsecret を指定します。
有効化したKVシークレットに値をインプットします。
入力した値を確認してみます。
ここでセットしたKVデータを後ほど、Pod から利用します。
Kubernetes 環境の準備
こちらの手順と同様にTanzu Kubernetes Cluster(TKC) を準備します。TKC 上にサンプルPod 等はデプロイしていきます。
Pod のデプロイ
TKC 環境にサンプルPod をデプロイします。先ずは、Pod のマニフェストファイルにVault アドレス等を記述する方法で、試してみます。
最初に、TKC を操作するノードから、ちゃんとVault にアクセス出来るか確認します。
次に、サービスアカウントを作成します。
続いて、マニフェストファイルを作成します。
作成したマニフェストを利用し、Pod を作成します。
作成したPod でコマンドを実行し、Vault のK/V シークレットエンジンにストアした値を取得します。
これは作成したPod
devwebapp
からWeb アプリケーションは、マニフェストファイルに記載されたトークンを使い、外部の Vault サーバーにリクエストを行い、secret/data/devwebapp/config
というパスに定義されたシークレットの情報を、Vault からのレスポンスという形で取得しています。次に、Vault 用のサービスをTKC に作成する形で外部のVault とやり取りする方法を確認します。
外部Vault 用のサービスとエンドポイントのデプロイ
TKC 環境にサービスとエンドポイントをデプロイし、そのサービスを利用し、Pod と外部のVault でやり取り出来る様に設定します。
デプロイしてある
devwebapp
からサービスを経由し、外部のVault にアクセス出来るか確認してみます。次にマニフェストファイルを
devwebapp-through-service.yaml
として作成し、上で作成したサービス経由でVault のシークレットを取得出来るか確認します。無事サービス経由で外部のVault からシークレットを取得する事が出来ました。
次に、Helm チャートを用いて、外部Vault と連携するためのVault Agent Injector を利用した方法を試してみます。
Vault Agent Injector は、Pod のマニフェストに記述したアノテーションの情報を元に、Vault の認証とシークレットの取得が出来る様になります。