015.Kubernetes二进制部署所有节点kubelet
目录
一 部署 kubelet
1.1 安装kubelet
1.2 分发kubelet
1.3 分发kubeconfig
1.5 分发bootstrap kubeconfig
1.6 创建kubelet 参数配置文件
1.7 分发kubelet 参数配置文件
1.8 创建kubelet systemd
1.9 分发kubelet systemd
二 启动验证
2.1 授权
2.2 启动kubelet
2.3 查看kubelet服务
三 approve CSR 请求
3.1 自动 approve CSR 请求
3.2 查看 kubelet 的情况
3.3 手动 approve server cert csr
四 kubelet API 接口
4.1 kubelet 提供的 API 接口
4.2 kubelet api 认证和授权
4.3 证书认证和授权
4.4 创建bear token 认证和授权
4.5 cadvisor 和 metrics
回到顶部
一 部署 kubelet
kubelet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如 exec、run、logs 等。
kubelet 启动时自动向 kube-apiserver 注册节点信息,内置的 cadvisor 统计和监控节点的资源使用情况。
为确保安全,部署时关闭了 kubelet 的非安全 http 端口,对请求进行认证和授权,拒绝未授权的访问(如 apiserver、heapster 的请求)。
1.1 安装kubelet
提示:k8smaster01节点已下载相应二进制,可直接分发至node节点。
1.2 分发kubelet
复制代码
1 [root@k8smaster01 ~]# cd /opt/k8s/work
2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
3 [root@k8smaster01 work]# for all_ip in ${ALL_IPS[@]}
4 do
5 echo ">>> ${all_ip}"
6 scp kubernetes/server/bin/kubelet root@${all_ip}:/opt/k8s/bin/
7 ssh root@${all_ip} "chmod +x /opt/k8s/bin/*"
8 done
复制代码
1.3 分发kubeconfig
复制代码
1 [root@k8smaster01 ~]# cd /opt/k8s/work
2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
3 [root@k8smaster01 work]# for all_name in ${ALL_NAMES[@]}
4 do
5 echo ">>> ${all_name}"
6
7 # 创建 token
8 export BOOTSTRAP_TOKEN=$(kubeadm token create \
9 --description kubelet-bootstrap-token \
10 --groups system:bootstrappers:${all_name} \
11 --kubeconfig ~/.kube/config)
12
13 # 设置集群参数
14 kubectl config set-cluster kubernetes \
15 --certificate-authority=/etc/kubernetes/cert/ca.pem \
16 --embed-certs=true \
17 --server=${KUBE_APISERVER} \
18 --kubeconfig=kubelet-bootstrap-${all_name}.kubeconfig
19
20 # 设置客户端认证参数
21 kubectl config set-credentials kubelet-bootstrap \
22 --token=${BOOTSTRAP_TOKEN} \
23 --kubeconfig=kubelet-bootstrap-${all_name}.kubeconfig
24
25 # 设置上下文参数
26 kubectl config set-context default \
27 --cluster=kubernetes \
28 --user=kubelet-bootstrap \
29 --kubeconfig=kubelet-bootstrap-${all_name}.kubeconfig
30
31 # 设置默认上下文
32 kubectl config use-context default --kubeconfig=kubelet-bootstrap-${all_name}.kubeconfig
33 done
复制代码
解释:
向 kubeconfig 写入的是 token,bootstrap 结束后 kube-controller-manager 为 kubelet 创建 client 和 server 证书。
token 有效期为 1 天,超期后将不能再被用来 boostrap kubelet,且会被 kube-controller-manager 的 tokencleaner 清理;
kube-apiserver 接收 kubelet 的 bootstrap token 后,将请求的 user 设置为 system:bootstrap:,group 设置为 system:bootstrappers,后续将为这个 group 设置 ClusterRoleBinding。
复制代码
1 [root@k8smaster01 work]# kubeadm token list --kubeconfig ~/.kube/config #查看 kubeadm 为各节点创建的 token
2 [root@k8smaster01 work]# kubectl get secrets -n kube-system|grep bootstrap-token #查看各 token 关联的 Secret
复制代码
clipboard
1.5 分发bootstrap kubeconfig
复制代码
1 [root@k8smaster01 ~]# cd /opt/k8s/work
2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
3 [root@k8smaster01 work]# for all_name in ${ALL_NAMES[@]}
4 do
5 echo ">>> ${all_name}"
6 scp kubelet-bootstrap-${all_name}.kubeconfig root@${all_name}:/etc/kubernetes/kubelet-bootstrap.kubeconfig
7 done
复制代码
1.6 创建kubelet 参数配置文件
从 v1.10 开始,部分 kubelet 参数需在配置文件中配置,建议创建kubelet配置文件。
复制代码
1 [root@k8smaster01 ~]# cd /opt/k8s/work
2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
3 [root@k8smaster01 work]# cat > kubelet-config.yaml.template <>> ${all_ip}"
6 sed -e "s/##ALL_IP##/${all_ip}/" kubelet-config.yaml.template > kubelet-config-${all_ip}.yaml.template
7 scp kubelet-config-${all_ip}.yaml.template root@${all_ip}:/etc/kubernetes/kubelet-config.yaml
8 done
复制代码
1.8 创建kubelet systemd
复制代码
1 [root@k8smaster01 ~]# cd /opt/k8s/work
2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
3 [root@k8smaster01 work]# cat > kubelet.service.template <>> ${all_name}"
6 sed -e "s/##ALL_NAME##/${all_name}/" kubelet.service.template > kubelet-${all_name}.service
7 scp kubelet-${all_name}.service root@${all_name}:/etc/systemd/system/kubelet.service
8 done
复制代码
回到顶部
二 启动验证
2.1 授权
kubelet 启动时查找 --kubeletconfig 参数对应的文件是否存在,如果不存在则使用 --bootstrap-kubeconfig 指定的 kubeconfig 文件向 kube-apiserver 发送证书签名请求 (CSR)。
kube-apiserver 收到 CSR 请求后,对其中的 Token 进行认证,认证通过后将请求的 user 设置为 system:bootstrap:,group 设置为 system:bootstrappers,这一过程称为 Bootstrap Token Auth。
默认情况下,这个 user 和 group 没有创建 CSR 的权限,因此kubelet 会启动失败,可通过如下方式创建一个 clusterrolebinding,将 group system:bootstrappers 和 clusterrole system:node-bootstrapper 绑定。
复制代码
1 [root@k8smaster01 ~]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --group=system:bootstrappers
复制代码
2.2 启动kubelet
复制代码
1 [root@k8smaster01 ~]# source /opt/k8s/bin/environment.sh
2 [root@k8smaster01 ~]# for all_name in ${ALL_NAMES[@]}
3 do
4 echo ">>> ${all_name}"
5 ssh root@${all_name} "mkdir -p ${K8S_DIR}/kubelet/kubelet-plugins/volume/exec/"
6 ssh root@${all_name} "/usr/sbin/swapoff -a"
7 ssh root@${all_name} "systemctl daemon-reload && systemctl enable kubelet && systemctl restart kubelet"
8 done
复制代码
kubelet 启动后使用 --bootstrap-kubeconfig 向 kube-apiserver 发送 CSR 请求,当这个 CSR 被 approve 后,kube-controller-manager 为 kubelet 创建 TLS 客户端证书、私钥和 --kubeletconfig 文件。
注意:kube-controller-manager 需要配置 --cluster-signing-cert-file 和 --cluster-signing-key-file 参数,才会为 TLS Bootstrap 创建证书和私钥。
提示:
启动服务前必须先创建工作目录;
关闭 swap 分区,否则 kubelet 会启动失败。
2.3 查看kubelet服务
复制代码
1 [root@k8smaster01 ~]# source /opt/k8s/bin/environment.sh
2 [root@k8smaster01 ~]# for all_name in ${ALL_NAMES[@]}
3 do
4 echo ">>> ${all_name}"
5 ssh root@${all_name} "systemctl status kubelet"
6 done
7 [root@k8snode01 ~]# kubectl get csr
8 [root@k8snode01 ~]# kubectl get nodes
复制代码
clipboard
回到顶部
三 approve CSR 请求
3.1 自动 approve CSR 请求
创建三个 ClusterRoleBinding,分别用于自动 approve client、renew client、renew server 证书。
复制代码
1 [root@k8snode01 ~]# cd /opt/k8s/work
2 [root@k8snode01 work]# cat > csr-crb.yaml <