Mi az az ArgoCD?
Az ArgoCD egy deklaratív, GitOps folyamatos kézbesítési eszköz Kuberneteshez.
Főbb jellemzői:
- Alkalmazások automatizált telepítése megadott célkörnyezetekbe
- Több konfigurációkezelő/sablonozó eszköz támogatása (Kustomize, Helm, Jsonnet, plain-YAML)
- Több klaszterre való felügyelet és telepítés lehetősége
- SSO integráció (OIDC, OAuth2, LDAP, SAML 2.0, GitHub, GitLab, Microsoft, LinkedIn)
- Több bérlős és RBAC szabályzatok engedélyezéshez
- Visszagörgetés/bárhová visszagörgetés bármely, a Git repositoryban véglegesített alkalmazáskonfigurációra
- Az alkalmazás erőforrásainak állapotelemzése
- Automatizált konfigurációs eltérés észlelése és vizualizáció
- Az alkalmazások automatikus vagy manuális szinkronizálása a kívánt állapotba
- Webes felhasználói felület, amely valós idejű áttekintést nyújt az alkalmazás aktivitásáról
- CLI az automatizáláshoz és a CI integrációhoz
- Webhook integráció (GitHub, BitBucket, GitLab)
- Hozzáférési tokenek az automatizáláshoz
- PreSync, Sync és PostSync hookok az összetett alkalmazásbevezetések támogatásához (pl. blue/green és canary frissítések)
- Alkalmazásesemények és API-hívások auditnaplói
- Prométheusz metrikák
- Paraméter-felülbírálások a Gitben a helm paraméterek felülbírálásához
Kölcsönvettem egy fotót a honlapjukról:

Gitben tárolod a manifesteket, amiket eddig kézzel telepítettél fel a kubectl apply -f deployment.yaml
paranccsal. Az ArgoCD-vel kezelt appok ugyanúgy fognak futni a fürtödön, csak a saját, webes felületén át (is) tudod őket kezelni. Aki szédül a parancssortól, azok szeretni fogják 🙂
Hogyan kell telepíteni a Kubernetes fürtbe?
Mondanom se kell, ezt azon a gépen kell kiadni, ahonnan menedzseled a K8s fürtöd:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Várj kb fél percet, majd csekkold le a podokat:
$ kubectl get po -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 51s
argocd-applicationset-controller-96bc979c9-8jgvf 1/1 Running 0 52s
argocd-dex-server-6f9968cfbd-nccpb 1/1 Running 0 52s
argocd-notifications-controller-69bf9cfb4b-ssknx 1/1 Running 0 52s
argocd-redis-f7b98dd44-hnplv 1/1 Running 0 51s
argocd-repo-server-b44c54b96-ztmpf 1/1 Running 0 51s
argocd-server-6d99648bc-sfr4h 1/1 Running 0 51s
Bizonyos funkciók miatt azt javaslom, hogy telepítsd fel az argocd cli-t, ezen a weboldalon többféle lehetőséget is felsorolnak. Én pl ezzel két paranccsal szoktam a gyári jelszót egyedire cserélni:
argocd login --insecure 172.18.0.2:30444 --username admin --password $(argocd admin initial-password -n argocd | head -n 1)
argocd account update-password --current-password $(argocd admin initial-password -n argocd | head -n 1)
- bejelentkezik az ArgoCD-be (kiolvassa a gyári jelszót)
- majd megkér, hogy adj meg új jelszót (kétszer)
Feltehetően nálad más IP cím és port alatt lesz elérhető az ArgoCD, ezt módosítsd!
Nálam az IP cím adott volt, a portot pedig ezzel a kis yaml fájllal állítottam be, pontosabban elérhetővé tettem:
apiVersion: v1
kind: Service
metadata:
name: argocd-server-external
namespace: argocd
labels:
k8s-app: argocd-server
spec:
type: NodePort
ports:
- targetPort: 8080
port: 8080
nodePort: 30444
name: https
selector:
app.kubernetes.io/name: argocd-server
Így tudod a fenti yaml fájlt betölteni a fürtbe:
kubectl apply -f argocd-service.yml
Amennyiben Te is ezzel a névvel mentetted el 🙂
Fut az ArgoCD, van CLI-m, hogy érem el a webes felületét?
Nálam a fentebb is látott https://172.18.0.2:30444/
címen:

