Kubernetes集群之创建kubeconfig文件

Create The File Of Kubeconfig For K8s

Posted by ChenJian on April 26, 2017

系列博文

Kubeconfig文件

kubeconfig文件记录k8s集群的各种信息,对集群构建非常重要。

  • kubectl命令行工具从~/.kube/config,即kubectl的kubeconfig文件中获取访问kube-apiserver的地址,证书和用户名等信息

  • kubelet/kube-proxy等在Node上的程序进程同样通过bootstrap.kubeconfigkube-proxy.kubeconfig上提供的认证与授权信息与Master进行通讯

下载kubectl二进制文件

增加环境变量

操作服务器IP:192.168.1.171,即K8s-master。在此之前,需要对服务器进行准备工作,例如环境变量的设置,具体操作请阅读Kubernetes集群之安全设置

  • KUBE_APISERVER指定kubectl访问的kube-apiserver的地址,后续被写入~/.kube/config配置文件

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

    • 更新token.csv文件,分发到所有机器(master和node的/etc/kubernetes/目录下
    • 重新生成bootstrap.kubeconfig文件,分发到所有node机器的/etc/kubernetes/目录下
    • 重启kube-apiserver和kubelet进程
    • 重新approve kubelet的csr请求
下载二进制文件
wget https://dl.k8s.io/v1.6.2/kubernetes-client-linux-amd64.tar.gz
tar -xzvf kubernetes-client-linux-amd64.tar.gz
sudo cp kubernetes/client/bin/kube* /root/local/bin/
chmod a+x /root/local/bin/kube*

所有的资源可以在这里进行下载

生成Token文件

Kubelet在首次启动时,会向kube-apiserver发送TLS Bootstrapping请求。如果kube-apiserver验证其与自己的token.csv一致,则为kubelete生成CA与key。

# 生成Token文件
cat > token.csv <<EOF 
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

cp token.csv /etc/kubernetes/

生成kubectl的kubeconfig文件

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

<<'COMMENT'
Cluster "kubernetes" set.
COMMENT

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

<<'COMMENT'
User "admin" set.
COMMENT

# 设置上下文参数
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=admin

<<'COMMENT'
Context "kubernetes" set.
COMMENT

# 设置默认上下文
kubectl config use-context kubernetes

<<'COMMENT'
Switched to context "kubernetes".
COMMENT
  • admin.pem证书的OU字段值为system:masters,kube-apiserver预定义的RoleBinding cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该Role授予了调用kube-apiserver相关API的权限

  • 生成的kubeconfig被保存到~/.kube/config文件

ls ~/.kube/
<<'COMMENT'
config
COMMENT

生成kubelet的bootstrapping kubeconfig文件

kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig

<<'COMMENT'
Cluster "kubernetes" set.
COMMENT

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

<<'COMMENT'
User "kubelet-bootstrap" set.
COMMENT

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

<<'COMMENT'
Context "default" set.
COMMENT


# 设置默认上下文
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig

<<'COMMENT'
Switched to context "default".
COMMENT
  • --embed-certs为true时表示将certificate-authority证书写入到生成的bootstrap.kubeconfig文件中
  • 设置kubelet客户端认证参数时没有指定秘钥和证书,后续由kube-apiserver自动生成;
  • 生成的bootstrap.kubeconfig文件会在当前文件路径下

生成kube-proxy的kubeconfig文件

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

<<'COMMENT'
Cluster "kubernetes" set.
COMMENT

# 设置客户端认证参数
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

<<'COMMENT'
User "kube-proxy" set.
COMMENT

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

<<'COMMENT'
Context "default" set.
COMMENT

# 设置默认上下文
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

<<'COMMENT'
Switched to context "default".
COMMENT
  • --embed-cert 都为 true,这会将certificate-authorityclient-certificateclient-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文件拷贝至Node上

操作服务器IP:

  • 192.168.1.171,即K8s-master
  • 192.168.1.173192.168.1.174,即两台K8s-node

将生成的两个kubeconfig文件拷贝到所有的Node的/etc/kubernetes/

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

知识共享许可协议本作品由陈健采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。