В общем, если вдруг на кластер\namespace’s прилетела политика
automountServiceAccountToken: false
Этот параметр может быть установлен как в Pod’e, так и в Service Account’е
Это означает, что в поды с этой настройкой не будет прокидываться SA-токен. По умолчанию каждому поду цепляется SA (если не указан конкретный, прокидывается Default для NameSpace, где поднимается под) и его данные (собственно сам токен и ca.crt кластера) прокидываются в директорию /var/run/secrets/kubernetes.io/serviceaccount/
Эти credentials используются приложениями в pod’е для доступа к Kubernetes API.
Настройка параметра automountServiceAccountToken - хорошая практика в настройки безопасности кластера. Ибо зачем обычным приложениям доступ к Kubernetes API в их Pod'ах?
Так вот. Если эта политика включена по умолчанию, а вам нужен доступ к Kubernetes API нужно сделать следующее:
<aside> 💡 Первым делом - обратитесь к безам и запросите у них сделать исключение для вашего NameSpace или POD’а. Это самый быстрый и правильный способ, ибо то, что я опишу ниже - по факту продублирует логику, если выставить значение true для automountServiceAccountToken с небольшим улучшением
</aside>
Необходимо настроить RBAC с нужными нам правами. Например:
apiVersion: v1
kind: ServiceAccount
metadata:
name: name-sa
namespace: namespace
automountServiceAccountToken: false
---
apiVersion: v1
kind: Secret
metadata:
name: name-sa-token
namespace: namespace
annotations:
kubernetes.io/service-account.name: name-sa
type: kubernetes.io/service-account-token
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: name-cr
namespace: namespace
rules:
- apiGroups:
- ""
resources:
- secrets
- pods
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: name-crb
namespace: namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: name-cr
subjects:
- kind: ServiceAccount
name: name-sa
namespace: namespace
Обратите внимание, что мы явно создаем Secret для Service Account’a, в котором будут хранится ca.crt и token. (Дефолтный secret для SA тоже создатся, но его неудобно использовать, например в helm, т.к. мы не можем заранее знать его имя
Правильно маунтим созданные сущности в pod:
spec:
...
template:
...
spec:
automountServiceAccountToken: false
containers:
- ...
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount/
name: token-ca
...
volumes:
- name: token-ca
projected:
defaultMode: 420
sources:
- serviceAccountToken:
audience: <https://kubernetes.default.svc.cluster.local>
expirationSeconds: 86400
path: token
- secret:
items:
- key: ca.crt
path: ca.crt
name: name-sa-token
Стоит обратить внимание на serviceAccountToken. Мы НЕ МАУНТИМ токен из нашего сикрета, а маунтим токен с ротацией. При такой настройке внутри pod’а токен будет ротироваться в соответствии с настройкой expirationSeconds.
В итоге мы получим токен (с ротауией) и ca.crt в той же директории, куда бы ее примонтировал бы Kubernetes, если бы мы использовали true в automountServiceAccountToken