Belépés után mondhatni, kicsit üres:

Mielőtt feltelepítjük az 1. appunkat, meg kell említenem egy apróságot: az ArgoCD-nek hozzá kell férnie a git repódhoz. Ha ez jelszóval védett, akkor szükséged lesz egy argocd-secret.yaml fájlra:
apiVersion: v1
kind: Secret
metadata:
name: privat-repo-creds
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repo-creds
stringData:
type: git
url: http://192.168.5.213:3000/msandor/argocd
username: msandor
password: TOKEN-vagy-JELSZO
Az url/username/password értékeit állítsd be a saját környezetednek megfelelően!
Javaslom a token létrehozását, elég csak a repóhoz olvasási jogot adni:

Így kell a fürtbe tölteni:
kubectl apply -f argocd-secret.yaml
Ha sikerült, akkor az ArgoCD webfelületén a Settings -> Repositories menüpont alatt fogod megtalálni:

Telepítsünk fel egy appot!
Az előző cikkben készítettünk egy fapados apache konténert. Vegyük elő a gitea szerverünket, és készítsünk egy új repót argocd névvel. Benne hozzunk létre egy apache-demo nevű mappát. Abban pedig egy deployment.yaml nevű fájlt az alábbi tartalommal:
apiVersion: apps/v1
kind: Deployment
metadata:
name: apache-demo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: apache-demo
template:
metadata:
labels:
app: apache-demo
spec:
containers:
- name: apache-demo
image: 192.168.5.213:5005/msandor/apache-demo:latest
ports:
- containerPort: 8080
protocol: TCP
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: apache-demo
namespace: default
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30280
name: http
selector:
app: apache-demo
Ezt a kódot egy régebbi cikkemből vettem kölcsön, amit ebben a git repóban tároltam el. Az egyszerűség kedvéért most istio nélkül, egy NodePorton keresztül fogjuk elérni. Minden „felesleget” töröltem belőle. Valamint a giteás cikkekhez létrehozott docker registry-t állítottam be hozzá (192.168.5.213:5005).
Fontos tudnivaló a docker registry-ről! Erősen ajánlom, hogy https mögé tedd, mert a Kubernetes nem fog letölteni IP:PORT/konténer:tag formátumban megadott registryből. Ahogy a dokcer-nél is fel kellett venni a kivétel listára, úgy a K8s-t is hekkelni kell miatta. Épp emiatt tisztább és szárazabb érzés, ha egy már létező domain név mögé teszed a registry-d (erről fogok írni egy külön cikket).
Szóval van egy zárt git repó (argocd néven), amit csak jelszóval vagy tokennel lehet elérni, benne az apache-demo-hoz tartozó manifest fájllal:

Ha kézzel betöltjük a K8s-be a kubectl apply -f deployment.yaml
paranccsal, akkor szépen el fogjuk érni a megadott porton:

Sajnos (vagy szerencsére) erről az ArgoCD nem fog tudni, mivel nem Ő telepítette. Állítsuk le: kubectl delete -f deployment.yaml
Az 1. appunk telepítése ArgoCD GUI-n keresztül
Az Applications menüben felül van egy + gomb, vagy alul egy CREATE APPLICATION feliratos gomb:

Mindegy, hogy melyiket választod 😀


Kis magyarázat:
- adj nevet a gyereknek
- tetszőleges
- manuális vagy automata szinkronizálás a git repó és a K8s fürt között
- a git repód elérési útja
- a kérdéses app mappájának a neve
- hová telepítse (ez annak a fürtnek a neve, ahol az ArgoCD is fut)
- névtér
Kattints a bal felső CREATE gombra. Ha valamit elrontottál, kapsz egy szép hibaüzenetet. Akik jól dolgoztak, ezt fogják látni:

