CSIドライバー
cert-manager csi-driver を使用した Pod の mTLS の有効化
csi-driver は、Kubernetes クラスター内の Pod 用の証明書のシークレットレスプロビジョニングを容易にします。
このドライバーを使用すると、プライベートキーとそれに対応する署名付き証明書が各 Pod に一意となり、Pod がスケジュールされているノードのディスクに保存されます。
証明書キーペアのライフサイクルは、Pod のライフサイクルと一致します。証明書は Pod の作成時に発行され、終了時に破棄されます。
このドライバーは、実行中の証明書の更新もオンザフライで処理します。
CSIドライバーとは?
Kubernetes CSIドライバーは、Kubernetesクラスターにデプロイされるストレージプラグインです。
これは、Pod仕様のボリュームリクエストを処理できます。例えば、デフォルトで有効になっているSecret
、ConfigMap
、またはhostPath
ボリュームドライバーのように機能します。
cert-managerのcsi-driverの場合、一時ボリュームが使用されます。つまり、ボリュームはPodの作成と終了に合わせて作成および破棄されます。
これは、ボリュームがPodごとに一意の証明書とキーで作成されるだけでなく、秘密キーがホストのノードから離れることがなく、そのPodテンプレートの目的の証明書がPodの仕様またはテンプレートに合わせて定義できることを意味します。
警告: CSIドライバーの使用は主に、クラスターでPKIをサポートし、TLSを容易にすることを目的としています。そのため、通常はプライベート認証局を発行に使用する必要があります。単一ドメインに対して発行できる証明書の数に厳格なレート制限を維持するLet's Encryptなどのパブリック認証局を使用することは推奨されません。Podと同様に、これらの証明書キーペアは破棄されるように設計されており、通常の動作中にいつでも作成および破棄できます。
仕組み
CSI仕様は、複数のプラットフォーム間で単一のドライバーを移植できるように、コンテナオーケストレーションプラットフォーム用のストレージドライバーを構築するためのプロトコルおよび標準であり、インフラストラクチャの観点からドライバーがどのように動作すべきかについて一貫した仕様を概説しています。cert-managerはKubernetesクラスターでのみ実行されるように設計されているため、cert-manager CSIドライバーも同様です。
ドライバーはDaemonSetとしてデプロイされる必要があり、これは各ノードでドライバーの単一のインスタンスを実行できることを意味します。単一のノードで複数のインスタンスを実行すると、ドライバーは機能しません。ドライバーが実行されるノードのセットは、PodテンプレートのnodeSelector
を使用して制限できます。
cert-manager CSIボリュームを指定してPodがノードにスケジュールされると、そのノードで実行されているKubelet
は、そのPodの情報とインラインボリューム属性から詳細な属性を含むNodePublishVolume
呼び出しをそのノードのドライバーに送信します。これにより、ドライバーはボリューム属性から構築された情報を使用して、秘密キーと、そのキーに基づいた証明書リクエストを生成します。ドライバーは、Podと同じ名前空間にCertificateRequest
リソースを作成します。これが有効な場合、cert-managerは署名付き証明書を返します。
結果として得られる署名付き証明書と生成されたキーは、Podのファイルシステムにマウントされるノードのファイルシステムに書き込まれます。ドライバーはノードのファイルシステムにアクセスする必要があるため、特権が必要です。マウントされると、Podはマウントパスで定義されているように、ファイルシステムで使用できる一意の秘密キーと証明書を使用して実行を開始します。
デフォルトでは、ドライバーは作成された証明書を追跡し、いつ更新のマークを付ける必要があるかを監視します。これが発生すると、ドライバーは新しい署名付き証明書を要求し、成功すると、パス内の既存の証明書を上書きします。
Podが終了のマークを付けられると、NodeUnpublishVolume
呼び出しがノードのドライバーに対して行われ、これによりノードのファイルシステムから証明書とキーが破棄されます。
CSIドライバーは、そのPodが終了した場合でも、その完全な状態を復元できます。