- 如果沒有特殊指明,所有操作均在 zhaoyixin-k8s-01 節點上執行。
- 本節操作只需要部署一次,生成的 kubeconfig 文件是通用的,可以拷貝到需要執行 kubectl 命令的機器的
~/.kube/config
位置。
下載 kubectl 二進制文件
cd /opt/k8s/work
wget https://dl.k8s.io/v1.16.6/kubernetes-client-linux-amd64.tar.gz
tar -xzvf kubernetes-client-linux-amd64.tar.gz
分發到所有使用 kubectl 工具的節點:
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp kubernetes/client/bin/kubectl root@${node_ip}:/opt/k8s/bin/
ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
done
創建 admin 證書和私鑰
kubectl 使用 https 協議與 kube-apiserver 進行安全通信,kube-apiserver 對 kubectl 請求包含的證書進行認證和授權。
kubectl 后續用於集群管理,所以這里創建具有最高權限的 admin 證書。
創建證書簽名請求文件:
cd /opt/k8s/work
cat > admin-csr.json <<EOF
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:masters",
"OU": "zhaoyixin"
}
]
}
EOF
O: system:masters
:kube-apiserver 收到使用該證書的客戶端請求后,為請求添加組(Group)認證標識system:masters
;- 預定義的 ClusterRoleBinding
cluster-admin
將 Groupsystem:masters
與 Rolecluster-admin
綁定,該 Role 授予操作集群所需的最高權限; - 該證書只會被 kubectl 當做 client 證書使用,所以
hosts
字段為空。
生成證書和私鑰:
cd /opt/k8s/work
cfssl gencert -ca=/opt/k8s/work/ca.pem \
-ca-key=/opt/k8s/work/ca-key.pem \
-config=/opt/k8s/work/ca-config.json \
-profile=kubernetes admin-csr.json | cfssljson -bare admin
ls admin*
創建 kubeconfig 文件
kubectl 使用 kubeconfig 文件訪問 apiserver,該文件包含 kube-apiserver 的地址和認證信息(CA 證書和客戶端證書):
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
# 設置集群參數
kubectl config set-cluster kubernetes \
--certificate-authority=/opt/k8s/work/ca.pem \
--embed-certs=true \
--server=https://${NODE_IPS[0]}:6443 \
--kubeconfig=kubectl.kubeconfig
# 設置客戶端認證參數
kubectl config set-credentials admin \
--client-certificate=/opt/k8s/work/admin.pem \
--client-key=/opt/k8s/work/admin-key.pem \
--embed-certs=true \
--kubeconfig=kubectl.kubeconfig
# 設置上下文參數
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=admin \
--kubeconfig=kubectl.kubeconfig
# 設置默認上下文
kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig
--certificate-authority
:驗證 kube-apiserver 證書的根證書;--client-certificate
:剛生成的 admin 證書,與 kube-apiserver https 通信時使用;--client-key
: 剛生成的 admin 私鑰,與 kube-apiserver https 通信時使用;--embed-certs=true
: 將ca.pem
和admin.pem
證書內容嵌入到生成的 kubectl.kubeconfig 文件中(否則,寫入的是證書文件路徑,后續拷貝 kubeconfig 到其它機器時,還需要單獨拷貝證書文件);server
:指定 kube-apiserver 的地址,這里指向第一個節點上的服務。
分發到所有使用 kubectl 命令的節點:
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "mkdir -p ~/.kube"
scp kubectl.kubeconfig root@${node_ip}:~/.kube/config
done