新着: プロジェクトの最新情報についてはTwitterMastodonでご確認いただけます。

csi-driver

csi-driver は、cert-manager と連携して動作する Kubernetes の コンテナストレージインターフェース (CSI) ドライバープラグインです。

cert-manager csi-driver をマウントする Pod は、Certificate リソースを作成する必要なく、cert-manager から証明書を要求します。これらの証明書は、中間シークレットを作成せずに、Pod に直接マウントされます。

csi-driverを使う理由

  • 秘密鍵がノードから出てネットワーク経由で送信されることが決してないようにします。秘密鍵はメモリに保存され、ディスクに書き込まれるべきではありません。
  • アプリケーションレプリカごとに固有の鍵と証明書
  • Certificateリソースが少ないということは、YAMLの記述量が少なくて済むということです。
  • アプリケーションが終了すると、鍵と証明書は破棄されます。
  • 証明書の保存にSecretリソースが不要なため、RBACが簡素化されます。
  • 再起動後に保持する必要がない、一時的な短命の証明書(例:mTLSの証明書)に最適です。

csi-driverを使わない理由

  • ノードの再起動後も証明書を保持する必要がある場合
  • 複数のコンポーネントで同じ証明書を共有する必要がある場合

インストール

csi-driverのインストール方法については、インストールガイドを参照してください。

証明書の要求とマウント

csi-driverを使用して証明書を要求するということは、必要なものを正確に定義するために設定されたいくつかの属性を持つボリュームをマウントすることを意味します。

次の例は、/tlsに鍵証明書ペアをマウントするダミーアプリで、ca-issuerというcert-manager発行者によって署名され、my-service.sandbox.svc.cluster.localに対して有効なDNS名を持っています。

apiVersion: v1
kind: Pod
metadata:
name: my-csi-app
namespace: sandbox
labels:
app: my-csi-app
spec:
containers:
- name: my-frontend
image: busybox
volumeMounts:
- mountPath: "/tls"
name: tls
command: [ "sleep", "1000000" ]
volumes:
- name: tls
csi:
driver: csi.cert-manager.io
volumeAttributes:
csi.cert-manager.io/issuer-name: ca-issuer
csi.cert-manager.io/dns-names: ${POD_NAME}.${POD_NAMESPACE}.svc.cluster.local

作成されると、CSIドライバはローカル(ポッド用)に秘密鍵を生成し、指定された属性に基づいてcert-managerから証明書を要求し、ポッドで使用できる状態の証明書を保存します。

発行が完了するまで、ポッドは保留状態のままになります。

クラスタの発行者の設定方法の詳細については、cert-managerのドキュメントこちらを参照してください。

注記 SelfSigned発行者は特殊なケースであるため、csi-driverではSelfSigned発行者を使用することはできません。

サポートされているボリューム属性

csi-driverは、cert-manager APIで利用可能なすべての可能な値と完全な機能パリティを持つことを目指しています。現在、次の値をサポートしています。

属性説明デフォルト
csi.cert-manager.io/issuer-name証明書要求に署名する発行者の名前。ca-issuer
csi.cert-manager.io/issuer-kind証明書要求に署名する発行者の種類。IssuerClusterIssuer
csi.cert-manager.io/issuer-group発行者が属するグループ名。cert-manager.ioout.of.tree.foo
csi.cert-manager.io/common-name証明書の共通名(変数をサポート)。my-cert.foo
csi.cert-manager.io/dns-names証明書が要求されるDNS名。少なくとも1つのDNS名、IP、またはURI名がなければなりません(変数をサポート)。a.b.foo.com,c.d.foo.com
csi.cert-manager.io/ip-sans証明書が要求されるIPアドレス。192.0.0.1,192.0.0.2
csi.cert-manager.io/uri-sans証明書が要求されるURI名(変数をサポート)。spiffe://foo.bar.cluster.local
csi.cert-manager.io/duration署名された証明書の有効期間。720h1880h
csi.cert-manager.io/is-ca証明書を証明機関としてマークします。falsetrue
csi.cert-manager.io/key-usages証明書要求のキーの使用を設定します。digital signature,key enciphermentserver auth,client auth
csi.cert-manager.io/key-encodingキーのエンコーディング形式(PKCS1またはPKCS8)を設定します。PKCS1PKCS8
csi.cert-manager.io/certificate-file証明書ファイルを保存するファイル名。tls.crtfoo.crt
csi.cert-manager.io/ca-fileCA証明書ファイルを保存するファイル名。ca.crtfoo.ca
csi.cert-manager.io/privatekey-fileキーファイルを保存するファイル名。tls.keyfoo.key
csi.cert-manager.io/fs-group書き込まれたファイルのFSグループを設定します。消費コンテナのrunAsGroupの値とペアにして一致させる必要があります。2000
csi.cert-manager.io/renew-before有効期限前に証明書を更新する時間。要求された期間の3分の1にデフォルト設定されます。$CERT_DURATION/372h
csi.cert-manager.io/reuse-private-key証明書を更新する際に同じ秘密鍵を再利用します。falsetrue
csi.cert-manager.io/pkcs12-enable署名された証明書チェーンと秘密鍵をPKCS12ファイルとして書き込むことを有効にします。true
csi.cert-manager.io/pkcs12-filenamePKCS12ファイルを書き込むファイルの場所。csi.cert-manager.io/keystore-pkcs12-enabletrueに設定されている必要があります。keystore.p12tls.p12
csi.cert-manager.io/pkcs12-passwordPKCS12ファイルをエンコードするために使用されるパスワード。PKCS12が有効な場合(csi.cert-manager.io/keystore-pkcs12-enable: true)に必要です。my-password

変数

次の属性は、マウントポッドの要求が行われたときに評価される変数をサポートしています。これらの変数は、マウントポッドの値を含むSANを持つ要求を作成するのに役立ちます。

csi.cert-manager.io/common-name
csi.cert-manager.io/dns-names
csi.cert-manager.io/uri-sans

変数は、go os.Expand構造に従います。これは、UNIXシェルで一般的に期待されるものです。CSIドライバは、次の変数にアクセスできます。

${POD_NAME}
${POD_NAMESPACE}
${POD_UID}
${SERVICE_ACCOUNT_NAME}

使用例

volumeAttributes:
csi.cert-manager.io/issuer-name: ca-issuer
csi.cert-manager.io/dns-names: "${POD_NAME}.${POD_NAMESPACE}.svc.cluster.local"
csi.cert-manager.io/uri-sans: "spiffe://cluster.local/ns/${POD_NAMESPACE}/pod/${POD_NAME}/${POD_UID}"
csi.cert-manager.io/common-name: "${SERVICE_ACCOUNT_NAME}.${POD_NAMESPACE}"

マウントポッドのServiceAccountを使用した証明書の要求

csi-driver DaemonSetでフラグ--use-token-requestが有効になっている場合、CertificateRequestリソースは、マウントポッドのServiceAccountによって作成されます。これは、approver-policyと組み合わせて、ServiceAccountごとに高度なポリシー制御を有効にすることができます。

このフラグを有効にして、ポッドServiceAccountにCertificateRequestの作成権限を与えるようにしてください。

# WARNING: This RBAC will enable any identity in the cluster to create
# CertificateRequests and is dangerous to use in production. Instead, you should
# give permissions only to identities which need to be able to create certificates.
# This would be done via scoping the set of identities in the `ClusterRoleBinding` `subjects` stanza.
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cert-manager-csi-driver-all-cr-create
rules:
- apiGroups: ["cert-manager.io"]
resources: ["certificaterequests"]
verbs: [ "create" ]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cert-manager-csi-driver-all-cr-create
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cert-manager-csi-driver-all-cr-create
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:authenticated