Перейти к основному содержимому

5.2.4.2. Ролевая модель

Этот раздел посвящён настройке ролевой модели (RBAC), необходимой для корректной работы механизма kubeadm join. Здесь описываются Roles/ClusterRoles, RoleBindings/ClusterRoleBindings и Bootstrap-токен, которые позволяют новым узлам безопасно подключаться к кластеру, запрашивать сертификаты и получать информацию о конфигурации API-сервера.

Настройка ролевой модели Kubeadm

● Обязателен к применению

Role bindings

Переменные окружения

export AUTH_EXTRA_GROUPS="system:bootstrappers:kubeadm:default-node-token"

Роли и связи

Этот блок необходим, чтобы kubeadm мог проверить, зарегистрирована ли нода с таким именем в кластере или нет.

kubectl \
--kubeconfig=/etc/kubernetes/super-admin.conf apply -f - <<EOF
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kubeadm:get-nodes
rules:
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeadm:get-nodes
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kubeadm:get-nodes
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: ${AUTH_EXTRA_GROUPS}
EOF

Этот блок необходим для того, чтобы анонимные клиенты (например, kubeadm на этапе discovery) могли получить ConfigMap с информацией о кластере (cluster-info) из пространства kube-public. Это позволяет загрузить начальные параметры подключения к API-серверу и проверить подпись bootstrap-токена до установления полноценной аутентификации.

kubectl \
--kubeconfig=/etc/kubernetes/super-admin.conf apply -f - <<EOF
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: kubeadm:bootstrap-signer-clusterinfo
namespace: kube-public
rules:
- apiGroups:
- ""
resourceNames:
- cluster-info
resources:
- configmaps
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: kubeadm:bootstrap-signer-clusterinfo
namespace: kube-public
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: kubeadm:bootstrap-signer-clusterinfo
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: system:anonymous
EOF

Данный блок необходим для назначения прав cluster-admin всем пользователям, входящим в группу kubeadm:cluster-admins. Это позволяет предоставить полный доступ к кластеру с возможностью централизованного управления правами — в отличие от группы system:masters, отозвать доступ из которой невозможно через механизмы RBAC. Такой подход упрощает настройку административных ролей и интеграцию с внешними системами авторизации.

kubectl \
--kubeconfig=/etc/kubernetes/super-admin.conf apply -f - <<EOF
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeadm:cluster-admins
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: kubeadm:cluster-admins
EOF

Данный блок требуется для того, чтобы участники группы ${AUTH_EXTRA_GROUPS} (например, system:bootstrappers) могли использовать bootstrap-токен для инициализации подключения kubelet к кластеру. Привязка к роли system:node-bootstrapper позволяет таким субъектам запрашивать TLS-сертификаты для узлов через CSR (CertificateSigningRequest), что является необходимым шагом в процессе kubeadm join.

kubectl \
--kubeconfig=/etc/kubernetes/super-admin.conf apply -f - <<EOF
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeadm:kubelet-bootstrap
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:node-bootstrapper
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: ${AUTH_EXTRA_GROUPS}
EOF

Данный блок требуется для автоматического одобрения запросов на выдачу клиентских сертификатов от узлов, присоединяющихся к кластеру через bootstrap-токен. Он назначает группе ${AUTH_EXTRA_GROUPS} (например, system:bootstrappers) роль system:certificates.k8s.io:certificatesigningrequests:nodeclient, что позволяет kube-controller-manager автоматически подписывать CSR от kubelet во время выполнения kubeadm join.

kubectl \
--kubeconfig=/etc/kubernetes/super-admin.conf apply -f - <<EOF
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeadm:node-autoapprove-bootstrap
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:certificates.k8s.io:certificatesigningrequests:nodeclient
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: ${AUTH_EXTRA_GROUPS}
EOF

Данный блок требуется для автоматического одобрения запросов на продление клиентских сертификатов kubelet. Он предоставляет группе system:nodes права, позволяющие повторно запрашивать и автоматически получать новые сертификаты через CertificateSigningRequest. Это необходимо для корректной работы механизма ротации сертификатов узлов без ручного вмешательства.

