之前说的,使用k8s client 在pod内部操作外部k8s集群,curd configmap,但是在这里遇到一个问题,就是k8s client需要提供/root/.kube/config文件作为参数,如何提供这个配置文件呢?
// loading the in-cluster config, including:
// 1. service-account CA
// 2. service-account bearer-token
// 3. service-account namespace
// 4. master endpoints(ip, port) from pre-set environment variables
ApiClient client = ClientBuilder.cluster().build();
Configuration.setDefaultApiClient(client);
CoreV1Api api = new CoreV1Api();
V1PodList list =
api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null);
使用上边的代码,删除configmap的时候,报错:
exception :forbidden
通过万能的Google,了解到是pod的权限太低。也就是这个pod不允许删除和创建configmap,(应该可以查看)
既然权限不够,那就使用rbac给它一点儿权限咯,稍微改一下,使用给ServiceAccount加权限,大概步骤:
apiVersion: v1
kind: ServiceAccount
metadata:
name: curd-serviceaccount
automountServiceAccountToken: true #一定要注意这里,如果这个值是false,是不会将serivceAccount的token挂在到pod里去的,其实不用手动声明为true,因为默认值是true。手动改为false导致k8s config初始化失败,因为token没挂进去,并且go代码报错一点儿也不友好,排查起来很费力,花了好长时间才定位是这里的问题。可恶:(
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: curd-clusterRole
labels:
rbac.example.com/aggregate-to-monitoring: "true"
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
# 这些规则将被添加到 "monitoring" 角色中。
rules:
- apiGroups: [""]
resources: ["services", "endpoints", "pods", "configmaps"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-secrets-global
subjects:
- kind: ServiceAccount
name: curd-serviceaccount# 名称区分大小写
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: curd-clusterRole
具体说明参见,上面的操作做完了后,就可以使用这里ServiceAccount创建pod资源了,
spec:
serviceAccount: curd-serviceaccount
containers:
- image: prom/prometheus
这样创建出来的pod就有了对外部k8s集群各种资源的操作权限了。
遇到问题,可以多看看官方文档,一般来说,你遇到的问题,官方早就已经想到了。所以一定要多看官方文档,或者多看书。