- sárga a doboz, pontosabban nincs szinkronban, nem is fut az app, ez a kézi (manual) módszer lényege
- az app futtatásához kattintsunk a SYNC gombra

- meg kell erősítenünk, megint kattintsunk a SYNCRONYZE gombra
- alul mutatja, milyen erőforrásokat fog betölteni
Hiba próbáltam átverni, hogy egy fájlba tettem 😀
Előbb bekékül a dobozunk (ekkor tölti le a gitből a yaml fájlt), majd normális esetben be fog zöldülni:

Kattintsunk a dobozra, kapunk egy szép ábrát:

Minden kis dobozka kattintható, további infókat mutatnak. Ellenőrizzétek böngészőből az oldalt, a korábbi linken lesz elérhető.
Alkalmazás törlése: a főmenüben állva a dobozka alján kattintsunk az X gombra:

Meg kell erősíteni, ehhez be kell írni az app nevét, majd OK:

Az 1. appunk telepítése ArgoCD CLI-n keresztül
Nekem ez a kedvencem 🙂 Jóval gyorsabb, csak egy parancsot kell kiadni:
argocd app create apache-demo --repo http://192.168.5.213:3000/msandor/argocd --path apache-demo --dest-server https://kubernetes.default.svc --dest-namespace default --upsert --sync-policy automated
Itt most szándékosan az automata módot választottam!
Ha belekattintasz a dobozkába, egy különbség lesz a korábbi állapothoz képest:

Nincs semmi meglepetés, a szinkronizálás módja a megfejtés 😉
Végezzünk el egy tesztet. Módosítsunk bármit a git repóban, egészen pontosan az apache-demo/deployment.yaml fájlban. Szét fogom bontani két részre a fájlt, a service szakaszt külön fájlba fogom tenni.
Nemsokkal a git push
után nézzünk rá az appunkra (tudtommal max 3 percenként néz bele a git repóba):

Első számú tapasztalat: szinkronizált a git repóval, lásd komment mezők.
Második számú tapasztalat: nincs új dobozunk, hiszen tartalmilag nem változott a fájl, csak kétfelé bontottam.
Most módosítani fogom a konténer verzióját , tolok egy git push-t, és megvárom, amíg az ArgoCD észreveszi, és frissíti a konfigot a K8s-ben is:
$ git diff
diff --git a/apache-demo/deployment.yaml b/apache-demo/deployment.yaml
index a87ea11..6a12700 100644
--- a/apache-demo/deployment.yaml
+++ b/apache-demo/deployment.yaml
@@ -15,7 +15,7 @@ spec:
spec:
containers:
- name: apache-demo
- image: 192.168.5.213:5005/msandor/apache-demo:latest
+ image: 192.168.5.213:5005/msandor/apache-demo:2.4.65.27914d0ffd
ports:
- containerPort: 8080
protocol: TCP
$ git commit -a -m "verzió fixálása"
[main d5d7382] verzió fixálása
1 file changed, 1 insertion(+), 1 deletion(-)
$ git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 430 bytes | 430.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
remote: . Processing 1 references
remote: Processed 1 references in total
To http://192.168.5.213:3000/msandor/argocd.git
95508c5..d5d7382 main -> main
Végre van egy kis tűzijáték:

- 20 perce jött létre az 1. replicaset, immár nem tartozik hozzá aktív pod
- pár másodperce jött létre az 2. replicaset, ez futtatja az aktív podunkat
Alkalmazás törlése:
argocd app delete apache-demo -y
Ez megerősítés nélkül törölni fogja az appot mind a K8s-ből, mind az ArgoCD felületéről!
Aki nem biztos magában, az hagyja el a -y
kapcsolót. Ilyenkor megerősítést fog kérni, van lehetőséged átgondolni, hogy a megfelelő appot szeretnéd megsemmisíteni.
Most nézzünk meg egy appot, amit Helm-el fogunk telepíteni az ArgoCD-vel
A kiindulási alap az apache-demo yaml fájljai lesznek. Átkereszteltem apache-demo2-re.
Picit több fájlra lesz szükségünk a helm charthoz, a git repó tartalma:
$ tree
.
├── apache-demo
│ ├── deployment.yaml
│ └── service.yaml
├── apache-demo2
│ ├── Chart.yaml
│ ├── templates
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ └── values.yaml
└── README.md
A Chart.yaml fájl tartalma:
apiVersion: v2
name: apache-demo2
version: 1.0
appVersion: 1.0
description: apache-demo
type: application
keywords:
- apache
- kubernetes
- kind
maintainers:
- email: git@msandor.hu
name: msandor
sources:
- http://192.168.5.213:3000/msandor/argocd
A values.yaml fájl tartalma:
image:
repository: 192.168.5.213:5005/msandor/apache-demo
tag: latest
service:
nodeport: 30281
A templates/deployment.yaml fájl tartalma:
apiVersion: apps/v1
kind: Deployment
metadata:
name: apache-demo2
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: apache-demo2
template:
metadata:
labels:
app: apache-demo2
spec:
containers:
- name: apache-demo2
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
ports:
- containerPort: 8080
protocol: TCP
restartPolicy: Always
A templates/service.yaml fájl tartalma:
apiVersion: v1
kind: Service
metadata:
name: apache-demo2
namespace: default
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: {{ .Values.service.nodeport }}
name: http
selector:
app: apache-demo2
A Helm-ről is szeretnék külön cikket írni, így itt most nem megyek bele a részletekbe, éles szeműek észrevehették, hogy ugyanaz a két manifest fájlunk, csak kiszerveztem változóba a konténert és a portot.
Most ezt is adjuk hozzá az ArgoCD-hez parancssorból:
argocd app create apache-demo2 --repo http://192.168.5.213:3000/msandor/argocd --path apache-demo2 --dest-server https://kubernetes.default.svc --dest-namespace default --upsert --sync-policy automated --values values.yaml
Egyetlen különbség van a korábbi parancshoz képest: –values values.yaml, természetesen az app neve és a mappa neve is változott, mivel az appok neveinek egyedinek kell lennie egy névtéren belül:

Ezt is teszteljük le, itt is módosítani fogom a tag-et:
$ git diff
diff --git a/apache-demo2/values.yaml b/apache-demo2/values.yaml
index a1b3841..e28cbea 100644
--- a/apache-demo2/values.yaml
+++ b/apache-demo2/values.yaml
@@ -1,6 +1,6 @@
image:
repository: 192.168.5.213:5005/msandor/apache-demo
- tag: latest
+ tag: 2.4.65.27914d0ffd
service:
nodeport: 30281
$ git commit -a -m "latest -> 2.4.65.27914d0ffd"
[main a2dd8f0] latest -> 2.4.65.27914d0ffd
1 file changed, 1 insertion(+), 1 deletion(-)
$ git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 422 bytes | 422.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
remote: . Processing 1 references
remote: Processed 1 references in total
To http://192.168.5.213:3000/msandor/argocd.git
ebdbd71..a2dd8f0 main -> main
Kis idő múlva frissül az appunk, amit az ArgoCD felületén meg is tekinthetünk:

Ugyanaz a látvány fogad minket, függetlenül attól, hogy mezei yaml fájlokat használunk, vagy helm diagramba csomagolt fájlokat…
Végszó
Elértük azt, hogy gitből telepítjük az appokat, ráadásul, ha frissül a gitben a manifest, autosync mód esetén 3 percen belül kikerül a K8s fürtre is a módosítás. Manuál módban csak rajtunk múlik, hogy mikor élesítjük a változásokat.
Az ArgoCD-ről is órákig lehetne még beszélni, tudom, hogy csak a felszínt kapargatjuk, de ezt is két napig írtam 🙂