Leif160519的blog Leif160519的blog

——————

目录
Kubernetes 集群维护(上)-Bootstrap Token 方式增加Node(二进制部署)
/    

Kubernetes 集群维护(上)-Bootstrap Token 方式增加Node(二进制部署)

1. Bootstrap Token 方式增加Node

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

1.1 kube-apiserver启用Bootstrap Token

在master节点的/opt/kubernetes/cfg/kube-apiserver.conf配置文件中新增一行:--enable-bootstrap-token-auth=true,之后重启apiserver服务:systemctl restart kube-apiserver

1.2 使用Secret存储Bootstrap Token

使用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

1.3 创建RBAC角色绑定,允许 kubelet tls bootstrap 创建 CSR 请求

# 指定 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

1.4 kubelet配置Bootstrap kubeconfig文件

将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路径,初次这个文件是没有的
节点名称也不要忘记更改

1.5 颁发证书

在master节点查看生成证书的请求

kubectl get csr

颁发状态为pending的证书:

kubectl certificate approve  node-csr-xxx

颁发完成之后,请求状态变为Approved。

查看node状态,看新增的节点有无添加进来:

kubectl get node

节点添加完毕,bootstrap.kubeconf文件就没用了,之后节点就会携带kubectl.kubeconf文件去访问apiserver。

2 小结

流程:
1、初次申请 kubelet -> bootstrap.kubeconfig(token) -> apiserver(申请证书) -> controller-manager颁发证书 -> 证书已经颁发成功(kubectl get csr 管理员手动审批)
2、后续使用 kubelet -> kubelet.kubeconfig(ip、客户端证书信息) -> apiserver

参考:TLS bootstrapping


“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(二进制部署)
作  者Leif160519
出  处https://github.icu/articles/2020/08/08/1596882664319.html
关于博主:坐标南京,运维工程师,如有问题探讨可以直接下方留言。
声援博主:如果您觉得文章对您有帮助,可以评论、订阅、收藏。您的鼓励是博主的最大动力!