協助改善此頁面
想要為此使用者指南做出貢獻? 捲動至此頁面底部,然後在 上選取編輯此頁面 GitHub。您的貢獻將幫助我們的使用者指南更適合所有人。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 保護工作負載 Kubernetes certificates
所以此 Kubernetes 憑證會API自動化 X.509 CertificateSigningRequest
(CSR) 資源來請求指定簽署者簽署憑證。您的請求在簽署之前獲得核准或拒絕。Kubernetes 支援具有定義明確的行為的內建簽署者和自訂簽署者。如此一來,用戶端可以預測其 會發生什麼情況CSRs。如需憑證簽署的相關資訊,請參閱 Certificate Signing Requests
其中一個內建簽署者是 kubernetes.io/legacy-unknown
。CSR 資源v1beta1
API的 承兌了此舊式未知的簽署者。不過,穩定 v1
API CSR不允許 signerName
設定為 kubernetes.io/legacy-unknown
。
Amazon EKS版本 1.21
和更早版本允許 legacy-unknown
值作為 signerName
中的 v1beta1
CSR API。這API可讓 Amazon EKS Certificate Authority (CA) 產生憑證。不過,在 Kubernetes 版本 1.22
,v1beta1
CSRAPI已由 v1
CSR 取代API。這API不支援「舊版未知」 signerName 的 。如果您想要使用 Amazon EKS CA 在叢集上產生憑證,則必須使用自訂簽署者。它在 Amazon EKS版本 中引入1.22
。若要使用 CSRv1
API版本並產生新憑證,您必須遷移任何現有的資訊清單和API用戶端。使用現有 建立的現有憑證v1beta1
API在憑證過期之前都是有效的 和 功能。這包含下列項目:
-
信任分佈:無。此簽署者在 中沒有標準信任或分佈 Kubernetes 叢集。
-
允許的主體:任何
-
允許的 x509 擴充功能:榮譽 subjectAltName 和金鑰用量擴充功能,並捨棄其他擴充功能
-
允許的金鑰使用方式:不得包括 [「金鑰加密」、「數位簽章」、「伺服器身分驗證」] 以外的用法
注意
不支援用戶端憑證簽署。
-
到期/憑證生命週期:1 年 (預設和最長)
-
允許/不允許 CA 位元:不允許
使用 CSR產生範例 signerName
這些步驟說明如何myserver.default.svc
使用 產生DNS名稱的服務憑證signerName: beta.eks.amazonaws.com/app-serving
。將此作為您自己環境的指南。
-
執行
openssl genrsa -out myserver.key 2048
命令以產生RSA私有金鑰。openssl genrsa -out myserver.key 2048
-
執行下列命令來產生憑證請求。
openssl req -new -key myserver.key -out myserver.csr -subj "/CN=myserver.default.svc"
-
為CSR請求產生
base64
值,並將其存放在變數中,以供後續步驟使用。base_64=$(cat myserver.csr | base64 -w 0 | tr -d "\n")
-
執行下列命令以建立名為
mycsr.yaml
的檔案。在下列範例中,beta.eks.amazonaws.com/app-serving
是signerName
。cat >mycsr.yaml <<EOF apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: myserver spec: request: $base_64 signerName: beta.eks.amazonaws.com/app-serving usages: - digital signature - key encipherment - server auth EOF
-
提交 CSR。
kubectl apply -f mycsr.yaml
-
核准服務憑證。
kubectl certificate approve myserver
-
驗證憑證已核發。
kubectl get csr myserver
範例輸出如下。
NAME AGE SIGNERNAME REQUESTOR CONDITION myserver 3m20s beta.eks.amazonaws.com/app-serving kubernetes-admin Approved,Issued
-
匯出已核發的憑證。
kubectl get csr myserver -o jsonpath='{.status.certificate}'| base64 -d >
myserver.crt
升級叢集至 之前,請先考慮憑證簽署 Kubernetes 1.24
In (入) Kubernetes 1.23
和更早版本,使用無法驗證的 IP 和DNS主體別名 (SANs) kubelet
提供憑證會自動以無法驗證的 發出SANs。從佈建的憑證中省略 SANs 。在 1.24
和更新版本的叢集中,如果SAN無法驗證 ,則不會發出kubelet
服務憑證。如此可防止 kubectl exec
和 kubectl logs
命令運作。
將叢集升級至 之前1.24
,請先完成下列步驟,判斷叢集是否有尚未核准的憑證簽署請求 (CSR):
-
執行下列命令。
kubectl get csr -A
範例輸出如下。
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION csr-
7znmf
90m kubernetes.io/kubelet-serving system:node:ip-192-168-42-149
.region
.compute.internal <none> Approved csr-9xx5q
90m kubernetes.io/kubelet-serving system:node:ip-192-168-65-38
.region
.compute.internal <none> Approved, Issued如果傳回的輸出顯示 CSR的
kubernetes.io/kubelet-serving
簽署者是節點 Issued
,Approved
但不是節點,則您需要核准請求。 -
手動核准 CSR。使用您自己的值取代
csr-
。7znmf
kubectl certificate approve csr-
7znmf
若要CSRs在未來自動核准,建議您撰寫核准控制器,該控制器可以自動驗證和核准包含 IP CSRs 或 Amazon EKS 無法驗證DNSSANs的 IP。