PKI 憑證與需求

Kubernetes 需要 PKI 憑證才能透過 TLS 進行身份驗證。如果您使用 kubeadm 安裝 Kubernetes,您的叢集所需的憑證會自動產生。您也可以產生自己的憑證,例如,為了更安全地保護您的私密金鑰,不要將它們儲存在 API 伺服器上。此頁面說明您的叢集所需的憑證。

您的叢集如何使用憑證

Kubernetes 需要 PKI 才能進行下列作業

伺服器憑證

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

用戶端憑證

  • 每個 kubelet 的用戶端憑證,用於向 API 伺服器驗證身分,作為 Kubernetes 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

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.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父 CAO (在 Subject 中)種類hosts (SAN)
kube-etcdetcd-ca伺服器、用戶端<hostname><Host_IP>localhost127.0.0.1
kube-etcd-peeretcd-ca伺服器、用戶端<hostname><Host_IP>localhost127.0.0.1
kube-etcd-healthcheck-clientetcd-ca用戶端
kube-apiserver-etcd-clientetcd-ca用戶端
kube-apiserverkubernetes-ca伺服器<hostname><Host_IP><advertise_IP>1
kube-apiserver-kubelet-clientkubernetes-casystem:masters用戶端
front-proxy-clientkubernetes-front-proxy-ca用戶端

其中 kind 對應至 x509 金鑰使用方式的一或多個,這也在 CertificateSigningRequest 類型的 .spec.usages 中有所記載

種類金鑰使用方式
伺服器數位簽章、金鑰加密、伺服器驗證
用戶端數位簽章、金鑰加密、用戶端身分驗證

憑證路徑

憑證應放置在建議路徑中(如同 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. 針對每個設定,產生一個 x509 憑證/金鑰組,並使用給定的通用名稱 (CN) 和組織 (O)。

  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 中的 manifest
scheduler.confkube-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

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

最後修改於 2024 年 10 月 17 日下午 6:09 PST:Clean up best-practices: certificates and node-conformance (1d24167b04)