Рубрики
Uncategorized

ARGOCD: развертывание диаграммы HELM и работа с секретами Helm через AWS KMS

В предыдущем Post Argocd: обзор, конфигурация SSL и приложение Развертываем мы … Теги от AWS, Security, DevOps, Tutorial.

В предыдущем посте ARGOCD: Обзор, конфигурация SSL и приложение Развертывание Мы сделали быстрый обзор, как работать с ArgocD в целом, и теперь давайте попробуем развернуть диаграмму HELM.

Самая интересная часть этого — как включить Секреты Helm Отказ У меня была боль с этим, но, наконец, она работает, как ожидалось.

Содержание

Argcd: развертывание диаграммы Helm

Создайте диаграмму тестирования:

$ helm create test-helm-chart
Creating test-helm-chart

Проверьте это на месте:

$ helm upgrade --install --namespace dev-1-test-helm-chart-ns --create-namespace test-helm-chart-release test-helm-chart/ --debug --dry-run
…
{}
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace dev-1-test-helm-chart-ns -l "app.kubernetes.io/name=test-helm-chart,app.kubernetes.io/instance=test-helm-chart-release" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace dev-1-test-helm-chart-ns $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit [http://127.0.0.1:8080](http://127.0.0.1:8080) to use your application"
kubectl --namespace dev-1-test-helm-chart-ns port-forward $POD_NAME 8080:$CONTAINER_PORT

Хорошо — это работает, толкайте его на репозиторий GitHub.

Argocd: Добавление частного репозитория GitHub

Github ssh ключ

У нас есть организация GitHub. Позже создаст специальный пользователь GitHub для Argocd, но на данный момент мы можем добавить новый RSA-ключ на нашу учетную запись.

На самом деле, мы можем настроить доступ, используя логин: токен, но ключ кажется лучшим выбором.

Создать ключ:

$ ssh-keygen -f ~/.ssh/argocd-github-key
Generating public/private rsa key pair.
…

Добавьте его в Github — Настройки> SSH Keys :

Репозитории Argocd

Перейти к Настройки — репозитории :

Выберите Подключите репо, используя SSH :

Установите имя, URL, добавьте закрытый ключ:

Ключ будет храниться в секрете Куберанес:

$ kk -n dev-1-devops-argocd-ns get secrets
NAME TYPE DATA AGE
argocd-application-controller-token-mc457 kubernetes.io/service-account-token 3 45h
argocd-dex-server-token-74r75 kubernetes.io/service-account-token 3 45h
argocd-secret Opaque 5 45h
argocd-server-token-54mfx kubernetes.io/service-account-token 3 45h
default-token-6mmr5 kubernetes.io/service-account-token 3 45h
repo-332507798 Opaque 1 13m

REPO-332507798 — вот.

Нажмите Соединить Отказ

Добавление приложения Argocd

Создайте новое приложение:

Установите его имя, проект покидает по умолчанию , в Политика синхронизации Автоматическое создание пространства имен Может быть включен:

В Источник уйти Гит Установите URL репозитория в Ревизия Укажите ветку, в Путь — Путь к каталогу с нашей таблицей.

В этом текущем случае репозиторий — DevOps-Kubernetes , каталог графика — Тесты/Test-Helm-Chart/ И ARGOCD сканирует репо и предложит вам выбрать доступные каталоги внутри:

В Назначение Выберите локальную кластер Kubernetes, установите пространство имен в то, где будет развернута диаграмма:

В Назначение вместо Каталог Установить Хелм , хотя argo обнаружил, что это каталог Helm-Chart в репозитории и установил сам руль и уже отсканировал значения из Values.yaml. .

Может оставить все с значениями по умолчанию, а позже мы добавим наше Secrets.yaml здесь:

Готово:

Если вы нажимаете на приложение сейчас, вы увидите, что ARGOCD уже отсканировал шаблоны и создал манифест для отображения, какие ресурсы будут развернуты с этой карты HELM:

Нажмите на Синхронизация , и вы можете увидеть доступные варианты здесь, как Brune и Сухой пробег :

Нажмите на Синхронизировать — и развертывание начинается:

Закончено — все работает и работает:

Проверьте список приложений сейчас:

$ argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
guestbook [https://kubernetes.default.svc](https://kubernetes.default.svc) default default Synced Healthy   [https://github.com/argoproj/argocd-example-apps.git](https://github.com/argoproj/argocd-example-apps.git) guestbook HEAD
test-helm-chart [https://kubernetes.default.svc](https://kubernetes.default.svc) dev-1-devops-test-helm-chart-ns default Synced Healthy   git@github.com:***/devops-kubernetes.git tests/test-helm-chart DVPS-458-ArgoCD

POD в пространстве имен:

$ kubectl -n dev-1-devops-test-helm-chart-ns get pod
NAME READY STATUS RESTARTS AGE
test-helm-chart-67dccc9fb4–2m5rf 1/1 Running 0 2m27s

И теперь мы можем пойти в Секреты Helm конфигурация.

Секреты Argocd и Helm Secrets

Итак, все было так легко, пока мы не хотели использовать наши секреты, так как Helm в ArgocD не имеет необходимого плагина.

Доступные варианты предназначены для создания пользовательского образа докера с ARGOCD в соответствии с документацией Здесь >>> или установите плагины с initcontainer kubernetes через совместный том, как описано Здесь >>> Отказ

InitContainer с общим объемом

Первое решение, которое я пробовал, был INITCONTAINER с общим объемом, и в целом он работает нормально — плагин был установлен.

Развертывание для argocd-repo-сервер был следующий:

--------
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: repo-server
    app.kubernetes.io/name: argocd-repo-server
    app.kubernetes.io/part-of: argocd
  name: argocd-repo-server
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-repo-server
  template:
    metadata:
      labels:
        app.kubernetes.io/name: argocd-repo-server
    spec:
      automountServiceAccountToken: false
      initContainers:
      - name: argo-tools
        image: alpine/helm
        command: [sh, -c]
        args:
        - apk add git &&
          apk add curl &&
          apk add bash &&
          helm plugin install [https://github.com/futuresimple/helm-secrets](https://github.com/futuresimple/helm-secrets)
        volumeMounts:
        - mountPath: /root/.local/share/helm/plugins/
          name: argo-tools
      containers:
      - command:
        - uid_entrypoint.sh
        - argocd-repo-server
        - --redis
        - argocd-redis:6379
        image: argoproj/argocd:v1.7.9
        imagePullPolicy: Always
        name: argocd-repo-server
        ports:
        - containerPort: 8081
        - containerPort: 8084
        readinessProbe:
          initialDelaySeconds: 5
          periodSeconds: 10
          tcpSocket:
            port: 8081
        volumeMounts:
        - mountPath: /app/config/ssh
          name: ssh-known-hosts
        - mountPath: /app/config/tls
          name: tls-certs
        - mountPath: /app/config/gpg/source
          name: gpg-keys
        - mountPath: /app/config/gpg/keys
          name: gpg-keyring
        - mountPath: /home/argocd/.local/share/helm/plugins/
          name: argo-tools
      volumes:
      - configMap:
          name: argocd-ssh-known-hosts-cm
        name: ssh-known-hosts
      - configMap:
          name: argocd-tls-certs-cm
        name: tls-certs
      - configMap:
          name: argocd-gpg-keys-cm
        name: gpg-keys
      - emptyDir: {}
        name: gpg-keyring
      - emptyDir: {}
        name: argo-tools

Вот громкость спирадира, созданный с argo-tools Имя, то initContainer называется argo-tools Начал с этого объема, прикрепленного к /root/.local/share/helm/plugins/ каталог, то Гит , Curl и Bash установлены, и, наконец, Helm Plugin Установите https://github.com/futuresimple/helm-secrets выполняется.

Тот же том argo-tools установлен на argocd-repo-сервер стручок как /home/argocd/.local/share/helm/plugins/ каталог и Хелм в argocd-repo-сервер Контейнер может видеть плагин и умеет его использовать.

Но вот проблема: как мы можем выполнить Секреты Helm устанавливают команда? Argocd по умолчанию называет /usr/local/bin/helm двоичный И нет никакого способа указать дополнительные аргументы.

Итак, пришлось использовать второй вариант — построить пользовательское изображение с помощью Helm-Secrets, а SOP Установлен и напишите обертку-скрипт для выполнения бинарного элемента.

Создание Argocd Docker Image с плагином Helm-Secrets установлен

Решение было гушено здесь — Как обрабатывать секреты Kubernetes с argocd и SOP Отказ

Сначала — нужно написать наш обертк сценарий.

Сценарий должен быть вызван вместо /usr/local/bin/helm Двоичный с шаблон , установить , Обновление , Lint и Различать Аргументы и передайте команду со всеми аргументами для Секреты Helm Отказ

После выполнения Гельм секреты @arguments — Выход напечатан с удалением « Удаленные» Secrets.yaml.dec » String:

#! /bin/sh

# helm secrets only supports a few helm commands
if [$1 = "template"] || [$1 = "install"] || [$1 = "upgrade"] || [$1 = "lint"] || [$1 = "diff"]
then 
    # Helm secrets add some useless outputs to every commands including template, namely
    # 'remove: .dec' for every decoded secrets.
    # As argocd use helm template output to compute the resources to apply, these outputs
    # will cause a parsing error from argocd, so we need to remove them.
    # We cannot use exec here as we need to pipe the output so we call helm in a subprocess and
    # handle the return code ourselves.
    out=$(helm.bin secrets $@) 
    code=$? 
    if [$code -eq 0]; then
        # printf insted of echo here because we really don't want any backslash character processing
        printf '%s\n' "$out" | sed -E "/^removed '.+\.dec'$/d"      
        exit 0
    else
        exit $code
    fi
else
    # helm.bin is the original helm binary
    exec helm.bin $@
fi

Следующая вещь — создать собственное изображение докера с Helm-Secrets и SOP и замените /usr/local/bin/helm с нашей оберткой.

Найти последнюю версию SOPS — https://github.com/mozilla/sops/relases/ и последняя версия Helm-Secrets — https://github.com/zendesk/helm-secrets/relestestes](https://github.com/zendesk/helm-secrets/reluses) Отказ

Написать Dockerfile:

FROM argoproj/argocd:v1.7.9

ARG SOPS_VERSION="v3.6.1"
ARG HELM_SECRETS_VERSION="2.0.2" 

USER root  
COPY helm-wrapper.sh /usr/local/bin/
RUN apt-get update --allow-insecure-repositories --allow-unauthenticated && \
    apt-get install -y \
    curl \
    gpg && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
    curl -o /usr/local/bin/sops -L [https://github.com/mozilla/sops/releases/download/${SOPS\_VERSION}/sops-${SOPS\_VERSION}.linux](https://github.com/mozilla/sops/releases/download/%24%7BSOPS_VERSION%7D/sops-%24%7BSOPS_VERSION%7D.linux) && \
    chmod +x /usr/local/bin/sops && \
    cd /usr/local/bin && \
    mv helm helm.bin && \
    mv helm2 helm2.bin && \
    mv helm-wrapper.sh helm && \
    ln helm helm2 && \
    chmod +x helm helm2

# helm secrets plugin should be installed as user argocd or it won't be found
USER argocd
RUN /usr/local/bin/helm.bin plugin install [https://github.com/zendesk/helm-secrets](https://github.com/zendesk/helm-secrets) --version ${HELM_SECRETS_VERSION}
ENV HELM_PLUGINS="/home/argocd/.local/share/helm/plugins/"

Создайте изображение — репозиторий ниже является публичным, поэтому вы можете использовать изображение отсюда.

Обведите изображение с Argocd, который использовался для построения его плюс вашего собственного номера сборки, здесь будет 1:

$ docker build -t setevoy/argocd-helm-secrets:v1.7.9–1 .
$ docker push setevoy/argocd-helm-secrets:v1.7.9–1

Теперь нужно обновить install.yaml который использовался для развертывания аргоцда в предыдущий пост Отказ

SOP и AWS KMS — Аутентификация

В нашем случае мы используем ключ от службы управления ключом AWS, поэтому SOP в контейнере от Setevoy/Argocd-Helm-Secrets: v1.7.9-1 Изображение должно иметь доступ к учетной записи AWS и этот ключ.

SOP требует ~/.aws/учетные данные и ~/.aws/config Файлы, которые мы рассмотрим на стручок из секретов Kubernetes.

На самом деле, это можно сделать с помощью ServieSeacount И роль IAM — но на данный момент давайте сделаем с файлами.

AWS IAM пользователь

Создайте специальный пользователь AWS для доступа к ключу — перейдите к AWS IAM, установите его Программный доступ :

Затем создайте политику Readonly IAM с доступом только к этой клавише, который будет использоваться SOOS:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "kms:ListKeys",
                "kms:ListAliases",
                "kms:DescribeKey",
                "kms:ListKeyPolicies",
                "kms:GetKeyPolicy",
                "kms:GetKeyRotationStatus",
                "iam:ListUsers",
                "iam:ListRoles"
            ],
            "Resource": "arn:aws:kms:us-east-2:534 ***385:key/f73daf0d-*** -440ca3b6547b",
            "Effect": "Allow"
        }
    ]
}

Сохраните его и прикрепите пользователю:

Сохраните пользователя, перейдите к AWS KMS, добавьте ключ пользователя:

Настройте локальный профиль AWS:

$ aws configure --profile argocd-kms
AWS Access Key ID [None]: AKI***Q4F
AWS Secret Access Key [None]: S7c***6ya
Default region name [None]: us-east-2
Default output format [None]:

Проверьте доступ:

$ aws --profile argocd-kms kms describe-key --key-id f73daf0d-***-440ca3b6547b
{
"KeyMetadata": {
"AWSAccountId": "534***385",
"KeyId": "f73daf0d-***-440ca3b6547b",
"Arn": "arn:aws:kms:us-east-2:534 ***385:key/f73daf0d-*** -440ca3b6547b",
…

Этот профиль будет использоваться для шифрования наших секретов, и этот профиль должен быть добавлен в argocd-repo-сервер стручок

AWS учетные данные и конфигурация

Создать новый секрет Кубернетиков с ~/.aws/учетные данные и ~/.aws/config Содержание, тогда они будут сопоставлены на argocd-repo-сервер POD:

--------     
apiVersion: v1
kind: Secret
metadata:
  name: argocd-aws-credentials
  namespace: dev-1-devops-argocd-ns
type: Opaque
stringData: 
  credentials: |
    [argocd-kms]
    aws_access_key_id = AKI***Q4F
    aws_secret_access_key = S7c***6ya
  config: | 
    [profile argocd-kms]
    region = us-east-2

Добавьте файл в .gitignore. :

$ cat .gitignore
argocd-aws-credentials.yaml

Позже, когда сделает автоматизацию для выката Argocd, этот файл может быть создан из секретов Jenkins.

Создать секрет:

$ kubectl apply -f argocd-aws-credentials.yaml
secret/argocd-aws-credentials created

Обновите развертывание argocd-repo-сервер — Измените изображение для использования, добавьте новый том из нашего секрета и установите его как /home/argocd/.aws на стручок с argo:

--------
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/component: repo-server
    app.kubernetes.io/name: argocd-repo-server
    app.kubernetes.io/part-of: argocd
  name: argocd-repo-server
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-repo-server
  template:
    metadata:
      labels:
        app.kubernetes.io/name: argocd-repo-server
    spec:
      automountServiceAccountToken: false
      containers:
      - command:
        - uid_entrypoint.sh
        - argocd-repo-server
        - --redis
        - argocd-redis:6379
# image: argoproj/argocd:v1.7.9
        image: setevoy/argocd-helm-secrets:v1.7.9-1
        imagePullPolicy: Always
        name: argocd-repo-server
        ports:
        - containerPort: 8081
        - containerPort: 8084
        readinessProbe:
          initialDelaySeconds: 5
          periodSeconds: 10
          tcpSocket:
            port: 8081
        volumeMounts:
        - mountPath: /app/config/ssh
          name: ssh-known-hosts
        - mountPath: /app/config/tls
          name: tls-certs
        - mountPath: /app/config/gpg/source
          name: gpg-keys
        - mountPath: /app/config/gpg/keys
          name: gpg-keyring
        - mountPath: /home/argocd/.aws
          name: argocd-aws-credentials
      volumes:
      - configMap:
          name: argocd-ssh-known-hosts-cm
        name: ssh-known-hosts
      - configMap:
          name: argocd-tls-certs-cm
        name: tls-certs
      - configMap:
          name: argocd-gpg-keys-cm
        name: gpg-keys
      - emptyDir: {}
        name: gpg-keyring
      - name: argocd-aws-credentials
        secret:
          secretName: argocd-aws-credentials

Обновите экземпляр ARGOCD:

$ kubectl -n dev-1-devops-argocd-ns apply -f install.yaml

Проверьте стручки:

$ kubectl -n dev-1-devops-argocd-ns get pod
NAME READY STATUS RESTARTS AGE
…
argocd-repo-server-64f4bbf4b7-jcs6x 1/1 Terminating 0 19h
argocd-repo-server-7c64775679–9jjq2 1/1 Running 0 12s

Проверять файлы:

$ kubectl -n dev-1-devops-argocd-ns exec -ti argocd-repo-server-7c64775679–9jjq2 -- cat /home/argocd/.aws/credentials
[argocd-kms]
aws_access_key_id = AKI***Q4F
aws_secret_access_key = S7c***6ya

И давайте попробуем использовать Helm-Secrets.

Добавление секретов.ЯМЛ

В репозитории с диаграммой создайте новый Secrets.yaml файл:

somePassword: secretValue

Создайте .sops.yamlfile с KMS Key и AWS Profile:

--------
creation_rules:
  - kms: 'arn:aws:kms:us-east-2:534 ****385:key/f73daf0d-*** -440ca3b6547b'
    aws_profile: argocd-kms

Зашифруйте файл:

$ helm secrets enc secrets.yaml
Encrypting secrets.yaml
Encrypted secrets.yaml

На диаграмму тестирования добавьте использование нашего секрета, например — давайте создадим переменную среды под названием Test_secret_password — Обновите Шаблоны/развертывание.yaml. :

...
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          env:
          - name: TEST_SECRET_PASSWORD
            value: {{ .Values.somePassword }}
...

Нажмите изменения в репозиторий:

$ git add secrets.yaml templates/deployment.yaml
$ git commit -m "test secret added" && git push

Перейти к настройкам приложения — Сведения о приложении> Параметры нажмите Редактировать и укажите Values.yaml. и Secrets.yaml Как Значения файлов :

Теперь Argocd видит, что приложение не синхронизируется с данными в репозитории:

Синхронизировать это:

Проверьте новый POD:

И Данные прямо в POD:

$ kubectl -n dev-1-devops-test-helm-chart-ns exec -ti test-helm-chart-5c777f9c9d-wkx6s -- printenv | grep SECRET
TEST_SECRET_PASSWORD=secretValue

Все сделано — секрет здесь.

Первоначально опубликовано в RTFM: Linux, DevOps и системное администрирование Отказ

Оригинал: «https://dev.to/setevoy/argocd-a-helm-chart-deployment-and-working-with-helm-secrets-via-aws-kms-34il»