PKI 憑證與需求

Kubernetes 需要 PKI 憑證來透過 TLS 進行驗證。 如果您使用 kubeadm 安裝 Kubernetes, 叢集所需的憑證會自動產生。您也可以自行產生憑證 —— 例如,為了提升私鑰安全性而不將它儲存在 API 伺服器上。 本頁面說明了您的叢集所需的各類憑證。

憑證在您的叢集中的使用方式

Kubernetes 在進行下列操作時,需要使用 PKI:

伺服器憑證

  • API 伺服器端點的伺服器憑證
  • etcd 伺服器的伺服器憑證
  • 每個 kubelet 的伺服器憑證 (每個節點都執行一個 kubelet)
  • 前端代理的可選用伺服器憑證

用戶端憑證

  • 每個 kubelet 的用戶端憑證,用於作為 Kubernetes API 的用戶端向 API 伺服器進行驗證
  • 每個 API 伺服器的用戶端憑證,用於向 etcd 進行驗證
  • 控制器管理器的用戶端憑證,用於與 API 伺服器進行安全通訊
  • 排程器的用戶端憑證,用於與 API 伺服器進行安全通訊
  • 每個節點各一個用戶端憑證,讓 kube-proxy 向 API 伺服器進行驗證
  • 叢集管理員使用的可選用用戶端憑證,用於向 API 伺服器進行驗證
  • 前端代理的可選用用戶端憑證

Kubelet 的伺服器與用戶端憑證

為了建立安全連線並向 kubelet 驗證其身分,API 伺服器需要一組用戶端憑證與金鑰對。

在此情境下,憑證的使用有兩種做法:

  • 共用憑證:kube-apiserver 可以使用與其驗證用戶端時相同的憑證與金鑰對。 這意味著現有的憑證,例如 apiserver.crtapiserver.key 可被用於與 kubelet 伺服器通訊。
  • 獨立憑證:另一種做法是,kube-apiserver 可以產生一組新的用戶端憑證與金鑰對, 用於驗證其與 kubelet 伺服器之間的通訊。在此情況下, 會建立名為 kubelet-client.crt 的專屬憑證及其對應的私鑰 kubelet-client.key

說明:

只有在您執行 kube-proxy 來支援擴展 API 伺服器的情況下, 才需要前端代理的憑證。

etcd 也實作了雙向 TLS 來驗證用戶端與對等節點。

憑證的儲存位置

如果您使用 kubeadm 安裝 Kubernetes,大部分的憑證都會儲存在 /etc/kubernetes/pki。 本文件中的所有路徑皆相對於此目錄,除了 kubeadm 放在 /etc/kubernetes 中的使用者帳號憑證之外。

手動配置憑證

如果您不希望由 kubeadm 產生所需的憑證,您可以使用單一根憑證授權機構(Root CA)來建立憑證,或是提供完整的所有憑證。 關於建立自有憑證授權機構的詳細資訊,請參閱憑證。 若要深入了解如何管理憑證,請參閱使用 kubeadm 管理憑證

單一的根 CA

您可以建立一個由管理員控管的單一根 CA。此根 CA 可再建立多個中間 CA, 並將後續所有的憑證建立工作委派給 Kubernetes 本身。

所需的 CA 如下:

路徑 預設 CN 說明
ca.crt,key kubernetes-ca Kubernetes 通用的 CA
etcd/ca.crt,key etcd-ca 用於所有與 etcd 相關的功能
front-proxy-ca.crt,key kubernetes-front-proxy-ca 用於前端代理

除了上述的 CA 之外,還需要一組用於服務帳號(Service Account)管理的公鑰/私鑰對, 即 sa.keysa.pub。以下範例展示了前表中所列的 CA 金鑰及憑證檔案:

/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/ca.key
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key
/etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/front-proxy-ca.key

所有憑證

如果您不希望將 CA 私鑰複製到您的叢集中,您可以自行產生所有的憑證。

所需的憑證如下:

