CSR Approver#
CSR Approver - это сервис, необходимый для автоматизации одобрения запросов на подпись сертификатов (Certificate Signing Request, CSR) для узлов.
Данный инструмент работает по следующему принципу:
получает список CSR в статусе
Pending;одобряет каждый полученный CSR.
Сценарий использования#
Для создания и запуска Deployment с CSR Approver, выпуска CSR и одобрения запроса на его подпись выполните сценарий, представленный ниже.
Предварительные условия#
Выполните следующие шаги:
Создайте приватный ключ на рабочем узле:
openssl genrsa -out <node_name>.key 3072Где
<node_name>– имя узла.Создайте CSR:
openssl req -new -key <node_name>.key -out <node_name>.csr -subj "/CN=<node_name>"Создайте манифест Kubernetes
CertificateSigningRequest:cat << EOF > <node_name>-csr.yaml apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: <node_name>-csr spec: request: | $(cat <node_name>.csr | base64 | tr -d "\n") signerName: example.com/<node_name>-csr-signer usages: - client auth EOFГде
example.com/<node_name>-csr-signer–resourceNamesизClusterRoleдля CSR Approver в шаге 1 сценария ниже.Важно
Используйте подстроку
nodeпри задании значения<node_name>-csrдля параметраnameв блокеmetadata. CSR Approver в обязательном порядке проверяет наличие данной подстроки.Пример корректного названия –
workernode1-csr.Пример некорректного названия –
worker1-csr.
Сценарий#
Шаги сценария:
Создайте RBAC для CSR Approver:
cat << EOF > csr-approver-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: csr-approver namespace: default --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: csr-approver-role rules: - apiGroups: - certificates.k8s.io resources: - certificatesigningrequests verbs: - get - list - watch - apiGroups: - certificates.k8s.io resources: - certificatesigningrequests/approval verbs: - update - apiGroups: - certificates.k8s.io resources: - signers resourceNames: - example.com/<node_name>-csr-signer verbs: - approve --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: csr-approver-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: csr-approver-role subjects: - kind: ServiceAccount name: csr-approver namespace: default EOFПримените манифест
csr-approver-rbac.yaml:kubectl apply -f csr-approver-rbac.yamlСоздайте Deployment с CSR Approver:
cat << EOF > dapp-csr-approver-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: csr-approver namespace: default spec: replicas: 1 selector: matchLabels: app: csr-approver template: metadata: labels: app: csr-approver spec: serviceAccountName: csr-approver containers: - name: csr-approver image: $DAPP_REGISTRY/k8sf/3.2.2-fstec/dapp-csr-approver/dapp-csr-approver:v3.2.2 env: - name: CLUSTER_API value: $CONTROLPLANE_IP command: ["/bin/sh", "-c"] args: - | while true; do /app/csr-approver-k8s.sh sleep 10 done restartPolicy: Always EOFПримените манифест
dapp-csr-approver-deployment.yaml:kubectl apply -f dapp-csr-approver-deployment.yamlУбедитесь, что pod CSR Approver создан:
watch kubectl get poPod должен быть в статусе
RUNNING.Проверьте логи pod CSR Approver:
kubectl logs deploy/csr-approverВ логах должно присутствовать сообщение
Nothing to approve.Создайте CSR для узла:
kubectl apply -f <node_name>-csr.yamlДождитесь, пока
CertificateSigningRequestперейдет в статусApproved. Для просмотра статуса используйте команду:watch kubectl get csr <node_name>-csrПроверьте логи pod CSR Approver:
kubectl logs deploy/csr-approverВ логах должно присутствовать сообщение, что CSR с именем
<node_name>-csrпринят:certificaressigningrequest.certificates.k8s.io/<node_name>-csr approved