Pod から外部のVault を利用する - その2
自分備忘録用メモ。前の記事でデプロイしたTKGm v1.4 環境にデプロイしたPod から、外部Vault を利用する際の手順です。ここでは、Vault Agent Injector のデプロイと、Vault Agent Injector を使って外部Vault と連携します。
手順
- Vault のデプロイ
- Vault Key-Value シークレットエンジンの有効化
- Kubernetes 環境の準備
- Pod のデプロイ
- 外部Vault 用のサービスとエンドポイントのデプロイ
- Vault Agent Injector のデプロイ
- Vault Agent Injector を使ったPod / 外部Vault 連携
Vault Agent Injector のデプロイ
helm chart を利用して、Vault agent injector のデプロイします。アノテーション
injector.externalVaultAddr
に外部Vaultのサービスを指定し、デプロイします。 この処理で、
vault
というサービスアカウントが作成されます。このサービスアカウントのシークレットは、Vault のKubernetes を用いた認証設定の際に必要になります。シークレット名を変数に入れておきます。
Vault のAuth Method でKubernetes を有効化します。
Kubernetes を用いた認証では、この後設定するKubernetes のエンドポイントに対して、サービスアカウントの認証を行い、ポリシーに基づいた権限が付与されたトークンを返す様になります。
正しく設定するには、サービスアカウントのJSON Web トークン(JWT)、Kubernetes のCA 証明書、Kubernetes のAPI エンドポイントのURL が必要になります。
この情報を元に、Vault のKubernetes 接続設定を行います。
サービスアカウント
internal-app
に付与するポリシーの作成を行います。パスsecret/data/devwebapp/config
に対して、Read権限を持ったポリシーを作成します。サービスアカウント、Namespace、ポリシー、TTLを設定したロールを作成します。
このロールは、Kubernetes のサービスアカウント<
internal-app
>、Namespace <vault-test
> に対して、ポリシー<devwebapp
> が有効なロールです。このロールで認証後に返されるトークンは、ポリシー<devwebapp
> に基づいた権限が付与されており、有効期限(Time-Tol-Lived)は24時間になります。Vault Agent Injector を使ったPod / 外部Vault 連携
Vault Agent Injector を使って、Pod から外部Vault のKVシークレットにストアされている値を利用します。Vault Agent Injector は、マニフェストに特定のアノテーションが含まれている場合にのみ、Pod またはDeployment に対してデプロイされます。
指定したアノテーションは、prefix として
vault.hashicorp.com
が付きます。agent-inject
: Vault Agent Injector を有効化します。role
: Vault のKubernetes 認証のロールを指定します。agent-inject-secret-FILEPATH
: コンテナの/vault/secrets
ディレクトリに書き込まれるcredentials.txt
というファイルのパスのプレフィックスとして指定します。値はVault で定義されたシークレットのパスです。
以前の方法では、アプリケーションの環境変数に
VAULT_ADDR
とVAULT_TOKEN
を指定していましたが、Vault Agent Injector を利用する事でこれらは必要なくなりますので、コメントアウトしています。アプリケーションをデプロイします。
Vault Agent Injector により、Pod 内に追加のコンテナが作成され、アプリケーションコンテナのファイルパス
ファイル
/vault/secrets/credentials.txt
にシークレットが自動的に書き込まれます。ファイル
/vault/secrets/credentials.txt
に書き込まれたシークレットを、devwebapp-with-annotations
Pod で確認します。 テンプレートを適用することで、アプリケーションのニーズに合わせてこのデータを構造化する事も可能です。