美文网首页
kubeconfig使用

kubeconfig使用

作者: 大鹏之动 | 来源:发表于2019-05-09 11:55 被阅读0次

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

    相关文章

      网友评论

          本文标题:kubeconfig使用

          本文链接:https://www.haomeiwen.com/subject/yhgioqtx.html