创建 kubeconfig 文件

作者:张杰  [email protected]

注意:请先参考安装kubectl命令行工具,先在 master 节点上安装 kubectl 然后再进行下面的操作。

kubeletkube-proxy等 Node 机器上的进程与 Master 机器的kube-apiserver进程通信时需要认证和授权;

kubernetes 1.4 开始支持由kube-apiserver为客户端生成 TLS 证书的TLS Bootstrapping功能,这样就不需要为每个客户端生成证书了;该功能当前仅支持为kubelet生成证书;

因为我的master节点和node节点复用,所有在这一步其实已经安装了kubectl。参考安装kubectl命令行工具

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

创建 TLS Bootstrapping Token

Token auth file

Token可以是任意的包涵128 bit的字符串,可以使用安全的随机数发生器生成。

cd /etc/kubernetes/

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 请求;

创建 kubelet bootstrapping kubeconfig 文件

cd /etc/kubernetes
export KUBE_APISERVER="https://${IP}: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

会在当前目录下生成 bootstrap.kubeconfig 配置文件

  • --embed-certstrue时表示将certificate-authority证书写入到生成的bootstrap.kubeconfig文件中;

  • 设置客户端认证参数时没有指定秘钥和证书,后续由kube-apiserver自动生成;

创建 kube-proxy kubeconfig 文件

cd /etc/kubernetes
export KUBE_APISERVER="https://${IP}: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-authorityclient-certificateclient-key指向的证书文件内容写入到生成的kube-proxy.kubeconfig文件中;
  • kube-proxy.pem证书中 CN 为system:kube-proxykube-apiserver预定义的 RoleBindingcluster-admin将Usersystem:kube-proxy与 Rolesystem:node-proxier绑定,该 Role 授予了调用kube-apiserverProxy 相关 API 的权限;

分发 kubeconfig 文件

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

cp bootstrap.kubeconfig kube-proxy.kubeconfig /etc/kubernetes/

results matching ""

    No results matching ""