Kubernetes 需要 PKI 憑證來透過 TLS 進行驗證。 如果您使用 kubeadm 安裝 Kubernetes, 叢集所需的憑證會自動產生。您也可以自行產生憑證 —— 例如,為了提升私鑰安全性而不將它儲存在 API 伺服器上。 本頁面說明了您的叢集所需的各類憑證。
Kubernetes 在進行下列操作時,需要使用 PKI:
為了建立安全連線並向 kubelet 驗證其身分,API 伺服器需要一組用戶端憑證與金鑰對。
在此情境下,憑證的使用有兩種做法:
apiserver.crt 與 apiserver.key 可被用於與 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, 並將後續所有的憑證建立工作委派給 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.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 欄位) | 類型 | 主機(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 使用者:
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> (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-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=<檔案名稱> 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