В кластере 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/