kubectl \
--kubeconfig=/etc/kubernetes/super-admin.conf apply -f - <<EOF
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeadm:node-autoapprove-certificate-rotation
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeclient
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:nodes
EOF
примечание
clusterrole.rbac.authorization.k8s.io/kubeadm:get-nodes created
role.rbac.authorization.k8s.io/kubeadm:bootstrap-signer-clusterinfo created
rolebinding.rbac.authorization.k8s.io/kubeadm:bootstrap-signer-clusterinfo created
clusterrolebinding.rbac.authorization.k8s.io/kubeadm:cluster-admins created
clusterrolebinding.rbac.authorization.k8s.io/kubeadm:get-nodes created
clusterrolebinding.rbac.authorization.k8s.io/kubeadm:kubelet-bootstrap created
clusterrolebinding.rbac.authorization.k8s.io/kubeadm:node-autoapprove-bootstrap created
clusterrolebinding.rbac.authorization.k8s.io/kubeadm:node-autoapprove-certificate-rotation created
Bootstrap tokens

Переменные окружения

export AUTH_EXTRA_GROUPS="system:bootstrappers:kubeadm:default-node-token"
export DESCRIPTION="kubeadm bootstrap token"
export EXPIRATION=$(date -d '24 hours' "+%Y-%m-%dT%H:%M:%SZ")
export TOKEN_ID="fjt9ex"
export TOKEN_SECRET="lwzqgdlvoxtqk4yw"
export USAGE_BOOTSTRAP_AUTHENTIFICATION="true"
export USAGE_BOOTSTRAP_SIGNING="true"

Создание токена доступа

Этот токен — bootstrap-токен, и он нужен для того, чтобы разрешить новой ноде безопасно присоединиться к Kubernetes-кластеру через kubeadm join, пока у неё ещё нет собственных сертификатов и доверенного kubeconfig-а.

Внимание!

Под каждую ноду в продуктивной среде рекомендуется создавать отдельный bootstrap-токен. Однако, для целей демонстрации (и в рамках данной документации) мы упростили процесс и используем один общий токен для всех узлов управляющего контура.

kubectl \
--kubeconfig=/etc/kubernetes/super-admin.conf \
apply -f - <<EOF
---
apiVersion: v1
kind: Secret
metadata:
name: bootstrap-token-${TOKEN_ID}
namespace: kube-system
data:
auth-extra-groups: $(echo -n "$AUTH_EXTRA_GROUPS" | base64)
description: $(echo -n "$DESCRIPTION" | base64)
expiration: $(echo -n "$EXPIRATION" | base64)
token-id: $(echo -n "$TOKEN_ID" | base64)
token-secret: $(echo -n "$TOKEN_SECRET" | base64)
usage-bootstrap-authentication: $(echo -n "$USAGE_BOOTSTRAP_AUTHENTIFICATION" | base64)
usage-bootstrap-signing: $(echo -n "$USAGE_BOOTSTRAP_SIGNING" | base64)
type: bootstrap.kubernetes.io/token
EOF
примечание
secret/bootstrap-token-fjt9ex configured
Cluster-Info

Переменные окружения

export KUBE_CA_CRT_BASE64=$(base64 -w 0 /etc/kubernetes/pki/ca.crt)
export CLUSTER_API_URL=https://api.my-first-cluster.example.com

Обновление Сluster-info

cluster-info — это публичный источник базовой информации о кластере, необходимый для безопасного bootstrap-присоединения новых узлов через kubeadm.

  • 🔐 Содержит публичный kubeconfig с CA и адресом API.
  • 📥 Используется kubeadm join для discovery.
  • 🌐 Доступен анонимно через kube-public.
  • ✅ Позволяет ноде проверить подлинность API-сервера до аутентификации.
kubectl \
--kubeconfig=/etc/kubernetes/super-admin.conf \
apply -f - <<EOF
---
apiVersion: v1
data:
kubeconfig: |
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: ${KUBE_CA_CRT_BASE64}
server: ${CLUSTER_API_URL}:6443
name: ""
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null
kind: ConfigMap
metadata:
name: cluster-info
namespace: kube-public

EOF
примечание
configmap/cluster-info created