TLS Bootstraping:在kubernetes集群中,Node上组件kubelet和kube-proxy都需要与kube-apiserver进行通信,为了增加传输安全性,采用https方式。这就涉及到Node组件需要具备kube-apiserver用的证书颁发机构(CA)签发客户端证书,当规模较大时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。
为了简化流程,Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书,所以强烈建议在Node上使用这种方式。
步骤:
拷贝一些文件和目录到需要添加的节点上
scp -r /opt/kubernetes/ root@192.168.31.63:/opt/
scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.31.63:/usr/lib/systemd/system
scp -r /opt/cni/ root@192.168.31.63:/opt
在master节点的/opt/kubernetes/cfg/kube-apiserver.conf
配置文件中新增一行:--enable-bootstrap-token-auth=true
,之后重启apiserver服务:systemctl restart kube-apiserver
使用Secret存储Token:
Bootstrap Token值格式:07401b.
f395accd246ae52d (点左边是Token ID,右边Token Secret)
apiVersion: v1
kind: Secret
metadata:
name: bootstrap-token-07401b
namespace: kube-system
type: bootstrap.kubernetes.io/token
stringData:
description: The default bootstrap token
token-id: 07401b
token-secret: f395accd246ae52d
expiration: 2020-08-31T03:22:11Z
usage-bootstrap-authentication: true
usage-bootstrap-signing: true
注意:secret名称必须以
bootstrap-token-
开头,后面跟token ID;type:必须是bootstrap.kubernetes.io/token
;expiration:token过期时间
参考:使用启动引导令牌(Bootstrap Tokens)认证
自动化脚本:
bootstrap-token.sh
# 指定 apiserver 地址
KUBE_APISERVER="https://192.168.31.71:6443"
# 生成 Bootstrap Token
TOKEN_ID=$(head -c 6 /dev/urandom | md5sum | head -c 6)
TOKEN_SECRET=$(head -c 16 /dev/urandom | md5sum | head -c 16)
BOOTSTRAP_TOKEN="${TOKEN_ID}.${TOKEN_SECRET}"
echo "Bootstrap Token: ${BOOTSTRAP_TOKEN}"
# 使用secret存储token
cat >> bootstrap-secret.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
# 名字必须该格式
name: bootstrap-token-${TOKEN_ID}
namespace: kube-system
# 必须该类型
type: bootstrap.kubernetes.io/token
stringData:
description: "The default bootstrap token."
token-id: ${TOKEN_ID}
token-secret: ${TOKEN_SECRET}
expiration: $(date -d'+2 day' -u +"%Y-%m-%dT%H:%M:%SZ")
usage-bootstrap-authentication: "true"
usage-bootstrap-signing: "true"
EOF
kubectl apply -f bootstrap-secret.yaml
# 指定 apiserver 地址
KUBE_APISERVER="https://192.168.31.71:6443"
# 生成 kubelet bootstrap kubeconfig 配置文件
kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig
kubectl config set-credentials "system:bootstrap:${TOKEN_ID}" \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=bootstrap.kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user="system:bootstrap:${TOKEN_ID}" \
--kubeconfig=bootstrap.kubeconfig
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
# 允许 kubelet tls bootstrap 创建 CSR 请求
kubectl create clusterrolebinding create-csrs-for-bootstrapping \
--clusterrole=system:node-bootstrapper \
--group=system:bootstrappers
创建证书的yaml写法:
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority: /opt/kubernetes/ssl/ca.pem
server: https://192.168.31.71:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubelet-bootstrap:07401b
name: default
current-context: default
preferences: {}
users:
- name: kubelet-bootstrap:07401b
user:
token: 07401b.f395accd246ae52d
将bootstrap.kubeconfig拷贝到目标及其上:
scp bootstrap.kubeconfig root@192.168.31.63:/opt/kubernetes/cfg
在kubelet 配置文件指定bootstrap kubeconfig文件
vim /opt/kubernetes/cfg/kubelet.conf
....
--hostname-override=k8s-node3 \
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
启动目标机器上的kubelet
systemctl start kubelet
systemctl enable kubelet
--kubeconfig= 指定kubelet.kubeconfig路径,初次这个文件是没有的
节点名称也不要忘记更改
在master节点查看生成证书的请求
kubectl get csr
颁发状态为pending的证书:
kubectl certificate approve node-csr-xxx
颁发完成之后,请求状态变为Approved。
查看node状态,看新增的节点有无添加进来:
kubectl get node
节点添加完毕,bootstrap.kubeconf文件就没用了,之后节点就会携带kubectl.kubeconf文件去访问apiserver。
流程:
1、初次申请 kubelet -> bootstrap.kubeconfig(token) -> apiserver(申请证书) -> controller-manager颁发证书 -> 证书已经颁发成功(kubectl get csr 管理员手动审批)
2、后续使用 kubelet -> kubelet.kubeconfig(ip、客户端证书信息) -> apiserver
“The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.” – Tom Cargill
标 题:Kubernetes 集群维护(上)-Bootstrap Token 方式增加Node(二进制部署)