Предоставление разрешения учетной записи службы Kubernetes для секретов?

У меня есть служебная учетная запись, которой я хотел бы предоставить разрешения на чтение / запись / обновление / удаление секретов в определенном пространстве имен. Мне не ясно, как именно учетные записи служб, роли, привязки и т. Д. Работают вместе, чтобы предоставить необходимые разрешения.

Какие kubectl вызовы или YAML мне нужно сделать, чтобы предоставить эти разрешения учетной записи службы?

Вот YAML для учетной записи службы, которую я имею до сих пор:

apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: 2018-10-09T17:45:20Z
  name: testaccount
  namespace: test
  resourceVersion: "369702913"
  selfLink: /api/v1/namespaces/test/serviceaccounts/testaccount
  uid: f742ed5c-c1b3-11e8-8a69-0ade4132ab56
secrets:
- name: testaccount-token-brjxq

2 ответа

Решение

Вам нужно создать Роль и Ролевую привязку.

Создать роль:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 namespace: test
 name: role-test-account
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

Создайте привязку роли:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: role-test-account-binding
 namespace: test
subjects:
- kind: ServiceAccount
  name: test-account
  namespace: test
roleRef:
 kind: Role
 name: role-test-account
 apiGroup: rbac.authorization.k8s.io

Вы можете прочитать больше об использовании авторизации RBAC

Итак, у вас есть SA testaccount, Давайте предположим, что ваше приложение (которое манипулирует секретами) имеет изображение контейнера myorg/myapp:01, Тогда вы запустите его следующим образом:

$ kubectl -n test run myapp \
    --image=myorg/myapp:01 \
    --serviceaccount=testaccount

Но как насчет разрешений? Ну, на самом деле не имеет значения, делаете ли вы это до или после запуска приложения, но в какой-то момент времени выполните:

$ kubectl create clusterrole secretmanipulator \
    --verb=get --verb=list --verb=watch \
    --verb=create --verb=update --verb=patch --verb=delete \
    --resource=secrets 

$ kubectl -n test create rolebinding allowsecretmanipulation \
    --clusterrole=secretmanipulator \
    --serviceaccount=test:testaccount 

Обратите внимание, что я создал кластерную роль выше и использовал привязку роли, чтобы присоединить ее к вашей SA. Зачем? Это более пригодно для повторного использования. Конечно, здесь также будет работать простая роль, но тогда вам нужно будет заново создать ее для каждого пространства имен.

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