В предыдущем посте ARGOCD: Обзор, конфигурация SSL и приложение Развертывание Мы сделали быстрый обзор, как работать с ArgocD в целом, и теперь давайте попробуем развернуть диаграмму HELM.
Самая интересная часть этого — как включить Секреты Helm Отказ У меня была боль с этим, но, наконец, она работает, как ожидалось.
Содержание
- Argcd: развертывание диаграммы Helm
- Argocd: Добавление частного репозитория GitHub
- Github ssh ключ
- Репозитории Argocd
- Добавление приложения Argocd
- Секреты Argocd и Helm Secrets
- InitContainer с общим объемом
- Создание Argocd Docker Image с плагином Helm-Secrets установлен
- SOP и AWS KMS — Аутентификация
- AWS IAM пользователь
- AWS учетные данные и конфигурация
- Добавление секретов.ЯМЛ
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»