将节点添加到 Kubernetes 控制平面时的证书密钥
Certificate key when adding node to Kubernetes control plane
所以我知道如何将工作节点添加到现有的 Kubernetes 1.14 集群(使用 kubeadm
设置):kubeadm token create --print-join-command
将打印一个有效的 kubeadm join
命令参数 --token
和 --discovery-token-ca-cert-hash
.
的值
我目前了解到,要向控制平面(主节点)添加另一个节点 kubeadm join
需要额外的参数 --experimental-control-plane
(w/o 值)和 --certificate-key
。这适用于堆叠式控制平面和 etcd 节点。
如何(在哪个文件中)为现有集群获取 --certificate-key
的正确值?
UPDATE 我的第一个(也是目前唯一的)主节点是在没有参数 --experimental-upload-certs
到 kubeadm init
的情况下创建的(而是 kubeadm init --pod-network-cidr=10.244.0.0/16
).因此 manual certificate distribution 应该适用,因此可能的步骤顺序可能是:
- 将
/etc/kubernetes/pki/{ca.*,sa.*,front-proxy-sa.*,etcd/ca.*}
中的证书和密钥从第一个复制到新的主节点
- 运行
kubeadm token create --print-join-command
在第一个主节点上
- 运行 在新主节点
上打印带有附加参数 --experimental-control-plane
的 kubeadm join
命令
这是正确的程序吗?
根据documentation,此命令提供了一个新的解密密钥:
kubeadm init phase upload-certs --experimental-upload-certs
我在 1.17 中一直在努力解决这个问题,最后发现这个命令会预先生成一个我可以在 kubeadmn init
和 kubeadmn join
中使用的证书密钥。为了让它工作,你需要传递 --upload-certs
以及当你 运行 kubeadmn init
类似于你为 1.14.
注意到的
# generate a certificate-key to be used
kubeadm alpha certs certificate-key
# initialize first master using above key, --upload-certs (and other parameters)
kubeadm init --control-plane-endpoint $API_SERVER:6443 --upload-certs --apiserver-cert-extra-sans $API_SERVER --certificate-key $CERT-KEY
# join other masters using the same certificate-key
kubeadm join $API_SERVER:6443 --token $TOKEN --discovery-token-ca-cert-hash $CAHASH --control-plane --certificate-key $CERT-KEY
给出答案的替代方法是使用 kubeadm
通过将证书作为秘密上传到 kube-system
来管理证书(它将在 2 小时后过期)。初始化阶段不需要传递证书密钥
所以你可以做到
kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT"
稍后
kubeadm init phase upload-certs --upload-certs
该命令将输出可用于创建的秘密的证书密钥
kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT --token <token> \
--discovery-token-ca-cert-hash <hash> \
--control-plane \
--certificate-key <key from previous commmand>
所以我知道如何将工作节点添加到现有的 Kubernetes 1.14 集群(使用 kubeadm
设置):kubeadm token create --print-join-command
将打印一个有效的 kubeadm join
命令参数 --token
和 --discovery-token-ca-cert-hash
.
我目前了解到,要向控制平面(主节点)添加另一个节点 kubeadm join
需要额外的参数 --experimental-control-plane
(w/o 值)和 --certificate-key
。这适用于堆叠式控制平面和 etcd 节点。
如何(在哪个文件中)为现有集群获取 --certificate-key
的正确值?
UPDATE 我的第一个(也是目前唯一的)主节点是在没有参数 --experimental-upload-certs
到 kubeadm init
的情况下创建的(而是 kubeadm init --pod-network-cidr=10.244.0.0/16
).因此 manual certificate distribution 应该适用,因此可能的步骤顺序可能是:
- 将
/etc/kubernetes/pki/{ca.*,sa.*,front-proxy-sa.*,etcd/ca.*}
中的证书和密钥从第一个复制到新的主节点 - 运行
kubeadm token create --print-join-command
在第一个主节点上 - 运行 在新主节点 上打印带有附加参数
--experimental-control-plane
的 kubeadm join
命令
这是正确的程序吗?
根据documentation,此命令提供了一个新的解密密钥:
kubeadm init phase upload-certs --experimental-upload-certs
我在 1.17 中一直在努力解决这个问题,最后发现这个命令会预先生成一个我可以在 kubeadmn init
和 kubeadmn join
中使用的证书密钥。为了让它工作,你需要传递 --upload-certs
以及当你 运行 kubeadmn init
类似于你为 1.14.
# generate a certificate-key to be used
kubeadm alpha certs certificate-key
# initialize first master using above key, --upload-certs (and other parameters)
kubeadm init --control-plane-endpoint $API_SERVER:6443 --upload-certs --apiserver-cert-extra-sans $API_SERVER --certificate-key $CERT-KEY
# join other masters using the same certificate-key
kubeadm join $API_SERVER:6443 --token $TOKEN --discovery-token-ca-cert-hash $CAHASH --control-plane --certificate-key $CERT-KEY
给出答案的替代方法是使用 kubeadm
通过将证书作为秘密上传到 kube-system
来管理证书(它将在 2 小时后过期)。初始化阶段不需要传递证书密钥
所以你可以做到
kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT"
稍后
kubeadm init phase upload-certs --upload-certs
该命令将输出可用于创建的秘密的证书密钥
kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT --token <token> \
--discovery-token-ca-cert-hash <hash> \
--control-plane \
--certificate-key <key from previous commmand>