tags: kubectl

03.部署 kubectl 命令行工具

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

kubectl 默认从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息,如果没有配置,执行 kubectl 命令时可能会出错:

  1. $ kubectl get pods
  2. The connection to the server localhost:8080 was refused - did you specify the right host or port?

本文档只需要部署一次,生成的 kubeconfig 文件与机器无关。

下载和分发 kubectl 二进制文件

下载和解压:

  1. wget https://dl.k8s.io/v1.10.4/kubernetes-client-linux-amd64.tar.gz
  2. tar -xzvf kubernetes-client-linux-amd64.tar.gz

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

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

创建 admin 证书和私钥

kubectl 与 apiserver https 安全端口通信,apiserver 对提供的证书进行认证和授权。

kubectl 作为集群的管理工具,需要被授予最高权限。这里创建具有最高权限的 admin 证书。

创建证书签名请求:

  1. cat > admin-csr.json <<EOF
  2. {
  3. "CN": "admin",
  4. "hosts": [],
  5. "key": {
  6. "algo": "rsa",
  7. "size": 2048
  8. },
  9. "names": [
  10. {
  11. "C": "CN",
  12. "ST": "BeiJing",
  13. "L": "BeiJing",
  14. "O": "system:masters",
  15. "OU": "4Paradigm"
  16. }
  17. ]
  18. }
  19. EOF
  • O 为 system:masters,kube-apiserver 收到该证书后将请求的 Group 设置为 system:masters;
  • 预定义的 ClusterRoleBinding cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予所有 API的权限;
  • 该证书只会被 kubectl 当做 client 证书使用,所以 hosts 字段为空;

生成证书和私钥:

  1. cfssl gencert -ca=/etc/kubernetes/cert/ca.pem \
  2. -ca-key=/etc/kubernetes/cert/ca-key.pem \
  3. -config=/etc/kubernetes/cert/ca-config.json \
  4. -profile=kubernetes admin-csr.json | cfssljson -bare admin
  5. ls admin*

创建 kubeconfig 文件

kubeconfig 为 kubectl 的配置文件,包含访问 apiserver 的所有信息,如 apiserver 地址、CA 证书和自身使用的证书;

  1. source /opt/k8s/bin/environment.sh
  2. # 设置集群参数
  3. kubectl config set-cluster kubernetes \
  4. --certificate-authority=/etc/kubernetes/cert/ca.pem \
  5. --embed-certs=true \
  6. --server=${KUBE_APISERVER} \
  7. --kubeconfig=kubectl.kubeconfig
  8. # 设置客户端认证参数
  9. kubectl config set-credentials admin \
  10. --client-certificate=admin.pem \
  11. --client-key=admin-key.pem \
  12. --embed-certs=true \
  13. --kubeconfig=kubectl.kubeconfig
  14. # 设置上下文参数
  15. kubectl config set-context kubernetes \
  16. --cluster=kubernetes \
  17. --user=admin \
  18. --kubeconfig=kubectl.kubeconfig
  19. # 设置默认上下文
  20. kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig
  • --certificate-authority:验证 kube-apiserver 证书的根证书;
  • --client-certificate--client-key:刚生成的 admin 证书和私钥,连接 kube-apiserver 时使用;
  • --embed-certs=true:将 ca.pem 和 admin.pem 证书内容嵌入到生成的 kubectl.kubeconfig 文件中(不加时,写入的是证书文件路径);

分发 kubeconfig 文件

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

  1. source /opt/k8s/bin/environment.sh
  2. for node_ip in ${NODE_IPS[@]}
  3. do
  4. echo ">>> ${node_ip}"
  5. ssh k8s@${node_ip} "mkdir -p ~/.kube"
  6. scp kubectl.kubeconfig k8s@${node_ip}:~/.kube/config
  7. ssh root@${node_ip} "mkdir -p ~/.kube"
  8. scp kubectl.kubeconfig root@${node_ip}:~/.kube/config
  9. done
  • 保存到用户的 ~/.kube/config 文件;