CSR Approver#

CSR Approver - это сервис, необходимый для автоматизации одобрения запросов на подпись сертификатов (Certificate Signing Request, CSR) для узлов.

Данный инструмент работает по следующему принципу:

  • получает список CSR в статусе Pending;

  • одобряет каждый полученный CSR.

Сценарий использования#

Для создания и запуска Deployment с CSR Approver, выпуска CSR и одобрения запроса на его подпись выполните сценарий, представленный ниже.

Предварительные условия#

Выполните следующие шаги:

  1. Создайте приватный ключ на рабочем узле:

    openssl genrsa -out <node_name>.key 3072
    

    Где <node_name> – имя узла.

  2. Создайте CSR:

    openssl req -new -key <node_name>.key -out <node_name>.csr -subj "/CN=<node_name>"
    
  3. Создайте манифест 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.

Сценарий#

Шаги сценария:

  1. Создайте 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
    
  2. Примените манифест csr-approver-rbac.yaml:

    kubectl apply -f csr-approver-rbac.yaml
    
  3. Создайте 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
    
  4. Примените манифест dapp-csr-approver-deployment.yaml:

    kubectl apply -f dapp-csr-approver-deployment.yaml
    
  5. Убедитесь, что pod CSR Approver создан:

    watch kubectl get po
    

    Pod должен быть в статусе RUNNING.

  6. Проверьте логи pod CSR Approver:

    kubectl logs deploy/csr-approver
    

    В логах должно присутствовать сообщение Nothing to approve.

  7. Создайте CSR для узла:

    kubectl apply -f <node_name>-csr.yaml
    
  8. Дождитесь, пока CertificateSigningRequest перейдет в статус Approved. Для просмотра статуса используйте команду:

    watch kubectl get csr <node_name>-csr
    
  9. Проверьте логи pod CSR Approver:

    kubectl logs deploy/csr-approver
    

    В логах должно присутствовать сообщение, что CSR с именем <node_name>-csr принят:

    certificaressigningrequest.certificates.k8s.io/<node_name>-csr approved