中心思想,用serviceaccoun权限代理useraccount权限来管理多集群。

## 在各集群生成各自kubeconfig文件

1、建立管理账号,绑定集群管理角色

```
# cat SC-rbac-oke-admin.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: oke-admin
  namespace: kube-system
---
apiVersion: v1
kind: Secret
metadata:
  name: secret-sa-oke-admin
  namespace: kube-system
  annotations:
    kubernetes.io/service-account.name: "oke-admin"   # 这里填写serviceAccountName
type: kubernetes.io/service-account-token
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: oke-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: oke-admin
  namespace: kube-system
```

2、获取oke-admin的token信息:

export TOKEN=$(kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep oke-admin | awk '{print $1}') | grep token: | awk '{print $2}')

3、获取OKE集群的server信息:

export SERVER=$(kubectl config view --flatten --minify | grep server | awk '{print $2}')

4、获取OKE集群的certificate-authority-data信息

export CERTIFICATE_AUTHORITY_DATA=$(kubectl config view --flatten --minify | grep certificate-authority-data | awk '{print $2}')

5、创建kubeconfig文件

cat > kubeconfig <<EOF
apiVersion: v1
kind: Config
users:
- name: oke-admin
  user:
    token: $TOKEN
clusters:
- cluster:
    certificate-authority-data: $CERTIFICATE_AUTHORITY_DATA
    server: $SERVER
  name: oke-cluster
contexts:
- context:
    cluster: oke-cluster
    user: oke-admin
  name: oke-admin@oke-cluster
current-context: oke-admin@oke-cluster
EOF

6、为避免名称一致,改成能识别的名称

mv kubeconfig kubeconfig-xxxx

## 修改各文件{context,cluster,user}name ,确保被识别元素唯一性

1、通过命令修改context名称

# kubectl config rename-context oke-admin@oke-cluster xinjiapo --kubeconfig=./kubeconfig-Singapore
# kubectl config rename-context oke-admin@oke-cluster fenghuangcheng --kubeconfig=./kubeconfig-fenghuangcheng
# kubectl config rename-context oke-admin@oke-cluster bali --kubeconfig=./kubeconfig-bali
# kubectl config rename-context oke-admin@oke-cluster xini --kubeconfig=./kubeconfig-xini

2、手动编辑修改修改各个kubecofig文件中的cluster/name 和users/name,使不一致。(修改字段举例如下:)

```
巴黎区别于悉尼:
- cluster:
  name:oke-cluster-bali
- context:
    cluster: oke-cluster-bali
    user: oke-admin-bali
users:
- name: oke-admin-bali
-----------------------------------------------------------
- cluster:
  name:oke-cluster-xini
- context:
    cluster: oke-cluster-xini
    user: oke-admin-xini
users:
- name: oke-admin-xini
```

 ## 合并各个kubeconfig

设置KUBECONFIG环境变量(把要合并的kubeconfig文件都列出)

# export KUBECONFIG=./kubeconfig-bali:./kubeconfig-fenghuangcheng:./kubeconfig-xini:./kubeconfig-xinjiapo

合并为一个

# kubectl config view --flatten > all-in-one-kubeconfig.yaml

## 用新生成的文件测试,连接各个k8s集群

# kubectl --context=xinjiapo --kubeconfig=all-in-one-kubeconfig.yaml get pod -o wide -A
# kubectl --context=bali --kubeconfig=all-in-one-kubeconfig.yaml get pod -o wide -A
# kubectl --context=fenghuangcheng --kubeconfig=all-in-one-kubeconfig.yaml get pod -o wide -A
# kubectl --context=xini --kubeconfig=all-in-one-kubeconfig.yaml get pod -o wide -A

## 替换默认的config文件

把生成的all-in-one-kubeconfig.yaml 替换原来的$HOME/.kube/config , 即可方便地在一台机器上控制所有k8s集群,控制权限受制于第一步创建ServiceAccount时给予的rbac,可以灵活控制,举例

# kubectl --context=bali get pod -o wide -A

### 其他快捷工具还有:

kubecm(https://cloud.tencent.com/developer/article/1649637)

kubectx,它可以比 kubectl 更快地在上下文(集群)之间切换,但还是依赖于 config 的合并。

https://github.com/ahmetb/kubectx

也可以使用国人开源的 ki命令行工具,不用合并 config,直接使用ki -s即可快速完成切换。

GitHub - ywgx/ki: Manage multiple kubeconfigs easily

== 最后给出我整理的命令参考 ==

1、备份原config文件
cp $HOME/.kube/config $HOME/.kube/config-backup

2、设置KUBECONFIG环境变量(把要合并的kubeconfig文件都列出)
export KUBECONFIG=$HOME/.kube/config:/path/cluster1:/path/cluster2

注意:
不同kubeconfig文件,context中的cluster和user的名称是不能相同的,即,cluster/name 和users/name 在不同的kubeconfig文件中不能一样,否则,合并的时候只留一个。
- cluster:中name: ==  - context中cluster:    各个kubeconfig文件中的不能一样
users:中 - name:  ==  - context中user:
  
3、将所有 kubeconfig 文件合并为一个
kubectl config view --flatten > all-in-one-kubeconfig.yaml

4、验证后,改名为默认名称
mv all-in-one-kubeconfig.yaml $HOME/.kube/config

5、使用,按照kubeconfig中context名称来切换环境操作
kubectl config use-contexts $context名称

6、修改context名称,(有时原来定义的context name不好记忆,可以修改)
  注意:修改后kubeconfig中内容并不会改变,可以备份后手动修改。
kubectl config rename-context old-context-name new-context-name --kubeconfig=/path/to/kubeconfig

7、执行kubectl指定context。
kubectl --context=spartan-eks get pod
kubectl --context=DDC-devops get pod

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