Skip to main content

Argo CD: Let's Get Stuff Deployed

Revising

Зависимости

img

1. Cloud ☁️2. Docker 🐳3. Orchestration ⛵4. CI/CD 🚀5. K8s GitOps operators 🐙
AWSDocker EngineKubernetesJenkinsArgo CD
AzureCRI-ODocker SwarmGitLab CI/CDFlux CD
othersothersothersothersothers

Cloud ☁️

AWS public cloud - это платформа, где можно получить доступ к вычислительным ресурсам по требованию.

Docker 🐳

🐳 собирает наше приложение, написанное на любом ЯП с использованием любых фреймворков, в легковесную коробку 📦 , которую можно легко доставить куда угодно и так же легко запустить наше приложение, находящееся в этой коробке 🏃‍♂️

Docker Inc. сделали эту технологию доступной для широкий масс и захватили mindset инженеров.

Но современные приложения состоят из нескольких микросервисов: front-end, back-end, database и т.д., и docker не отвечает на вопросы как этим удобно пользоваться и масштабироваться.

info

docker-compose - частично решает вопрос удобства использования докер, но лишь в локальных средах.

Orchestration ⛵

info

Cloud Native Computing Foundation (CNCF) serves as the vendor-neutral home for many of the fastest-growing open source projects, including Kubernetes, Prometheus, and Envoy.

Почему K8s?

Kubernetes (k8s) - фреймворк для работы с распределенными системами:
  • проект CNCF

  • удачная архитектура - каждый компонент изолирован от другого

  • комьюнити (85к звезд)

  • дефакто - стандарт отрасли

  • декларативный

  • автоматически осуществляет балансировку нагрузки

  • self-healing - может перезапустить отказавшие контейнеры, выполнять различные проверки и т.д.

flowchart TB api((kube-api)) subgraph workers n1[node1] n2[node2] nx[nodeX] end client --> api master --> api s[(Storage)] --> api workers --> api
вопрос

Какой из компонентов Kubernetes управляет всеми другими?

CI/CD 🚀 💿

img

CI - непрерывная интеграция, частые слияния с основной веткой разработки.
CD - непрерывная доставка - новая версия приложения (артефакт) создается при каждом слияние, но развертывание все еще происходит вручную.
CD - непрерывное развертывание - говорит о том, что после сборки артефакта он автоматически развертывается на одно из наших окружений.
caution

CI/CD/CD - сильно зависит от вашего GitXXX Flow.

flowchart TB subgraph deploy d2[canary] end subgraph delivery d1[docker-registry] end subgraph test t1[pytest] t2[coverage] t3[smoke] end subgraph build b[docker] end subgraph lint l1[flake8] l2[black] end

GitOps, Argo CD

вопрос
  • Что такое Infrastructure as a Code (IaC)?
  • В чем разница императивной и декларативной парадигм?

Argo CD workflow

flowchart TD subgraph application [app repo] dev[developer] dev -- commit changes --> app[app repo] app -- CI pipeline --> ci[build and push image to registry] end subgraph infrastructure [infra repo] re[release engineer] re -- commit changes --> infra[infra repo] end subgraph env [k8s] argo -- continuously pull --> infra argo -- sync desired state --> k8s[k8s cluster] end

GitOps

GitOps - это эволюция IaC, где Git является единственным источником истины состояния нашей инфрастуктуры, реализует непрерывное развертывание.
  • прозрачность: аудит / передача экспертизы / документация / Git Workflow (перенос опыта совместной разработки для управления инфрастуктурой)
  • исправление ошибок - git revert
  • легкость настройки доступов

GitOps vs IaC(CI_OPs)

...GitOpsIaC
Paradigm 🗿Pull (Declarative)Push (Imperative)
Code Storage 🏦Gitmay not be in Git
Code Changes Process 🙋‍♀️GitXXX flowGitXXX flow or manual
Infrastructure Updates 🔧AutomatedCI or manual
Access 💂‍♂️Operator to gitCI or operator to K8s api
Infra Changes 💥Githelm rollback,upgrade,delete and etc.

Argo CD

note

controller = operator = agent

K8s, это лишь один из примеров использования GitOps и cloud native приложений

GitOps оператор для K8s.
  • проект сертифицирован CNCF
  • использует Git как источник истины, может автоматически синхронизировать состояние кластера с Git
  • декларативный (plain yaml, plain json, kustomize, helm, jsonnet)
  • controller + CRD
  • SSO + RBAC

Demo

note

Код из demo: https://gitlab.com/publi8/

Application

FROM python:3.10.0-alpine3.14

COPY ./requirements.txt ./requirements.txt

RUN pip install --no-cache-dir -r requirements.txt

RUN addgroup --gid 10001 app \
&& adduser \
--uid 10001 \
--home /home/app \
--shell /bin/ash \
--ingroup app \
--disabled-password \
app

WORKDIR /home/app

USER app

COPY ./ /home/app

ENTRYPOINT ["/usr/local/bin/uvicorn"]
CMD ["main:app", "--reload", "--host=0.0.0.0", "--port=8000"]

Kubernetes Environment

---

kind: Application
apiVersion: argoproj.io/v1alpha1
metadata:
name: demo-app
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: default
source:
repoURL: https://gitlab.com/publi8/demo-environment.git
targetRevision: main
path: ./demo-app
directory:
recurse: true
destination:
namespace: default
server: https://kubernetes.default.svc
syncPolicy:
automated:
selfHeal: true
revisionHistoryLimit: 3

Environment Init

Argo UI

Создаем неймспейс для argo, добавляем чарт и устанавливаем релиз.

kubectl create ns argocd
helm repo add argo https://argoproj.github.io/argo-helm
helm upgrade --install argocd argo/argo-cd --namespace argocd

Ждем пока поднимутся поды argocd:

watch kubectl get pod -n argocd

В отдельном терминале делаем pf argo ui:

kubectl port-forward service/argocd-server -n argocd 8080:443

Смотрим пароль от argo ui:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

Argo UI - http://127.0.0.1:8080

App UI

Создаем Argo Application

kubectl create -f demo-app.yml
watch kubectl get pod -n default

В отдельном терминале делаем pf app ui:

kubectl port-forward service/demo-app -n default 8000:8000

Делаем запрос к сервису:

$ http http://127.0.0.1:8000/version
HTTP/1.1 200 OK
content-length: 20
content-type: application/json
date: Tue, 08 Feb 2022 05:03:42 GMT
server: uvicorn

{
"version": "demo-1"
}

Удалим все деплойменты и убедимся, что арго вернет все как было:

kubectl -n default delete deploy --all

Example Update

  • обновляем приложение
  • меняем тег образа в deployment-е и коммитим изменения Приложение обновилось:
$ http http://127.0.0.1:8000/version
HTTP/1.1 200 OK
content-length: 46
content-type: application/json
date: Tue, 08 Feb 2022 05:14:42 GMT
server: uvicorn

{
"project": "ArgoCD - Demo",
"version": "demo-1"
}

Conclusion

Links