@@ -25,6 +25,7 @@ Currently, the following types of volume sources can be projected:
2525* [ ` configMap ` ] ( /docs/concepts/storage/volumes/#configmap )
2626* [ ` serviceAccountToken ` ] ( #serviceaccounttoken )
2727* [ ` clusterTrustBundle ` ] ( #clustertrustbundle )
28+ * [ ` podCertificate ` ] ( #podcertificate )
2829
2930All sources are required to be in the same namespace as the Pod. For more details,
3031see the [ all-in-one volume] ( https://git.k8s.io/design-proposals-archive/node/all-in-one-volume.md ) design document.
@@ -96,6 +97,60 @@ By default, the kubelet will prevent the pod from starting if the named ClusterT
9697
9798{{% code_sample file="pods/storage/projected-clustertrustbundle.yaml" %}}
9899
100+ ## podCertificate projected volumes {#podcertificate}
101+
102+ {{< feature-state feature_gate_name="PodCertificateRequest" >}}
103+
104+ {{< note >}}
105+ In Kubernetes {{< skew currentVersion >}}, you must enable support for Pod
106+ Certificates using the ` PodCertificateRequest ` [ feature
107+ gate] ( /docs/reference/command-line-tools-reference/feature-gates/ ) and the
108+ ` --runtime-config=certificates.k8s.io/v1alpha1/podcertificaterequests=true `
109+ kube-apiserver flag.
110+ {{< /note >}}
111+
112+ The ` podCertificate ` projected volumes source securely provisions a private key
113+ and X.509 certificate chain for pod to use as client or server credentials.
114+ Kubelet will then handle refreshing the private key and certificate chain when
115+ they get close to expiration. The application just has to make sure that it
116+ reloads the file promptly when it changes, with a mechanism like ` inotify ` or
117+ polling.
118+
119+ Each ` podCertificate ` projection supports the following configuration fields:
120+ * ` signerName ` : The
121+ [ signer] ( /docs/reference/access-authn-authz/certificate-signing-requests#signers )
122+ you want to issue the certificate. Note that signers may have their own
123+ access requirements, and may refuse to issue certificates to your pod.
124+ * ` keyType ` : The type of private key that should be generated. Valid values are
125+ ` ED25519 ` , ` ECDSAP256 ` , ` ECDSAP384 ` , ` ECDSAP521 ` , ` RSA3072 ` , and ` RSA4096 ` .
126+ * ` maxExpirationSeconds ` : The maximum lifetime you will accept for the
127+ certificate issued to the pod. If not set, will be defaulted to ` 86400 ` (24
128+ hours). Must be at least ` 3600 ` (1 hour), and at most ` 7862400 ` (91 days).
129+ The signer is allowed to issue a certificate with a lifetime shorter than what
130+ you've specified.
131+ * ` credentialBundlePath ` : Relative path within the projection where the
132+ credential bundle should be written. The credential bundle is a PEM-formatted
133+ file, where the first block is a "PRIVATE KEY" block that contains a
134+ PKCS #8 -serialized private key, and the remaining blocks are "CERTIFICATE"
135+ blocks that comprise the certificate chain (leaf certificate and any
136+ intermediates).
137+ * ` keyPath ` and ` certificateChainPath ` : Separate paths where Kubelet should
138+ write * just* the private key or certificate chain.
139+
140+ {{< note >}}
141+
142+ Most applications should prefer using ` credentialBundlePath ` unless they need
143+ the key and certificates in separate files for compatibility reasons. Kubelet
144+ uses an atomic writing strategy based on symlinks to make sure that when you
145+ open the files it projects, you read either the old content or the new content.
146+ However, if you read the key and certificate chain from separate files, Kubelet
147+ may rotate the credentials after your first read and before your second read,
148+ resulting in your application loading a mismatched key and certificate.
149+
150+ {{< /note >}}
151+
152+ {{% code_sample file="pods/storage/projected-podcertificate.yaml" %}}
153+
99154## SecurityContext interactions
100155
101156The [ proposal] ( https://git.k8s.io/enhancements/keps/sig-storage/2451-service-account-token-volumes#proposal ) for file permission handling in projected service account volume enhancement introduced the projected files having the correct owner permissions set.
0 commit comments