В кластере Config не может получить модули при развертывании в пространстве имен не по умолчанию

Когда я развертываю свой сервис golang в любом пространстве имен, кроме default пространство имен, служба не может извлечь модули в любом пространстве имен. Тот же сервис, развернутый на default namespace работает отлично, используя golang client-go api.

Это проблема безопасности?

Благодарю.

3 ответа

Решение

Эта проблема является проблемой разрешения. Так как вы используете rest.InClusterConfig(config) создать клиента. Это означает, что в качестве учетных данных используется учетная запись службы pod. Поэтому проверьте, имеет ли эта учетная запись службы разрешение на получение модулей в любом пространстве имен.

если учетная запись службы в модуле не определена, то она будет использовать default Сервисный аккаунт.

Если в вашем кластере включен RBAC, проверьте привязку роли в этом пространстве имен, чтобы выяснить, есть ли у вашей учетной записи службы разрешение.

# to see the list of role bindings in 'default' namespace
kubectl get rolebindings --namespace default

Чтобы увидеть конкретную роль привязки

kubectl get rolebindings ROLE-BINDING-NAME --namespace default -o yaml

Также вы можете создать роль и связывание роли, чтобы дать разрешение. Чтобы узнать о роли RBAC и связывании ролей, смотрите здесь: https://kubernetes.io/docs/reference/access-authn-authz/rbac/

Ниже приведено то, что я использовал в кластере мини-кубов, чтобы предоставить учетной записи службы по умолчанию доступ к crud ops на общих ресурсах. Очевидное предостережение в том, что вам нужно быть осторожным с реальным кластером.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: crud-role
  namespace: default
rules:
- apiGroups: ["", "apps", "batch"]
  resources: [ "deployments", "jobs", pods", "replicasets", services" ]
  verbs: [ "create", "get", "list", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: crud-role-binding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: crud-role
subjects:
  - kind: ServiceAccount
    name: default
    namespace: default

Я получал аналогичную ошибку, но из модуля, использующего клиент golang в пространстве имен по умолчанию:

модули pod запрещены: пользователь «system:serviceaccount:default:default» не может перечислить «модули ресурсов» в группе API «» в области кластера.

Фрагмент кода Голанга:

      if configMode == "IN_CLUSTER" {
    // creates the in-cluster config
    config, err := rest.InClusterConfig()
    if err != nil {
        panic(err.Error())
    }
    return config, err
}

Я использовал решение, предоставленное @Gazi, но с ClusterRole, которое позволит вам получить доступ к ресурсам всего кластера. Он был изменен только для получения и списка:

      apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: query-role
  namespace: default
rules:
- apiGroups: ["", "apps", "batch"]
  resources: [ "deployments", "jobs", "pods", "replicasets", "services" ]
  verbs: [ "get", "list" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: query-role-binding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: query-role
subjects:
  - kind: ServiceAccount
    name: default
    namespace: default

Следующие ссылки полезны: https://kubernetes.io/docs/reference/access-authn-authz/rbac/ https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/

Другие вопросы по тегам