搭建kubernetes高可用集群-03创建kubeconfig文件

安装kubectl工具

  • 下载安装文件
    CHANGELOG 页面 下载 client 或 server tarball 文件
    server 的 tarball kubernetes-server-linux-amd64.tar.gz 已经包含了 client(kubectl) 二进制文件,所以不用单独下载kubernetes-client-linux-amd64.tar.gz文件;
wget https://dl.k8s.io/v1.10.2/kubernetes-server-linux-amd64.tar.gz
tar -xzvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes
  • 将二进制文件拷贝到指定路径
cp server/bin/kubectl /usr/local/bin/

创建kubeconfig文件

以下操作只需要在master节点上执行,生成的*.kubeconfig文件可以直接拷贝到node节点的/etc/kubernetes目录下

创建TLS Bootstrapping token

  • Token auth file
    Token可以是任意的包含128 bit的字符串,可以使用安全的随机数发生器生成
export BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
cat > token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

注意:在进行后续操作前请检查 token.csv 文件,确认其中的 ${BOOTSTRAP_TOKEN} 环境变量已经被真实的值替换。

BOOTSTRAP_TOKEN 将被写入到 kube-apiserver 使用的 token.csv 文件和 kubelet 使用的 bootstrap.kubeconfig 文件,如果后续重新生成了 BOOTSTRAP_TOKEN,则需要:

  1. 更新 token.csv 文件,分发到所有机器 (master 和 node)的 /etc/kubernetes/ 目录下,分发到node节点上非必需;
  2. 重新生成 bootstrap.kubeconfig 文件,分发到所有 node 机器的 /etc/kubernetes/ 目录下;
  3. 重启 kube-apiserver 和 kubelet 进程;
  4. 重新 approve kubelet 的 csr 请求;
cp token.csv /etc/kubernetes/

创建kubelet bootstrapping kubeconf文件

cd /etc/kubernetes
export KUBE_APISERVER="https://192.168.255.197:6443"

# 设置集群参数
kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=bootstrap.kubeconfig

# 设置客户端认证参数
kubectl config set-credentials kubelet-bootstrap \
  --token=${BOOTSTRAP_TOKEN} \
  --kubeconfig=bootstrap.kubeconfig

# 设置上下文参数
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kubelet-bootstrap \
  --kubeconfig=bootstrap.kubeconfig

# 设置默认上下文
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
  • –embed-certs 为 true 时表示将 certificate-authority 证书写入到生成的 bootstrap.kubeconfig 文件中;
  • 设置客户端认证参数时没有指定秘钥和证书,后续由 kube-apiserver 自动生成;

创建kube-proxy kubeconf文件

export KUBE_APISERVER="https://192.168.255.197:6443"
# 设置集群参数
kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=kube-proxy.kubeconfig

# 设置客户端认证参数
kubectl config set-credentials kube-proxy \
  --client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \
  --client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig

# 设置上下文参数
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig

# 设置默认上下文
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
  • 设置集群参数和客户端认证参数时 –embed-certs 都为 true,这会将 certificate-authority、client-certificate 和 client-key 指向的证书文件内容写入到生成的 kube-proxy.kubeconfig 文件中;
  • kube-proxy.pem 证书中 CN 为 system:kube-proxy,kube-apiserver 预定义的 RoleBinding cluster-admin 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;

分发kubeconfig文件

将两个 kubeconfig 文件分发到所有 Node 机器的 /etc/kubernetes/ 目录

cp *.kubeconfig /etc/kubernetes/

总结

到目前为止,已经生成的文件清单如下:

# tree /etc/kubernetes/
/etc/kubernetes/
├── bootstrap.kubeconfig
├── kube-proxy.kubeconfig
├── ssl
│   ├── admin-key.pem
│   ├── admin.pem
│   ├── ca-key.pem
│   ├── ca.pem
│   ├── kube-proxy-key.pem
│   ├── kube-proxy.pem
│   ├── kubernetes-key.pem
│   └── kubernetes.pem
└── token.csv

1 directory, 11 files

分发证书文件及kubeconfig文件到对应节点

  1. 复制 bootstrap.kubeconfig、kube-proxy.kubeconfig、 token.csv 文件到k8s集群的所有机器的 /etc/kubernetes/目录下(etcd节点除外)
  2. 复制 ca.pem、kubernetes-key.pem、kubernetes.pem 到etcd节点的 /etc/kubernetes/ssl目录下, etcd共用kubernetes证书文件
  3. 复制 ca.pem、kubernetes-key.pem、kubernetes.pem 到api-server节点的 /etc/kubernetes/ssl目录下
  4. 复制 admin-key.pem、admin.pem 、ca-key.pem、 ca.pem 到主备master节点/etc/kubernetes/ssl目录下
  5. 复制 ca.pem、kube-proxy-key.pem、kube-proxy.pem 到所有node 节点/etc/kubernetes/ssl目录下
-------------the end-------------