一,下载和分发 kubectl 二进制文件
注意:
- 如果没有特殊指明,本文档的所有操作均在 k8s-master01 节点上执行,然后远程分发文件和执行命令
- 本文档只需要部署一次,生成的 kubeconfig 文件是通用的,可以拷贝到需要执行 kubeclt 命令的机器上
下载和解压:
wget https://dl.k8s.io/v1.14.2/kubernetes-node-linux-amd64.tar.gz
mkdir -p /opt/kubernetes/package
tar -xzvf kubernetes-node-linux-amd64.tar.gz -C /opt/kubernetes/package/
#验证是否解压成功
ls /opt/kubernetes/package/kubernetes/node/bin
二,分发 kubectl 到所有使用 kubectl 的节点
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
scp /opt/kubernetes/package/kubernetes/node/bin/kubectl root@${master_ip}:/opt/kubernetes/bin/
ssh root@${master_ip} "chmod +x /opt/kubernetes/bin/*"
done
#验证是否分发成功
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
ssh root@${master_ip} "ls -ld /opt/kubernetes/bin/kubectl"
done
三,创建 admin 证书和私钥
kubectl 与 apiserver https 安全端口通信,apiserver 对提供的证书进行认证和授权。
kubectl 作为集群的管理工具,需要被授予最高权限。这里创建具有最高权限的 admin 证书。
创建证书签名请求
cd /opt/kubernetes/ssl cat > admin-csr.json <<EOF { "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "system:masters", "OU": "System" } ] } EOF
- O 为
system:masters
,kube-apiserver 收到该证书后将请求的 Group 设置为 system:masters; - 预定义的 ClusterRoleBinding
cluster-admin
将 Groupsystem:masters
与 Rolecluster-admin
绑定,该 Role 授予所有 API的权限; - 该证书只会被 kubectl 当做 client 证书使用,所以 hosts 字段为空;
四,生成admin证书和私钥
cd /opt/kubernetes/ssl
cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
-ca-key=/opt/kubernetes/ssl/ca-key.pem \
-config=/opt/kubernetes/ssl/ca-config.json \
-profile=kubernetes admin-csr.json | cfssljson -bare admin
#验证是否生成成功
ls admin.csr admin-key.pem admin.pem
五,创建 kubeconfig 文件
kubeconfig 为 kubectl 的配置文件,包含访问 apiserver 的所有信息,如 apiserver 地址、CA 证书和自身使用的证书
cd /opt/kubernetes/ssl
#设置集群参数
kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=https://172.27.128.200:6443
#设置客户端认证参数
kubectl config set-credentials admin \
--client-certificate=/opt/kubernetes/ssl/admin.pem \
--embed-certs=true \
--client-key=/opt/kubernetes/ssl/admin-key.pem
#设置上下文参数
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=admin
#设置默认上下文
kubectl config use-context kubernetes
--certificate-authority
:验证 kube-apiserver 证书的根证书;--client-certificate
、--client-key
:刚生成的admin
证书和私钥,连接 kube-apiserver 时使用;--embed-certs=true
:将 ca.pem 和 admin.pem 证书内容嵌入到生成的 kubectl.kubeconfig 文件中(不加时,写入的是证书文件路径);
六,分发 kubeconfig 文件
分发到所有使用 kubectl
命令的节点
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
ssh root@${master_ip} "mkdir -p ~/.kube"
scp ~/.kube/config root@${master_ip}:~/.kube/config
done
#验证是否创建目录,分发成功
source /root/env.sh
for master_ip in ${MASTER_IPS[@]}
do
echo -e "\033[31m>>> ${master_ip} \033[0m"
ssh root@${master_ip} "ls -ld ~/.kube"
done
保存到用户的 ~/.kube/config
文件