預設 CN 上層 CA O(Subject 欄位) 類型 主機(SAN)
kube-etcd etcd-ca server, client <hostname>, <Host_IP>, localhost, 127.0.0.1
kube-etcd-peer etcd-ca server, client <hostname>, <Host_IP>, localhost, 127.0.0.1
kube-etcd-healthcheck-client etcd-ca client
kube-apiserver-etcd-client etcd-ca client
kube-apiserver kubernetes-ca server <hostname>, <Host_IP>, <advertise_IP>1
kube-apiserver-kubelet-client kubernetes-ca system:masters client
front-proxy-client kubernetes-front-proxy-ca client

說明:

與其為 kube-apiserver-kubelet-client 使用 system:masters 超級使用者群組, 也可以改用權限較低的群組。kubeadm 出於此目的使用了 kubeadm:cluster-admins 群組。

其中 kind 對應到一或多個 x509 金鑰用途(key usage), 這在 CertificateSigningRequest 類型的 .spec.usages 欄位中也有詳細說明:

類型 金鑰用途
伺服器 digital signature, key encipherment, server auth
用戶端 digital signature, key encipherment, client auth

說明:

上文列出的主機(SAN)是為了確保叢集正常運作而建議的配置; 如果特定設定有其需求,也可以在所有伺服器憑證中加上額外的 SAN。

說明:

僅限 kubeadm 使用者:

  • 在 kubeadm 文件中,將僅複製不含私鑰的 CA 憑證到叢集的情境稱為外部 CA。
  • 如果您正在將上述清單與 kubeadm 產生的 PKI 進行比較,請注意在外部 etcd 的情況下, 系統不會產生 kube-etcdkube-etcd-peerkube-etcd-healthcheck-client 憑證。

憑證路徑

憑證應放置在建議的路徑中(就像 kubeadm 所用的)。 不論實際位置為何,都應透過指定參數來明確指出路徑。

預設 CN 建議金鑰路徑 建議憑證路徑 指令 金鑰參數 憑證參數
etcd-ca etcd/ca.key etcd/ca.crt kube-apiserver --etcd-cafile
kube-apiserver-etcd-client apiserver-etcd-client.key apiserver-etcd-client.crt kube-apiserver --etcd-keyfile --etcd-certfile
kubernetes-ca ca.key ca.crt kube-apiserver --client-ca-file
kubernetes-ca ca.key ca.crt kube-controller-manager --cluster-signing-key-file --client-ca-file,--root-ca-file,--cluster-signing-cert-file
kube-apiserver apiserver.key apiserver.crt kube-apiserver --tls-private-key-file --tls-cert-file
kube-apiserver-kubelet-client apiserver-kubelet-client.key apiserver-kubelet-client.crt kube-apiserver --kubelet-client-key --kubelet-client-certificate
front-proxy-ca front-proxy-ca.key front-proxy-ca.crt kube-apiserver --requestheader-client-ca-file
front-proxy-ca front-proxy-ca.key front-proxy-ca.crt kube-controller-manager --requestheader-client-ca-file
front-proxy-client front-proxy-client.key front-proxy-client.crt kube-apiserver --proxy-client-key-file --proxy-client-cert-file
etcd-ca etcd/ca.key etcd/ca.crt etcd --trusted-ca-file,--peer-trusted-ca-file
kube-etcd etcd/server.key etcd/server.crt etcd --key-file --cert-file
kube-etcd-peer etcd/peer.key etcd/peer.crt etcd --peer-key-file --peer-cert-file
etcd-ca etcd/ca.crt etcdctl --cacert
kube-etcd-healthcheck-client etcd/healthcheck-client.key etcd/healthcheck-client.crt etcdctl --key --cert

同樣的考量也適用於服務帳號的金鑰對:

私鑰路徑 公鑰路徑 指令 參數
sa.key kube-controller-manager --service-account-private-key-file
sa.pub kube-apiserver --service-account-key-file

以下範例說明了來自先前表格的檔案路徑, 如果您是自行產生所有的金鑰與憑證,則需要提供這些檔案:

