部署 kubectl 命令行工具

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

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

本文档介绍下载和配置 kubernetes 集群命令行工具 kubectl 的步骤。

需要将下载的 kubectl 二进制程序和生成的 ~/.kube/config 配置文件拷贝到所有使用 kubectl 命令的机器

使用的变量

本文档用到的变量定义如下:

  1. $ export MASTER_IP=10.64.3.7 # 替换为 kubernetes master 集群任一机器 IP
  2. $ export KUBE_APISERVER="https://${MASTER_IP}:6443"
  3. $
  • 变量 KUBE_APISERVER 指定 kubelet 访问的 kube-apiserver 的地址,后续被写入 ~/.kube/config 配置文件;

下载 kubectl

  1. $ wget https://dl.k8s.io/v1.6.2/kubernetes-client-linux-amd64.tar.gz
  2. $ tar -xzvf kubernetes-client-linux-amd64.tar.gz
  3. $ sudo cp kubernetes/client/bin/kube* /root/local/bin/
  4. $ chmod a+x /root/local/bin/kube*
  5. $ export PATH=/root/local/bin:$PATH
  6. $

创建 admin 证书

kubectl 与 kube-apiserver 的安全端口通信,需要为安全通信提供 TLS 证书和秘钥。

创建 admin 证书签名请求

  1. $ cat admin-csr.json
  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": "System"
  16. }
  17. ]
  18. }
  • 后续 kube-apiserver 使用 RBAC 对客户端(如 kubeletkube-proxyPod)请求进行授权;
  • kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings,如 cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 所有 API的权限;
  • O 指定该证书的 Group 为 system:masterskubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;
  • hosts 属性值为空列表;

生成 admin 证书和私钥:

  1. $ cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  2. -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  3. -config=/etc/kubernetes/ssl/ca-config.json \
  4. -profile=kubernetes admin-csr.json | cfssljson -bare admin
  5. $ ls admin*
  6. admin.csr admin-csr.json admin-key.pem admin.pem
  7. $ sudo mv admin*.pem /etc/kubernetes/ssl/
  8. $ rm admin.csr admin-csr.json
  9. $

创建 kubectl kubeconfig 文件

  1. $ # 设置集群参数
  2. $ kubectl config set-cluster kubernetes \
  3. --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  4. --embed-certs=true \
  5. --server=${KUBE_APISERVER}
  6. $ # 设置客户端认证参数
  7. $ kubectl config set-credentials admin \
  8. --client-certificate=/etc/kubernetes/ssl/admin.pem \
  9. --embed-certs=true \
  10. --client-key=/etc/kubernetes/ssl/admin-key.pem
  11. $ # 设置上下文参数
  12. $ kubectl config set-context kubernetes \
  13. --cluster=kubernetes \
  14. --user=admin
  15. $ # 设置默认上下文
  16. $ kubectl config use-context kubernetes
  • admin.pem 证书 O 字段值为 system:masterskube-apiserver 预定义的 RoleBinding cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 相关 API 的权限;
  • 生成的 kubeconfig 被保存到 ~/.kube/config 文件;

分发 kubeconfig 文件

~/.kube/config 文件拷贝到运行 kubelet 命令的机器的 ~/.kube/ 目录下。