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.crt` 和 `apiserver.key`)可以用於與 kubelet 伺服器進行通訊。

  • 獨立證書:或者,kube-apiserver 可以生成一個新的客戶端證書和金鑰對,用於對其與 kubelet 伺服器的通訊進行身份驗證。在這種情況下,會建立一個名為 `kubelet-client.crt` 的獨立證書及其相應的私鑰 `kubelet-client.key`。

etcd 也實現了相互 TLS 來驗證客戶端和對等體。

證書的儲存位置

如果你使用 kubeadm 安裝 Kubernetes,大多數證書儲存在 `/etc/kubernetes/pki` 中。本文件中的所有路徑都相對於該目錄,但 kubeadm 放在 `/etc/kubernetes` 中的使用者帳戶證書除外。

手動配置證書

如果你不希望 kubeadm 生成所需的證書,可以使用單個根 CA 或提供所有證書來建立它們。有關如何建立自己的證書頒發機構的詳細資訊,請參閱證書。有關管理證書的更多資訊,請參閱使用 kubeadm 管理證書

單個根 CA

你可以建立一個由管理員控制的單個根 CA。然後,此根 CA 可以建立多箇中間 CA,並將所有進一步的建立委託給 Kubernetes 本身。

必需的 CA

路徑預設 CN描述
ca.crt,keykubernetes-caKubernetes 通用 CA
etcd/ca.crt,keyetcd-ca用於所有 etcd 相關功能
front-proxy-ca.crt,keykubernetes-front-proxy-ca用於前端代理

除了上述 CA 之外,還需要一個用於服務帳戶管理 `sa.key` 和 `sa.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父 CAO (在 Subject 中)kind主機 (SAN)
kube-etcdetcd-ca伺服器,客戶端``,``,`localhost`,`127.0.0.1`
kube-etcd-peeretcd-ca伺服器,客戶端``,``,`localhost`,`127.0.0.1`
kube-etcd-healthcheck-clientetcd-ca客戶端
kube-apiserver-etcd-clientetcd-ca客戶端
kube-apiserverkubernetes-ca伺服器``,``,``1
kube-apiserver-kubelet-clientkubernetes-casystem:masters客戶端
front-proxy-clientkubernetes-front-proxy-ca客戶端

其中 `kind` 對映到 x509 金鑰用法中的一個或多個,這也在 CertificateSigningRequest 型別的 `.spec.usages` 中有記錄

kind金鑰用法
伺服器數字簽名,金鑰加密,伺服器認證
客戶端數字簽名,金鑰加密,客戶端認證

證書路徑

證書應放置在推薦路徑中(如 kubeadm 所用)。無論位置如何,都應使用給定引數指定路徑。

預設 CN推薦金鑰路徑推薦證書路徑命令金鑰引數證書引數
etcd-caetcd/ca.keyetcd/ca.crtkube-apiserver--etcd-cafile
kube-apiserver-etcd-clientapiserver-etcd-client.keyapiserver-etcd-client.crtkube-apiserver--etcd-keyfile--etcd-certfile
kubernetes-caca.keyca.crtkube-apiserver--client-ca-file
kubernetes-caca.keyca.crtkube-controller-manager--cluster-signing-key-file--client-ca-file,--root-ca-file,--cluster-signing-cert-file
kube-apiserverapiserver.keyapiserver.crtkube-apiserver--tls-private-key-file--tls-cert-file
kube-apiserver-kubelet-clientapiserver-kubelet-client.keyapiserver-kubelet-client.crtkube-apiserver--kubelet-client-key--kubelet-client-certificate
front-proxy-cafront-proxy-ca.keyfront-proxy-ca.crtkube-apiserver--requestheader-client-ca-file
front-proxy-cafront-proxy-ca.keyfront-proxy-ca.crtkube-controller-manager--requestheader-client-ca-file
front-proxy-clientfront-proxy-client.keyfront-proxy-client.crtkube-apiserver--proxy-client-key-file--proxy-client-cert-file
etcd-caetcd/ca.keyetcd/ca.crtetcd--trusted-ca-file,--peer-trusted-ca-file
kube-etcdetcd/server.keyetcd/server.crtetcd--key-file--cert-file
kube-etcd-peeretcd/peer.keyetcd/peer.crtetcd--peer-key-file--peer-cert-file
etcd-caetcd/ca.crtetcdctl--cacert
kube-etcd-healthcheck-clientetcd/healthcheck-client.keyetcd/healthcheck-client.crtetcdctl--key--cert

服務帳戶金鑰對也適用相同的考慮

私鑰路徑公鑰路徑命令引數
sa.keykube-controller-manager--service-account-private-key-file
sa.pubkube-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

配置使用者帳戶的證書

你必須手動配置這些管理員帳戶和服務帳戶

檔名憑證名稱預設 CNO (在 Subject 中)
admin.confdefault-adminkubernetes-admin<admin-group>
super-admin.confdefault-super-adminkubernetes-super-adminsystem:masters
kubelet.confdefault-authsystem:node:<nodeName> (參見備註)system:nodes
controller-manager.confdefault-controller-managersystem:kube-controller-manager
scheduler.confdefault-schedulersystem:kube-scheduler
  1. 對於每種配置,生成一個具有給定通用名稱 (CN) 和組織 (O) 的 x509 證書/金鑰對。

  2. 對於每種配置,按如下方式執行 `kubectl`

    KUBECONFIG=<filename> kubectl config set-cluster default-cluster --server=https://<host ip>:6443 --certificate-authority <path-to-kubernetes-ca> --embed-certs
    KUBECONFIG=<filename> kubectl config set-credentials <credential-name> --client-key <path-to-key>.pem --client-certificate <path-to-cert>.pem --embed-certs
    KUBECONFIG=<filename> kubectl config set-context default-system --cluster default-cluster --user <credential-name>
    KUBECONFIG=<filename> kubectl config use-context default-system
    

這些檔案按如下方式使用

檔名命令評論
admin.confkubectl為叢集配置管理員使用者
super-admin.confkubectl為叢集配置超級管理員使用者
kubelet.confkubelet叢集中的每個節點都需要一個。
controller-manager.confkube-controller-manager必須新增到 `manifests/kube-controller-manager.yaml` 中的清單中
scheduler.confkube-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 名稱、`kubernetes`、`kubernetes.default`、`kubernetes.default.svc`、`kubernetes.default.svc.cluster`、`kubernetes.default.svc.cluster.local`) ↩︎

上次修改時間:2024 年 10 月 17 日下午 6:09 PST:清理最佳實踐:證書和節點一致性 (1d24167b04)