从 k8s 程序中读取 configmap

Read configmap from a k8s program

我有一个需要访问配置映射的 go 程序,当使用以下 clusterRole 时我们得到错误禁止

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: s-access
 labels:
  app.kubernetes.io/instance: te-mger
rules:
 - verbs:
   - get
   - watch
   - list
   - update
  apiGroups:
   - dpt.com
  resources:
   - pods

现在,当我将其更改为以下内容时,它会起作用(将 apiGroups '')和 configmaps 添加到 resources 由于这是一种解决方法,我们应该如何处理长解决方案

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: s-access
 labels:
  app.kubernetes.io/instance: te-mger
rules:
 - verbs:
   - get
   - watch
   - list
   - update
  apiGroups:
   - dpt.com
   - ''
  resources:
   - pods
   - configmaps

我阅读了以下内容,但没有帮助https://kubernetes.io/docs/reference/access-authn-authz/rbac/

我想避免使用apiGroups:''

每个 Kubernetes 资源都是某个 API 组的一部分。 API 组定义了这些资源可用的路径。例如,您可以在 Kubernetes API 参考中找到它们(对于每个资源,您都有组、版本和种类)。

如您所见here,例如对于 ConfigMap,组是 core。 ClusterRole(或Role)在引用资源时需要使用资源所属的组。这是正确指定您正在谈论的资源所必需的,因为资源名称本身不一定是唯一的,但只能与组结合使用。

通常,组就写在那里,但是对于core组,您通常只写在那里""(如here所述)。

所以在你的例子中,这个:

rules:
  - verbs:
      - get
      - watch
      - list
      - update
    apiGroups:
      - dpt.com
    resources:
      - configmaps

将涵盖您自己的 API 组 dsp.com 中名为 podconfigmap 的一些资源,但不包括 core 组中的真正 Kubernetes 资源。要覆盖它们,您需要像这样指定正确的组:

rules:
  - verbs:
      - get
      - watch
      - list
      - update
    apiGroups:
      - ""
    resources:
      - configmaps

如果您只想授予对特定 ConfigMap 的访问权限,您可以使用 resourceNames 字段。

rules:
  - verbs:
      - get
      - watch
      - list
      - update
    apiGroups:
      - ""
    resources:
      - configmaps
    resourceNames:
      - my-config-map
      - my-config-map

但是你需要一个一个地命名配置映射。它不支持任何通配符、正则表达式或任何东西。