PKI 憑證與需求
Kubernetes 需要 PKI 憑證才能透過 TLS 進行身份驗證。如果您使用 kubeadm 安裝 Kubernetes,您的叢集所需的憑證會自動產生。您也可以產生自己的憑證,例如,為了更安全地保護您的私密金鑰,不要將它們儲存在 API 伺服器上。此頁面說明您的叢集所需的憑證。
您的叢集如何使用憑證
Kubernetes 需要 PKI 才能進行下列作業
伺服器憑證
用戶端憑證
- 每個 kubelet 的用戶端憑證,用於向 API 伺服器驗證身分,作為 Kubernetes 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,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 中) | 種類 | hosts (SAN) |
---|---|---|---|---|
kube-etcd | etcd-ca | 伺服器、用戶端 | <hostname> 、<Host_IP> 、localhost 、127.0.0.1 | |
kube-etcd-peer | etcd-ca | 伺服器、用戶端 | <hostname> 、<Host_IP> 、localhost 、127.0.0.1 | |
kube-etcd-healthcheck-client | etcd-ca | 用戶端 | ||
kube-apiserver-etcd-client | etcd-ca | 用戶端 | ||
kube-apiserver | kubernetes-ca | 伺服器 | <hostname> 、<Host_IP> 、<advertise_IP> 1 | |
kube-apiserver-kubelet-client | kubernetes-ca | system:masters | 用戶端 | |
front-proxy-client | kubernetes-front-proxy-ca | 用戶端 |
注意
kubeadm 使用kubeadm:cluster-admins
群組來達到此目的,而非針對 kube-apiserver-kubelet-client
使用超級使用者群組 system:masters
,後者權限較低。其中 kind
對應至 x509 金鑰使用方式的一或多個,這也在 CertificateSigningRequest 類型的 .spec.usages
中有所記載
種類 | 金鑰使用方式 |
---|---|
伺服器 | 數位簽章、金鑰加密、伺服器驗證 |
用戶端 | 數位簽章、金鑰加密、用戶端身分驗證 |
注意
上述列出的主機/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
的節點上產生。
針對每個設定,產生一個 x509 憑證/金鑰組,並使用給定的通用名稱 (CN) 和組織 (O)。
針對每個設定,執行如下的
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 中的 manifest |
scheduler.conf | kube-scheduler | 必須新增至 manifests/kube-scheduler.yaml 中的 manifest |
以下檔案說明了前述表格中列出的檔案完整路徑
/etc/kubernetes/admin.conf
/etc/kubernetes/super-admin.conf
/etc/kubernetes/kubelet.conf
/etc/kubernetes/controller-manager.conf
/etc/kubernetes/scheduler.conf