Argo CD: Let's Get Stuff Deployed
Revising
Зависимости
1. Cloud ☁️ | 2. Docker 🐳 | 3. Orchestration ⛵ | 4. CI/CD 🚀 | 5. K8s GitOps operators 🐙 |
---|---|---|---|---|
AWS | Docker Engine | Kubernetes | Jenkins | Argo CD |
Azure | CRI-O | Docker Swarm | GitLab CI/CD | Flux CD |
others | others | others | others | others |
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 - может перезапустить отказавшие контейнеры, выполнять различные проверки и т.д.
вопрос
Какой из компонентов Kubernetes управляет всеми другими?
CI/CD 🚀 💿
CD - непрерывная доставка - новая версия приложения (артефакт) создается при каждом слияние, но развертывание все еще происходит вручную.
CD - непрерывное развертывание - говорит о том, что после сборки артефакта он автоматически развертывается на одно из наших окружений.
caution
CI/CD/CD - сильно зависит от вашего GitXXX Flow.
GitOps, Argo CD
вопрос
- Что такое Infrastructure as a Code (IaC)?
- В чем разница императивной и декларативной парадигм?
Argo CD workflow
GitOps
GitOps - это эволюция IaC, где Git является единственным источником истины состояния нашей инфрастуктуры, реализует непрерывное развертывание.- прозрачность: аудит / передача экспертизы / документация / Git Workflow (перенос опыта совместной разработки для управления инфрастуктурой)
- исправление ошибок -
git revert
- легкость настройки доступов
GitOps vs IaC(CI_OPs)
... | GitOps | IaC |
---|---|---|
Paradigm 🗿 | Pull (Declarative) | Push (Imperative) |
Code Storage 🏦 | Git | may not be in Git |
Code Changes Process 🙋♀️ | GitXXX flow | GitXXX flow or manual |
Infrastructure Updates 🔧 | Automated | CI or manual |
Access 💂♂️ | Operator to git | CI or operator to K8s api |
Infra Changes 💥 | Git | helm rollback,upgrade,delete and etc. |
Argo CD
note
controller = operator = agent
K8s, это лишь один из примеров использования GitOps и cloud native приложений
- проект сертифицирован CNCF
- использует Git как источник истины, может автоматически синхронизировать состояние кластера с Git
- декларативный (plain yaml, plain json, kustomize, helm, jsonnet)
- controller + CRD
- SSO + RBAC
Demo
note
Код из demo: https://gitlab.com/publi8/
Application
- FastApi
- Dockerfile
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/version")
def get_version():
return {"version": "demo-1"}
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
- Application
- Deployment
---
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
---
apiVersion: v1
kind: Service
metadata:
name: demo-app
namespace: default
spec:
selector:
app: demo-app
ports:
- port: 8000
targetPort: 8000
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
namespace: default
spec:
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: demo-app
image: registry.gitlab.com/publi8/demo-application
resources:
requests:
cpu: "20m"
memory: "32Mi"
limits:
cpu: "30m"
memory: "64Mi"
ports:
- containerPort: 8000
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
GitOps
- https://www.gitops.tech/
- https://about.gitlab.com/topics/gitops/
- https://www.weave.works/technologies/gitops/
- https://express42.com/news/difference-between-gitops-and-iac/
- video Nana gitops
- video d.stolyarov - gitops
ArgoCD:
- https://argo-cd.readthedocs.io/en/stable/
- video Argo CD Demo - argo docs
- video Nana Argo CD
CI/CD: