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: v1kind: Podmetadata:name: my-csi-appnamespace: sandboxlabels:app: my-csi-appspec:containers:- name: my-frontendimage: busyboxvolumeMounts:- mountPath: "/tls"name: tlscommand: [ "sleep", "1000000" ]volumes:- name: tlscsi:driver: csi.cert-manager.iovolumeAttributes:csi.cert-manager.io/issuer-name: ca-issuercsi.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 | 証明書要求に署名する発行者の種類。 | Issuer | ClusterIssuer |
csi.cert-manager.io/issuer-group | 発行者が属するグループ名。 | cert-manager.io | out.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 | 署名された証明書の有効期間。 | 720h | 1880h |
csi.cert-manager.io/is-ca | 証明書を証明機関としてマークします。 | false | true |
csi.cert-manager.io/key-usages | 証明書要求のキーの使用を設定します。 | digital signature,key encipherment | server auth,client auth |
csi.cert-manager.io/key-encoding | キーのエンコーディング形式(PKCS1またはPKCS8)を設定します。 | PKCS1 | PKCS8 |
csi.cert-manager.io/certificate-file | 証明書ファイルを保存するファイル名。 | tls.crt | foo.crt |
csi.cert-manager.io/ca-file | CA証明書ファイルを保存するファイル名。 | ca.crt | foo.ca |
csi.cert-manager.io/privatekey-file | キーファイルを保存するファイル名。 | tls.key | foo.key |
csi.cert-manager.io/fs-group | 書き込まれたファイルのFSグループを設定します。消費コンテナのrunAsGroup の値とペアにして一致させる必要があります。 | 2000 | |
csi.cert-manager.io/renew-before | 有効期限前に証明書を更新する時間。要求された期間の3分の1にデフォルト設定されます。 | $CERT_DURATION/3 | 72h |
csi.cert-manager.io/reuse-private-key | 証明書を更新する際に同じ秘密鍵を再利用します。 | false | true |
csi.cert-manager.io/pkcs12-enable | 署名された証明書チェーンと秘密鍵をPKCS12ファイルとして書き込むことを有効にします。 | true | |
csi.cert-manager.io/pkcs12-filename | PKCS12ファイルを書き込むファイルの場所。csi.cert-manager.io/keystore-pkcs12-enable がtrue に設定されている必要があります。 | keystore.p12 | tls.p12 |
csi.cert-manager.io/pkcs12-password | PKCS12ファイルをエンコードするために使用されるパスワード。PKCS12が有効な場合(csi.cert-manager.io/keystore-pkcs12-enable: true )に必要です。 | my-password |
変数
次の属性は、マウントポッドの要求が行われたときに評価される変数をサポートしています。これらの変数は、マウントポッドの値を含むSANを持つ要求を作成するのに役立ちます。
csi.cert-manager.io/common-namecsi.cert-manager.io/dns-namescsi.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-issuercsi.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: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:name: cert-manager-csi-driver-all-cr-createrules:- apiGroups: ["cert-manager.io"]resources: ["certificaterequests"]verbs: [ "create" ]---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: cert-manager-csi-driver-all-cr-createroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cert-manager-csi-driver-all-cr-createsubjects:- apiGroup: rbac.authorization.k8s.iokind: Groupname: system:authenticated