03. 安装和配置 kubectl

本文档介绍安装和配置 kubernetes 命令行管理工具 kubectl 的步骤。

注意:

  1. 如果没有特殊指明,本文档的所有操作均在 zhangjun-k8s-01 节点上执行
  2. 本文档只需要部署一次,生成的 kubeconfig 文件是通用的,可以拷贝到需要执行 kubectl 命令的机器的 ~/.kube/config 位置;

下载和分发 kubectl 二进制文件

  1. cd /opt/k8s/work
  2. wget https://dl.k8s.io/v1.16.6/kubernetes-client-linux-amd64.tar.gz # 自行解决翻墙下载问题
  3. tar -xzvf kubernetes-client-linux-amd64.tar.gz

分发到所有使用 kubectl 工具的节点:

  1. cd /opt/k8s/work
  2. source /opt/k8s/bin/environment.sh
  3. for node_ip in ${NODE_IPS[@]}
  4. do
  5. echo ">>> ${node_ip}"
  6. scp kubernetes/client/bin/kubectl root@${node_ip}:/opt/k8s/bin/
  7. ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
  8. done

创建 admin 证书和私钥

kubectl 使用 https 协议与 kube-apiserver 进行安全通信,kube-apiserver 对 kubectl 请求包含的证书进行认证和授权。

kubectl 后续用于集群管理,所以这里创建具有最高权限的 admin 证书。

创建证书签名请求:

  1. cd /opt/k8s/work
  2. cat > admin-csr.json <<EOF
  3. {
  4. "CN": "admin",
  5. "hosts": [],
  6. "key": {
  7. "algo": "rsa",
  8. "size": 2048
  9. },
  10. "names": [
  11. {
  12. "C": "CN",
  13. "ST": "BeiJing",
  14. "L": "BeiJing",
  15. "O": "system:masters",
  16. "OU": "opsnull"
  17. }
  18. ]
  19. }
  20. EOF
  • O: system:masters:kube-apiserver 收到使用该证书的客户端请求后,为请求添加组(Group)认证标识 system:masters
  • 预定义的 ClusterRoleBinding cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予操作集群所需的最高权限;
  • 该证书只会被 kubectl 当做 client 证书使用,所以 hosts 字段为空;

生成证书和私钥:

  1. cd /opt/k8s/work
  2. cfssl gencert -ca=/opt/k8s/work/ca.pem \
  3. -ca-key=/opt/k8s/work/ca-key.pem \
  4. -config=/opt/k8s/work/ca-config.json \
  5. -profile=kubernetes admin-csr.json | cfssljson -bare admin
  6. ls admin*
  • 忽略警告消息 [WARNING] This certificate lacks a "hosts" field.

创建 kubeconfig 文件

kubectl 使用 kubeconfig 文件访问 apiserver,该文件包含 kube-apiserver 的地址和认证信息(CA 证书和客户端证书):

  1. cd /opt/k8s/work
  2. source /opt/k8s/bin/environment.sh
  3. # 设置集群参数
  4. kubectl config set-cluster kubernetes \
  5. --certificate-authority=/opt/k8s/work/ca.pem \
  6. --embed-certs=true \
  7. --server=https://${NODE_IPS[0]}:6443 \
  8. --kubeconfig=kubectl.kubeconfig
  9. # 设置客户端认证参数
  10. kubectl config set-credentials admin \
  11. --client-certificate=/opt/k8s/work/admin.pem \
  12. --client-key=/opt/k8s/work/admin-key.pem \
  13. --embed-certs=true \
  14. --kubeconfig=kubectl.kubeconfig
  15. # 设置上下文参数
  16. kubectl config set-context kubernetes \
  17. --cluster=kubernetes \
  18. --user=admin \
  19. --kubeconfig=kubectl.kubeconfig
  20. # 设置默认上下文
  21. kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig
  • --certificate-authority:验证 kube-apiserver 证书的根证书;
  • --client-certificate--client-key:刚生成的 admin 证书和私钥,与 kube-apiserver https 通信时使用;
  • --embed-certs=true:将 ca.pem 和 admin.pem 证书内容嵌入到生成的 kubectl.kubeconfig 文件中(否则,写入的是证书文件路径,后续拷贝 kubeconfig 到其它机器时,还需要单独拷贝证书文件,不方便。);
  • --server:指定 kube-apiserver 的地址,这里指向第一个节点上的服务;

分发 kubeconfig 文件

分发到所有使用 kubectl 命令的节点:

  1. cd /opt/k8s/work
  2. source /opt/k8s/bin/environment.sh
  3. for node_ip in ${NODE_IPS[@]}
  4. do
  5. echo ">>> ${node_ip}"
  6. ssh root@${node_ip} "mkdir -p ~/.kube"
  7. scp kubectl.kubeconfig root@${node_ip}:~/.kube/config
  8. done