kubeconfig使用

什么是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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。