什么是kubeconfig
kubeconfig文件包含了集群,用户,namespace和认证机制信息。kubectl命令使用kubeconfig文件选择需要连接的一个集群并且跟k8s api通信。这个文件支持多个集群,用户和认证机制。
文章结构
- 先提出一个使用kubeconfig需求
- 定义一个kubeconfig基本结构
- 添加集群、用户、上下文信息
- 如何删除一个用户
- 如何使用一键脚本生成kubeconfig
如下需求
假如现在有一个development集群和一个scratch集群,在development集群,你的前端工程师工作在frontend的namespace,你的存储工程师工作在storage的namespace。在你的scratch集群,开发者工作在default的namespace。开发访问development集群使用证书验证,访问scratch集群需要用帐号和密码。
定义一个kubeconfig基本结构
在集群master创建一个目录config-exercise,在目录创建config-demo,内容如下:
apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
name: development
- cluster:
name: scratch
users:
- name: developer
- name: experimenter
contexts:
- context:
name: dev-frontend
- context:
name: dev-storage
- context:
name: exp-scratch
添加集群、用户、上下文信息
上面配置文件包含集群,用户,上下文三个部分,这个config-demo文件有2个clusters,2个users,3个contexts的框架
- 添加集群详细信息到配置文件
kubectl config --kubeconfig=config-demo set-cluster development --server=https://1.2.3.4 --certificate-authority=fake-ca-file
kubectl config --kubeconfig=config-demo set-cluster scratch --server=https://5.6.7.8 --insecure-skip-tls-verify
- 添加用户详细信息到配置文件
kubectl config --kubeconfig=config-demo set-credentials developer --client-certificate=fake-cert-file --client-key=fake-key-seefile
kubectl config --kubeconfig=config-demo set-credentials experimenter --username=exp --password=some-password
- 添加上下文详细信息到配置文件
kubectl config --kubeconfig=config-demo set-context dev-frontend --cluster=development --namespace=frontend --user=developer
kubectl config --kubeconfig=config-demo set-context dev-storage --cluster=development --namespace=storage --user=developer
kubectl config --kubeconfig=config-demo set-context exp-scratch --cluster=scratch --namespace=default --user=experimenter
- 最终获得kubeconfig,如下
kubectl config --kubeconfig=config-demo view
输出内容如下:
apiVersion: v1
clusters:
- cluster:
certificate-authority: fake-ca-file
server: https://1.2.3.4
name: development
- cluster:
insecure-skip-tls-verify: true
server: https://5.6.7.8
name: scratch
contexts:
- context:
cluster: development
namespace: frontend
user: developer
name: dev-frontend
- context:
cluster: development
namespace: storage
user: developer
name: dev-storage
- context:
cluster: scratch
namespace: default
user: experimenter
name: exp-scratch
current-context: ""
kind: Config
preferences: {}
users:
- name: developer
user:
client-certificate: fake-cert-file
client-key: fake-key-file
- name: experimenter
user:
password: some-password
username: exp
有时候你想要用base64编码数据代替认证文件,你需要添加后缀-data。例如:
certificate-authority-data, client-certificate-data, client-key-data
如何删除一个用户
这里的删除是对kubeconfig文件删除用户,如果要真正删除用户需要在集群中删除serviceacount。
kubectl config unset users.<name>
如何使用一键脚本生成kubeconfig
一键脚本如下:
#!/bin/bash -e
# Usage ./k8s-service-account-kubeconfig.sh ( namespace ) ( service account name )
CLUSTER_URL=https://10.10.69.232:6443
if [ $# -lt 3 ];then
echo "Usage $0 ( CLUSTER_URL ) ( namespace ) ( service account name )"
else
echo "CLUSTER_URL : $1"
echo "namespace : $2"
echo "service account name : $3"
fi
exit
TEMPDIR=$( mktemp -d )
trap "{ rm -rf $TEMPDIR ; exit 255; }" EXIT
SA_SECRET=$( kubectl get sa -n $1 $2 -o jsonpath='{.secrets[0].name}' )
# Pull the bearer token and cluster CA from the service account secret.
BEARER_TOKEN=$( kubectl get secrets -n $1 $SA_SECRET -o jsonpath='{.data.token}' | base64 -d )
kubectl get secrets -n $1 $SA_SECRET -o jsonpath='{.data.ca\.crt}' | base64 -d > $TEMPDIR/ca.crt
#CLUSTER_URL=$( kubectl config view -o jsonpath='{.clusters[0].cluster.server}' )
KUBECONFIG=kubeconfig
kubectl config --kubeconfig=$KUBECONFIG \
set-cluster \
$CLUSTER_URL \
--server=$CLUSTER_URL \
--certificate-authority=$TEMPDIR/ca.crt \
--embed-certs=true
kubectl config --kubeconfig=$KUBECONFIG \
set-credentials $2 --token=$BEARER_TOKEN
kubectl config --kubeconfig=$KUBECONFIG \
set-context registry \
--cluster=$CLUSTER_URL \
--user=$2
kubectl config --kubeconfig=$KUBECONFIG \
use-context registry
echo "kubeconfig written to file \"$KUBECONFIG\""
使用方法:
bash k8s-service-account-kubeconfig.sh https://x.x.x.x kube-system admin-user
运行上面命令后会生成一个kubeconfig文件,将这个文件放在本地然后通过下面命令
export KUBECONFIG=/etc/kubeconfig
kubectl config --kubeconfig=kubeconfig use-context registry #这条命令是切换到registry上下文
kubectl config get-contexts #这是获取当前上下文信息
参考链接
https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-em-clusterrole-em-
https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/