/etc/kubernetes/pki/etcd/ca.key
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/apiserver-etcd-client.key
/etc/kubernetes/pki/apiserver-etcd-client.crt
/etc/kubernetes/pki/ca.key
/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/apiserver.key
/etc/kubernetes/pki/apiserver.crt
/etc/kubernetes/pki/apiserver-kubelet-client.key
/etc/kubernetes/pki/apiserver-kubelet-client.crt
/etc/kubernetes/pki/front-proxy-ca.key
/etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/front-proxy-client.key
/etc/kubernetes/pki/front-proxy-client.crt
/etc/kubernetes/pki/etcd/server.key
/etc/kubernetes/pki/etcd/server.crt
/etc/kubernetes/pki/etcd/peer.key
/etc/kubernetes/pki/etcd/peer.crt
/etc/kubernetes/pki/etcd/healthcheck-client.key
/etc/kubernetes/pki/etcd/healthcheck-client.crt
/etc/kubernetes/pki/sa.key
/etc/kubernetes/pki/sa.pub

配置使用者帳號的憑證

您必須手動配置這些管理員帳號與服務帳號:

檔案名稱 憑證名稱 預設 CN O(Subject 欄位)
admin.conf default-admin kubernetes-admin <admin-group>
super-admin.conf default-super-admin kubernetes-super-admin system:masters
kubelet.conf default-auth system:node:<nodeName> (see note) system:nodes
controller-manager.conf default-controller-manager system:kube-controller-manager
scheduler.conf default-scheduler system:kube-scheduler

說明:

kubelet.conf<nodeName>必須精確的匹配 kubelet 在向 apiserver 註冊時所提供的節點名稱。 想了解更多細節,請參閱節點授權

說明:

在上述範例中,<admin-group> 是依照實作而定的。 某些工具會在預設的 admin.conf 中將憑證簽署為 system:masters 群組的一部分。 system:masters 是一個緊急狀況使用的超級使用者群組, 可以繞過 Kubernetes 的授權層(例如 RBAC)。 此外,某些工具不會產生一個獨立且憑證綁定在此超級使用者群組的 super-admin.conf

kubeadm 在 kubeconfig 檔案中產生兩個獨立的管理員憑證。 其中一個位於 admin.conf,並具有 Subject: O = kubeadm:cluster-admins, CN = kubernetes-adminkubeadm:cluster-admins 是一個綁定在 cluster-admin ClusterRole 的自定義群組。 此檔案是在所有由 kubeadm 管理的控制平面主機上產生的。

另一個位於 super-admin.conf,具有 Subject: O = system:masters, CN = kubernetes-super-admin。 此檔案僅在呼叫 kubeadm init 的節點上產生。

  1. 對於每項配置,產生一個具有給定通用名稱(CN)與組織(O)的 x509 憑證/金鑰對。

  2. 為每項配置按照以下方式執行 kubectl

    KUBECONFIG=<檔案名稱> kubectl config set-cluster default-cluster --server=https://<host ip>:6443 --certificate-authority <Kubernetes CA 路徑> --embed-certs
    KUBECONFIG=<檔案名稱> kubectl config set-credentials <憑證名稱> --client-key <金鑰路徑>.pem --client-certificate <憑證路徑>.pem --embed-certs
    KUBECONFIG=<檔案名稱> kubectl config set-context default-system --cluster default-cluster --user <憑證名稱>
    KUBECONFIG=<檔案名稱> kubectl config use-context default-system
    

這些檔案按照以下方式使用:

檔案名稱 指令 註釋
admin.conf kubectl 配置叢集的管理員使用者
super-admin.conf kubectl 配置叢集的超級管理員使用者
kubelet.conf kubelet 叢集中的每個節點都需要一個
controller-manager.conf kube-controller-manager 必須新增至 manifests/kube-controller-manager.yaml 中的設定檔
scheduler.conf kube-scheduler 必須新增至 manifests/kube-scheduler.yaml 中的設定檔

以下檔案說明了前述表格中所列檔案的完整路徑:

/etc/kubernetes/admin.conf
/etc/kubernetes/super-admin.conf
/etc/kubernetes/kubelet.conf
/etc/kubernetes/controller-manager.conf
/etc/kubernetes/scheduler.conf

  1. 任何其他您用來連線至叢集的 IP 或 DNS 名稱( 例如 kubeadm 所使用的負載平衡器固定 IP 與/或 DNS 名稱, 以及 kuberneteskubernetes.defaultkubernetes.default.svckubernetes.default.svc.clusterkubernetes.default.svc.cluster.local)。 ↩︎


最後修改 April 01, 2026 at 11:03 PM PST: docs(zh-tw): translate best-practices/* part 2 (54288276a4)