PKI 證書和要求
Kubernetes 需要 PKI 證書才能透過 TLS 進行身份驗證。如果你使用 kubeadm 安裝 Kubernetes,叢集所需的證書會自動生成。你也可以生成自己的證書,例如透過不將私鑰儲存在 API 伺服器上來確保私鑰更安全。本頁面解釋了叢集所需的證書。
證書如何被你的叢集使用
Kubernetes 要求 PKI 用於以下操作
伺服器證書
客戶端證書
- 每個 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`。
注意
僅當你執行 kube-proxy 以支援擴充套件 API 伺服器時,才需要 `front-proxy` 證書。etcd 也實現了相互 TLS 來驗證客戶端和對等體。
證書的儲存位置
如果你使用 kubeadm 安裝 Kubernetes,大多數證書儲存在 `/etc/kubernetes/pki` 中。本文件中的所有路徑都相對於該目錄,但 kubeadm 放在 `/etc/kubernetes` 中的使用者帳戶證書除外。
手動配置證書
如果你不希望 kubeadm 生成所需的證書,可以使用單個根 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 之外,還需要一個用於服務帳戶管理 `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 | 父 CA | O (在 Subject 中) | kind | 主機 (SAN) |
---|---|---|---|---|
kube-etcd | etcd-ca | 伺服器,客戶端 | ` | |
kube-etcd-peer | etcd-ca | 伺服器,客戶端 | ` | |
kube-etcd-healthcheck-client | etcd-ca | 客戶端 | ||
kube-apiserver-etcd-client | etcd-ca | 客戶端 | ||
kube-apiserver | kubernetes-ca | 伺服器 | ` | |
kube-apiserver-kubelet-client | kubernetes-ca | system:masters | 客戶端 | |
front-proxy-client | kubernetes-front-proxy-ca | 客戶端 |
注意
對於 `kube-apiserver-kubelet-client`,可以使用許可權較低的組,而不是使用超級使用者組 `system:masters`。kubeadm 為此目的使用了 `kubeadm:cluster-admins` 組。其中 `kind` 對映到 x509 金鑰用法中的一個或多個,這也在 CertificateSigningRequest 型別的 `.spec.usages` 中有記錄
kind | 金鑰用法 |
---|---|
伺服器 | 數字簽名,金鑰加密,伺服器認證 |
客戶端 | 數字簽名,金鑰加密,客戶端認證 |
注意
上面列出的 Hosts/SAN 是獲取工作叢集的推薦選項;如果特定設定需要,可以在所有伺服器證書上新增額外的 SAN。注意
僅適用於 kubeadm 使用者
- 將 CA 證書(不帶私鑰)複製到叢集的場景在 kubeadm 文件中稱為外部 CA。
- 如果你將上述列表與 kubeadm 生成的 PKI 進行比較,請注意,在外部 etcd 的情況下,不會生成 `kube-etcd`、`kube-etcd-peer` 和 `kube-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> (參見備註) | system:nodes |
controller-manager.conf | default-controller-manager | system:kube-controller-manager | |
scheduler.conf | default-scheduler | system:kube-scheduler |
注意
在上面的示例中,<admin-group>
是特定於實現的。有些工具將預設 admin.conf
中的證書籤名到 system:masters
組中。system:masters
是一個“緊急出口”的超級使用者組,可以繞過 Kubernetes 的授權層,例如 RBAC。此外,有些工具不會生成一個單獨的 super-admin.conf
,其中包含繫結到此超級使用者組的證書。
kubeadm 在 kubeconfig 檔案中生成兩個獨立的管理員證書。其中一個在 `admin.conf` 中,其 `Subject: O = kubeadm:cluster-admins, CN = kubernetes-admin`。`kubeadm:cluster-admins` 是一個繫結到 `cluster-admin` ClusterRole 的自定義組。此檔案在所有 kubeadm 管理的控制平面機器上生成。
另一個在 `super-admin.conf` 中,其 `Subject: O = system:masters, CN = kubernetes-super-admin`。此檔案僅在呼叫 `kubeadm init` 的節點上生成。
對於每種配置,生成一個具有給定通用名稱 (CN) 和組織 (O) 的 x509 證書/金鑰對。
對於每種配置,按如下方式執行 `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.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