Kubernetes PKI證書和要求

2022-06-01 13:46 更新

PKI 證書和要求

Kubernetes 需要 PKI 證書才能進(jìn)行基于 TLS 的身份驗證。如果你是使用 kubeadm 安裝的 Kubernetes, 則會自動生成集群所需的證書。你還可以生成自己的證書。 例如,不將私鑰存儲在 API 服務(wù)器上,可以讓私鑰更加安全。此頁面說明了集群必需的證書。

集群是如何使用證書的 

Kubernetes 需要 PKI 才能執(zhí)行以下操作:

  • Kubelet 的客戶端證書,用于 API 服務(wù)器身份驗證
  • Kubelet 服務(wù)端證書, 用于 API 服務(wù)器與 Kubelet 的會話
  • API 服務(wù)器端點的證書
  • 集群管理員的客戶端證書,用于 API 服務(wù)器身份認(rèn)證
  • API 服務(wù)器的客戶端證書,用于和 Kubelet 的會話
  • API 服務(wù)器的客戶端證書,用于和 etcd 的會話
  • 控制器管理器的客戶端證書/kubeconfig,用于和 API 服務(wù)器的會話
  • 調(diào)度器的客戶端證書/kubeconfig,用于和 API 服務(wù)器的會話
  • 前端代理 的客戶端及服務(wù)端證書

Note: 只有當(dāng)你運行 kube-proxy 并要支持 擴(kuò)展 API 服務(wù)器 時,才需要 ?front-proxy? 證書

etcd 還實現(xiàn)了雙向 TLS 來對客戶端和對其他對等節(jié)點進(jìn)行身份驗證。

證書存放的位置 

假如通過 kubeadm 安裝 Kubernetes,大多數(shù)證書都存儲在 ?/etc/kubernetes/pki?。 本文檔中的所有路徑都是相對于該目錄的,但用戶賬戶證書除外,kubeadm 將其放在 ?/etc/kubernetes? 中。

手動配置證書 

如果你不想通過 kubeadm 生成這些必需的證書,你可以使用一個單一的根 CA 來創(chuàng)建這些證書或者直接提供所有證書。 

單根 CA 

你可以創(chuàng)建一個單根 CA,由管理員控制器它。該根 CA 可以創(chuàng)建多個中間 CA,并將所有進(jìn)一步的創(chuàng)建委托給 Kubernetes。

需要這些 CA:

路徑 默認(rèn) CN 描述
ca.crt,key kubernetes-ca Kubernetes 通用 CA
etcd/ca.crt,key etcd-ca 與 etcd 相關(guān)的所有功能
front-proxy-ca.crt,key kubernetes-front-proxy-ca 用于 前端代理

上面的 CA 之外,還需要獲取用于服務(wù)賬戶管理的密鑰對,也就是 ?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 的私鑰拷貝至你的集群中,你也可以自己生成全部的證書。

需要這些證書:

默認(rèn) CN 父級 CA O (位于 Subject 中) 類型 主機(jī) (SAN)
kube-etcd etcd-ca server, client <hostname><Host_IP>localhost127.0.0.1
kube-etcd-peer etcd-ca server, client <hostname><Host_IP>localhost127.0.0.1
kube-etcd-healthcheck-client etcd-ca client
kube-apiserver-etcd-client etcd-ca system:masters 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

[1]: 用來連接到集群的不同 IP 或 DNS 名 (就像 kubeadm 為負(fù)載均衡所使用的固定 IP 或 DNS 名,?kubernetes?、?kubernetes.default?、?kubernetes.default.svc?、 ?kubernetes.default.svc.cluster?、?kubernetes.default.svc.cluster.local?)。

其中,?kind ?對應(yīng)一種或多種類型的 x509 密鑰用途

kind 密鑰用途
server 數(shù)字簽名、密鑰加密、服務(wù)端認(rèn)證
client 數(shù)字簽名、密鑰加密、客戶端認(rèn)證
Note:
上面列出的 Hosts/SAN 是推薦的配置方式;如果需要特殊安裝,則可以在所有服務(wù)器證書上添加其他 SAN。
Note:
對于 kubeadm 用戶:
  • 不使用私鑰,將證書復(fù)制到集群 CA 的方案,在 kubeadm 文檔中將這種方案稱為外部 CA。
  • 如果將以上列表與 kubeadm 生成的 PKI 進(jìn)行比較,你會注意到,如果使用外部 etcd,則不會生成 ?kube-etcd?、?kube-etcd-peer? 和 ?kube-etcd-healthcheck-client? 證書。

證書路徑 

證書應(yīng)放置在建議的路徑中(以便 kubeadm 使用)。無論使用什么位置,都應(yīng)使用給定的參數(shù)指定路徑。

默認(rèn) CN 建議的密鑰路徑 建議的證書路徑 命令 密鑰參數(shù) 證書參數(shù)
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

注意事項同樣適用于服務(wù)帳戶密鑰對:

私鑰路徑 公鑰路徑 命令 參數(shù)
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

為用戶帳戶配置證書 

你必須手動配置以下管理員帳戶和服務(wù)帳戶:

文件名 憑據(jù)名稱 默認(rèn) CN O (位于 Subject 中)
admin.conf default-admin kubernetes-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

Note: ?kubelet.conf? 中 ?<nodeName>? 的值 必須 與 kubelet 向 apiserver 注冊時提供的節(jié)點名稱的值完全匹配。

  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.conf kubectl 配置集群的管理員
kubelet.conf kubelet 集群中的每個節(jié)點都需要一份
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/kubelet.conf
/etc/kubernetes/controller-manager.conf
/etc/kubernetes/scheduler.conf


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號