Секреты в ArgoCD с помощью Sops

ArgoCD — это инструмент, реализующий философию gitops для развертывания приложений на Kubernetes. Это декларативная, основанная на Git система развертывания, которая использует простой, читаемый человеком файл манифеста для определения желаемого состояния вашего приложения. В этой статье мы рассмотрим, как использовать ArgoCD с Sops для управления секретами в рабочем процессе gitops.

Мы используем sops с GCP KMS, первое, что нам нужно, это учетная запись сервиса с ролью roles/cloudkms.cryptoKeyDecrypter и создание секрета на Kubernetes:

kubectl create secret generic google-sa --from-file sa.json

Идея состоит в том, чтобы использовать Argo Config Management Plugin для расшифровки секрета и создать плоскость yaml со всеми объектами Kubernetes (развертывание, сервисы, …) и использовать Cumstom Tooling для установки Sops и других необходимых инструментов.

В процессе мы столкнулись с несколькими проблемами, и одна из них заключается в том, что необходимо использовать yq для правильного форматирования выходного yaml и избежания ошибок, таких как: error converting YAML to JSON: yaml: line 4: did not find expected ',' or ']'..

Это значения для установки argo-cd программой Helm. Конфигурация предполагает, что все секреты находятся в файле secrets.enc с кодировкой yaml.

server:
  config:
    configManagementPlugins: |
      - name: sops
        init:
          command: ["/bin/sh", "-c"]
          args: ["echo '---' > secrets.yaml && sops -d --input-type yaml --output-type yaml secrets.enc >> secrets.yaml"]
        generate:
          command: ["/bin/sh", "-c"]
          args: ["source /virtualenv-python/bin/activate; pip install yq; cat *.yaml | yq -y"]
repoServer:
  volumes:
    - name: custom-tools
      emptyDir: {}
    - name: virtualenv-python
      emptyDir: {}
    - name: google-sa
      secret:
        secretName: google-sa
        items:
          - key: sa.json
            path: sa.json
  volumeMounts:
    - mountPath: /usr/local/bin/sops
      name: custom-tools
      subPath: sops
    - mountPath: /usr/local/bin/jq
      name: custom-tools
      subPath: jq
    - mountPath: /etc/secrets/sa.json
      name: google-sa
      subPath: sa.json
    - mountPath: /virtualenv-python
      name: virtualenv-python
  env:
    - name: GOOGLE_APPLICATION_CREDENTIALS
      value: /etc/secrets/sa.json
  initContainers:
    - name: custom-tools
      image: alpine:3.8
      command: ["/bin/sh", "-c"]
      args:
        - wget https://github.com/mozilla/sops/releases/download/v3.7.3/sops-v3.7.3.linux.amd64;
          chmod a+x sops-v3.7.3.linux.amd64;
          mv sops-v3.7.3.linux.amd64 /custom-tools/sops;
          wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64;
          chmod a+x jq-linux64;
          mv jq-linux64 /custom-tools/jq;
      volumeMounts:
        - mountPath: /custom-tools
          name: custom-tools
    - name: virtualenv-python
      image: python:3.7
      command: ["/bin/sh", "-c"]
      args:
        - python3 -m venv /virtualenv-python
      volumeMounts:
        - mountPath: /virtualenv-python
          name: virtualenv-python
Войти в полноэкранный режим Выход из полноэкранного режима

helm upgrade sops argo/argo-cd --values values-sops.yaml

И пример приложения, чтобы попробовать.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: secrets
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/Callepuzzle/manifests
    targetRevision: main
    path: poc-argocd
    plugin:
      name: sops
  destination:
    name: ''
    namespace: ''
    server: 'https://kubernetes.default.svc'
Вход в полноэкранный режим Выход из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий