Klaster OKD 4.19 (OpenShift) – Konfiguracja Argo CD do współpracy z GitLab

Założenia wstępne do wdrożenia Argo CD

  • OKD 4.19
  • GitLab: https://gitlab.okdlab.local
  • Repo na GitLab : https://gitlab.okdlab.local/dev-ops/healthlog-gui.git
  • Repo na bastion: /repo/git/healthlog-gui
  • Namespace Argo (OpenShift GitOps) : argocd

Twoje docelowe namespace’y aplikacji:

  • healthlog-helm-dev
  • healthlog-helm-prod

W OpenShift GitOps, żeby Argo mogło zarządzać innym namespace’em, musi on mieć label argocd.argoproj.io/managed-by=openshift-gitops.

Struktura repo na bastion

/repo/git/healthlog-gui
├── argocd
│   ├── app-healthlog-gui-dev.yaml
│   ├── app-healthlog-gui-prod.yaml
│   └── project-healthlog.yaml
├── argocd-bootstrap
│   └── bootstrap-app.yaml
├── Dockerfile
├── helm
│   ├── Chart.yaml
│   ├── templates
│   │   ├── configmap.yaml
│   │   ├── deployment.yaml
│   │   ├── route.yaml
│   │   ├── secret.yaml
│   │   └── service.yaml
│   └── values.yaml
├── index.php
└── kustomize
    ├── base
    │   └── kustomization.yaml
    └── overlays
        ├── dev
        │   ├── kustomization.yaml
        │   └── values-dev.yaml
        └── prod
            ├── kustomization.yaml
            └── values-prod.yaml

Instalacja Argo CD na OKD (OpenShift GitOps)

W konsoli graficznej OKD 4.19 wybieramy z menu Operators -> OperatorHub i wpisujemy GitOps. Wybieramy Argo CD (Community)

Potwierdzamy przyciskiem Install

Ustawienia polecane:

Update channel: alpha

(bo tylko to jest dostępne)

Version: 0.17.0

Installation mode: All namespaces on the cluster (default)

To jest najlepsze na start, bo operator będzie mógł tworzyć instancje Argo CD w wybranych namespace’ach bez dodatkowych ograniczeń.

Installed Namespace: openshift-operators

To jest standardowy namespace dla operatorów “cluster-wide”.

Update approval: Automatic

Na labie najwygodniej.

Sama instalacja operatora nie uruchomi jeszcze Argo CD — operator tylko dodaje CRD i kontroler. Potem musisz stworzyć instancję Argo CD (zasób ArgoCD).

# Sprawdź, czy operator się zainstalował
oc get csv -n openshift-operators | grep -i argo

argocd-operator.v0.17.0   Argo CD   0.17.0    argocd-operator.v0.16.0   Succeeded

# Utwórz namespace dla Argo CD (np.argocd)
mkdir /repo/argocd
nano /repo/argocd/argocd-instance.yaml
apiVersion: argoproj.io/v1alpha1
kind: ArgoCD
metadata:
  name: argocd
  namespace: argocd
spec: {}

Utwórz instancję Argo CD (CR) w tym namespace

oc apply -f /repo/argocd/argocd-instance.yaml

Sprawdzamy czy Argo CD wstało

oc get pods -n argocd
NAME                                  READY   STATUS    RESTARTS   AGE
argocd-application-controller-0       1/1     Running   0          2m14s
argocd-redis-7896fc99b6-p2xb6         1/1     Running   0          2m14s
argocd-repo-server-79cc9769f6-b2dq6   1/1     Running   0          2m14s
argocd-server-5fd7b445df-bknjq        1/1     Running   0          2m14s

Wystawienie UI Argo CD (Route)

oc -n argocd get svc argocd-server -o yaml | egrep -n 'port:|targetPort:|name:'
6:    service.beta.openshift.io/serving-cert-secret-name: argocd-server-tls
12:    app.kubernetes.io/name: argocd-server
14:  name: argocd-server
21:    name: argocd
34:  - name: http
35:    port: 80
37:    targetPort: 8080
38:  - name: https
39:    port: 443
41:    targetPort: 8080
43:    app.kubernetes.io/name: argocd-server

# Utwórz route typu edge na port http
oc -n argocd create route edge argocd-server --service=argocd-server --port=http
oc get route -n argocd

# przeglądarka wywala ERR_TOO_MANY_REDIRECTS 
# - ArgoCD jest skonfigurowane z --insecure / bez TLS “po stronie serwera”
# - Route robi TLS (edge) i przekazuje HTTP do backendu,
# - ArgoCD próbuje wymusić https/redirect w sposób, który wchodzi w pętlę.
oc -n argocd get cm | grep -E 'cmd-params|argocd-cm|argocd.*cm'
argocd-cm                   15     22m
argocd-cmd-params-cm        1      22m
argocd-gpg-keys-cm          0      22m
argocd-rbac-cm              3      22m
argocd-ssh-known-hosts-cm   1      22m
argocd-tls-certs-cm         0      22m

oc -n argocd patch cm argocd-cmd-params-cm --type merge -p '{
  "data": {
    "server.insecure": "true"
  }
}'
configmap/argocd-cmd-params-cm patched

# zły publiczny URL
# w cm argocd-cm jest url: https://argocd-server
HOST=$(oc -n argocd get route argocd-server -o jsonpath='{.spec.host}')
echo $HOST
oc -n argocd patch cm argocd-cm --type merge -p "{\"data\": {\"url\": \"https://$HOST\"}}"
# weryfikacja zmian w cm
oc -n argocd get cm argocd-cm -o jsonpath='{.data.url}{"\n"}'

# Włącz server.insecure=true w cmd params
oc -n argocd patch cm argocd-cmd-params-cm --type merge -p '{"data":{"server.insecure":"true"}}'
oc -n argocd rollout restart deploy/argocd-server

oc -n argocd create route edge argocd-server --service=argocd-server --port=http

oc get svc -n argocd
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
argocd-metrics          ClusterIP   172.30.238.43   <none>        8082/TCP            3m51s
argocd-redis            ClusterIP   172.30.77.193   <none>        6379/TCP            3m51s
argocd-repo-server      ClusterIP   172.30.86.53    <none>        8081/TCP,8084/TCP   3m51s
argocd-server           ClusterIP   172.30.81.250   <none>        80/TCP,443/TCP      3m51s
argocd-server-metrics   ClusterIP   172.30.9.26     <none>        8083/TCP            3m51s

# Procedura naprawcza III Włącz Route w CR ArgoCD
oc -n argocd patch argocd argocd --type merge -p '{
  "spec": {
    "server": {
      "route": {
        "enabled": true
      }
    }
  }
}'

oc -n argocd get route
NAME            HOST/PORT                                            PATH   SERVICES        PORT    TERMINATION          WILDCARD
argocd-server   argocd-server-argocd.apps.testcluster.okdlab.local          argocd-server   https   reencrypt/Redirect   None

# Ustaw server.insecure=true w sposób “operator-safe”
oc -n argocd patch cm argocd-cmd-params-cm --type merge -p '{"data":{"server.insecure":"true"}}'
oc -n argocd rollout restart deploy/argocd-server
# Po włączeniu route operator często sam ustawia url na adres route. Sprawdź:
[bastuser@bastion argocd]$ oc -n argocd get cm argocd-cm -o jsonpath='{.data.url}{"\n"}'
https://argocd-server-argocd.apps.testcluster.okdlab.local

Ustawienie hasła admina

NEWPASS='1234abcd.'
htpasswd -nbBC 10 "" "$NEWPASS" | tr -d ':\n' ; echo

$2y$10$IvDlnNG5yz/j/gAjPK1O7OEQwKxYfiHItft3NgR1rHaDdij/LA6QO
HASH='$2y$10$IvDlnNG5yz/j/gAjPK1O7OEQwKxYfiHItft3NgR1rHaDdij/LA6QO'

oc patch secret argocd-secret -n argocd --type merge -p "{\"stringData\": {\"admin.password\": \"${HASH}\", \"admin.passwordMtime\": \"$(date -Iseconds)\"}}"
secret/argocd-secret patched

# Zrestartuj argocd-server, żeby na pewno załapał
oc rollout restart deploy/argocd-server -n argocd

Zalogowanie się do Argo CD UI

Wchodzimy na adres https://argocd-server-argocd.apps.testcluster.okdlab.local/
Login: admin
Hasło: 1234abcd. (ustawione powyżej)

Po poprawnym zalogowaniu pokaże się główna strona Argo CD.

Dodaj cert GitLaba do ArgoCD (żeby HTTPS działał z self-signed)

# na maszynie gitlab
sudo cat /etc/gitlab/ssl/gitlab.okdlab.local.crt

# Wklej cert do ConfigMap ArgoCD, dodaj nowe pole data:
oc -n argocd edit cm argocd-tls-certs-cm

apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: "2026-02-19T17:30:42Z"
  labels:
    app.kubernetes.io/managed-by: argocd
    app.kubernetes.io/name: argocd-tls-certs-cm
    app.kubernetes.io/part-of: argocd
    operator.argoproj.io/tracked-by: argocd
  name: argocd-tls-certs-cm
  namespace: argocd
  ownerReferences:
  - apiVersion: argoproj.io/v1beta1
    blockOwnerDeletion: true
    controller: true
    kind: ArgoCD
    name: argocd
    uid: c725395d-a1bc-45cc-87e1-6b5cdf1536e9
  resourceVersion: "4734041"
  uid: 718f81ac-10df-4ac8-a8ab-03de622527df
data:
  gitlab.okdlab.local: |
    -----BEGIN CERTIFICATE-----
    MIIFHTCCAwWgAwIBAgIUJoHDYEJH/9QHqyB7WAIKOmyZ6MowDQYJKoZIhvcNAQEL
    BQAwHjEcMBoGA1UEAwwTZ2l0bGFiLm9rZGxhYi5sb2NhbDAeFw0yNjAyMTkxNDEw
    MDVaFw0yODA1MjQxNDEwMDVaMB4xHDAaBgNVBAMME2dpdGxhYi5va2RsYWIubG9j
    YWwwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0rUagg6wGHVw7lstv
    75SdwUrdm1sK9ayt1kGs9vO5XK4cGKqVmd/pnPzCwac+TDiX+a9SdrGTRnrOEZNA
    zdKgf1rUqK1l0W0yvYHkhOSOtTyqAsftPh9HHxOpmALEcw4dsyFsThLbZus8Elz8
    GaTHxVoL6l8Fx7N55sJOh35PLSMGfuWw78pxUQzrHz8i98fAYpmCOCEq+74UMSV3
    ztjFLhYXMhX0ha+OXBP7ag8gUvcdKTiPPBXm1lK0JFqpVecvTussIhGCCE+Ue3Ku
    i8Vugx2uh9cyT2JZ2cax0Rt/d9/pGeKHI3LJ+llK0Cf5KUpSjGBypZXaYaKCj5K9
    o2ndfuEjGvBGTxOjMWeGhlu+ItGdpSNW89R9EJkmoXsXXgLRZpv6RLyAQtBF8OP3
    UM4dhsayTXzEQ0p51L+lEMntZAYxai8Cfkpq0HX0mNFXptGI/jY8TfkOxQVwCJDx
    iluteQrjwsItGYxxcMtUnQ5ADdX4iO206lNLyTzUzVfTJHjj9hHSOkeCjrlAKmly
    YLPtLW00/qxNOh5AHEpwDosXR8YbnvT8vPFRt8LERp0H2S0qwt0Uw8eLeg2bRXo0
    xwNN2UPFm24sOGyXPZ0auql/pMml4nKtx0uRZjs9zudVTmtBMbSXU25xuVMPDMIN
    gkkhBaeUOV2pPWBNxnwyBVU8PQIDAQABo1MwUTAdBgNVHQ4EFgQUzdHN6Zk9yeDu
    jeR0q1HVjxnTWnowHwYDVR0jBBgwFoAUzdHN6Zk9yeDujeR0q1HVjxnTWnowDwYD
    VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAmXQfnmQdpyw9q04xEUM4
    6bg5Fuh6mCZoGD1Uy7ldrumqlcEMLPc91rNcCtMihPE2tfLAp9i+1cozVPb5+8Bw
    8bTOzNQd5mZs9X/RD6EifUs2W5czxXk3d30VWSFFQjX3zyXrPOSx1dSBneAS26c0
    pikHUKQreEWs3vvEJhgPcHOZWn+I5AMPvYIb0gmWJ8BcwqE9TJ6k6cmqTYcqMiiQ
    SqrhgUXD++geXXR3G25b06xe/J/p8bFYDfs9ublQu6wMfTb7MRNRlS/V98kVMH5b
    kJR7RmUFI1RBa15pWULp7vh+9F0KetTDT1aL/7bvF/eMA1kSK3dZot+ssmcXsHyE
    KJWQeS94SBo1sJSGPztrKn1C+2ddmLVgwHaK3KArLWOoi9hrK/Cc0xySdDdISLS2
    TiGWg7AZ0mGGmYrHOJ/vmLD+2FbeHAODupafCZ2TCNC13qUZ+zfHrqM3R0UitOpj
    6dQ+rzkkLFL0i2i5sMx3foUpBlK7Awj2fTyAGl3YBvRENBlI8QwjFb+6Zaw8NuNp
    jegZzSY2LFr0g4c1swuTuj6NSVurrjfmdiBsUL4HQ4mKVa/nuE46Xq8GKBzpDD4d
    GhZZ7yZUXIEFytsLQ/r06aM1O1YgwVi4TK+51BrWMEacEiEa8wBcVo/zAh2ap9Yi
    1KhX1d5AIPu6uNSg3oB9ZGg=
    -----END CERTIFICATE-----
    
# Po zapisaniu CM: restart repo-server
oc -n argocd rollout restart deploy/argocd-repo-server

# weryfikacja
oc -n argocd get cm argocd-tls-certs-cm -o yaml | sed -n '1,160p'

Dodaj dostęp do prywatnego repo w GitLab (repo-creds secret)

PAT potrzebny w polu password wygenerowaliśmy we wpisie https://itadmin.vblog.ovh/klaster-okd-4-19-openshift-serwer-gitlab-pod-argo-cd-i-okd/#Konfiguracja_pod_Argo_CD_OKD_419_repo_access_token

apiVersion: v1
kind: Secret
metadata:
  name: repo-gitlab-devops-creds
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repo-creds
type: Opaque
stringData:
  url: https://gitlab.okdlab.local/dev-ops
  username: argocd
  password: glpat-_PrgXNpNHAimlj1YpTYIUm86MQp1OjUH.01.0w08mf9og
oc apply -f /repo/argocd/repo-gitlab-devops-creds.yaml
# Sprawdź, czy secret istnieje:
oc -n argocd get secret repo-gitlab-devops-creds -o yaml | egrep -i 'name:|secret-type|url:|username:'

Przygotuj namespace’y docelowe (dev/prod) pod ArgoCD

Wskazujemy, którymi projektami będzie zarządzać Argo CD

# Upewnij się, że istnieją:
oc get ns healthlog-helm-dev  >/dev/null 2>&1 || oc new-project healthlog-helm-dev
oc get ns healthlog-helm-prod >/dev/null 2>&1 || oc new-project healthlog-helm-prod

# Daj label “managed-by” wskazujący namespace ArgoCD (argocd)
oc label ns healthlog-helm-dev  argocd.argoproj.io/managed-by=argocd --overwrite
oc label ns healthlog-helm-prod argocd.argoproj.io/managed-by=argocd --overwrite

Podmiana openshift-gitops → argocd w repo

Obecnie plikach yaml w/repo/git/healthlog-gui występuje namespace openshift-gitops, który trzeba zamienić na argocd

 cd /repo/git/healthlog-gui
grep -R "namespace:" -n argocd argocd-bootstrap
argocd/project-healthlog.yaml:5:  namespace: openshift-gitops
argocd/project-healthlog.yaml:11:    - namespace: healthlog-helm-dev
argocd/project-healthlog.yaml:13:    - namespace: healthlog-helm-prod
argocd/app-healthlog-gui-dev.yaml:5:  namespace: openshift-gitops
argocd/app-healthlog-gui-dev.yaml:18:    namespace: healthlog-helm-dev
argocd/app-healthlog-gui-prod.yaml:5:  namespace: openshift-gitops
argocd/app-healthlog-gui-prod.yaml:18:    namespace: healthlog-helm-prod
argocd-bootstrap/bootstrap-app.yaml:5:  namespace: openshift-gitops
argocd-bootstrap/bootstrap-app.yaml:16:    namespace: openshift-gitops

cd /repo/git/healthlog-gui
sed -i 's/namespace: openshift-gitops/namespace: argocd/g' argocd/*.yaml argocd-bootstrap/*.yaml

grep -R "namespace:" -n argocd argocd-bootstrap
argocd/project-healthlog.yaml:5:  namespace: argocd
argocd/project-healthlog.yaml:11:    - namespace: healthlog-helm-dev
argocd/project-healthlog.yaml:13:    - namespace: healthlog-helm-prod
argocd/app-healthlog-gui-dev.yaml:5:  namespace: argocd
argocd/app-healthlog-gui-dev.yaml:18:    namespace: healthlog-helm-dev
argocd/app-healthlog-gui-prod.yaml:5:  namespace: argocd
argocd/app-healthlog-gui-prod.yaml:18:    namespace: healthlog-helm-prod
argocd-bootstrap/bootstrap-app.yaml:5:  namespace: argocd
argocd-bootstrap/bootstrap-app.yaml:16:    namespace: argocd

Commit + push zmian do GitLaba

cd /repo/git/healthlog-gui
git add .
git commit -m "Switch Argo CD namespace from openshift-gitops to argocd"
[main 616163c] Switch Argo CD namespace from openshift-gitops to argocd
 4 files changed, 5 insertions(+), 5 deletions(-)
[bastuser@bastion healthlog-gui]$ git push
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 4 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 707 bytes | 707.00 KiB/s, done.
Total 8 (delta 5), reused 0 (delta 0), pack-reused 0 (from 0)
To https://gitlab.okdlab.local/dev-ops/healthlog-gui.git
   0309627..616163c  main -> main

Zmiana repoURL w YAML-ach w repo (dev-ops)

Wysyłam git push https://gitlab.okdlab.local/dev-ops/healthlog-gui.git a Argo CD Bootstrap próbuje https://gitlab.okdlab.local/healthlog/healthlog-gui.git

cd /repo/git/healthlog-gui
[bastuser@bastion healthlog-gui]$ grep -R "gitlab.okdlab.local/" -n argocd argocd-bootstrap
argocd/project-healthlog.yaml:9:    - https://gitlab.okdlab.local/healthlog/healthlog-gui.git
argocd/app-healthlog-gui-dev.yaml:9:    repoURL: https://gitlab.okdlab.local/healthlog/healthlog-gui.git
argocd/app-healthlog-gui-prod.yaml:9:    repoURL: https://gitlab.okdlab.local/healthlog/healthlog-gui.git
argocd-bootstrap/bootstrap-app.yaml:9:    repoURL: https://gitlab.okdlab.local/healthlog/healthlog-gui.git

sed -i 's#https://gitlab\.okdlab\.local/healthlog/healthlog-gui\.git#https://gitlab.okdlab.local/dev-ops/healthlog-gui.git#g' \
  argocd/*.yaml argocd-bootstrap/*.yaml

grep -R "repoURL:" -n argocd argocd-bootstrap

# Commit + push
cd /repo/git/healthlog-gui
git add .
git commit -m "Fix repoURL to dev-ops group for Argo CD apps"
git push

# Odśwież ArgoCD -> healthlog-gui-bootstrap kliknij REFRESH potem SYNC lub z liini poleceń
oc -n argocd get application healthlog-gui-bootstrap -o jsonpath='{.spec.source.repoURL}{"\n"}'

Zastosowanie bootstrap z lokalnego pliku

oc apply -n argocd -f /repo/git/healthlog-gui/argocd-bootstrap/bootstrap-app.yaml
oc -n argocd get applications
# błąd oznacza brak SAN w cercie gitlaba oc -n argocd edit cm argocd-tls-certs-cm
Failed to load target state: failed to generate manifest for source 1 of 1: rpc error: code = Unknown desc = failed to list refs: Get "https://gitlab.okdlab.local/healthlog/healthlog-gui.git/info/refs?service=git-upload-pack": tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead
# błąd niepoprawnego adresu git-a
Failed to load target state: failed to generate manifest for source 1 of 1: rpc error: code = Unknown desc = failed to list refs: authentication required: HTTP Basic: Access denied. If a password was provided for Git authentication, the password was incorrect or you're required to use a token instead of a password. If a token was provided, it was either incorrect, expired, or improperly scoped. See https://gitlab.okdlab.local/help/topics/git/troubleshooting_git.md#error-on-git-fetch-http-basic-access-denied
oc -n argocd get application healthlog-gui-bootstrap -o yaml | egrep -n 'repoURL:|path:|targetRevision:'
19:    path: argocd
20:    repoURL: https://gitlab.okdlab.local/healthlog/healthlog-gui.git
21:    targetRevision: main
47:        path: argocd
48:        repoURL: https://gitlab.okdlab.local/healthlog/healthlog-gui.git
49:        targetRevision: main

# patch zmieniajacy adres repo
oc -n argocd patch application healthlog-gui-bootstrap --type merge -p '{
  "spec": {
    "source": {
      "repoURL": "https://gitlab.okdlab.local/dev-ops/healthlog-gui.git"
    }
  }
}'

# Wymuś odświeżenie aplikacji bootstrap
oc -n argocd annotate application healthlog-gui-bootstrap \
  argocd.argoproj.io/refresh=hard --overwrite

Wykorzystanie obecnego środowiska CD (bez CI)

GitLab jest źródłem prawdy (desired state) dla manifestów.

ArgoCD non-stop robi reconcile: porównuje stan w klastrze z Gitem i (jeśli masz auto-sync) doprowadza klaster do tego co jest w repo.

To jest esencja GitOps.

Czy “git push” faktycznie coś zmieni w klastrze?

Jeśli zmienisz pliki, które ArgoCD śledzi (path + branch) i zrobisz git push, Argo:

wykryje commit (polling co chwilę; webhook możesz dodać później),

pokaże aplikację jako OutOfSync,

i jeśli masz włączone Auto-Sync, to sam wdroży zmiany,

jeśli nie masz auto-sync → klikniesz SYNC.

Najważniejsze ograniczenie (bez Jenkinsa / CI)

ArgoCD nie buduje obrazów.

Czyli możesz wdrażać:

zmiany w ConfigMap/Secrets/Route/Service/Deployment,

zmiany wartości Helm (np. env, replicas),

zmiany kustomize patchy,

zmiany namespaces / RBAC (jeśli masz to w repo),

ALE jeśli zmienisz index.php i zrobisz git push, to:

sam kod nie pojawi się w działającym podzie, dopóki nie zbudujesz nowego obrazu i nie zmienisz tagu w Deployment (lub nie odświeżysz ImageStream w OKD, jeśli tak to masz).

Bez CI masz dwie opcje:

Opcja A — “ręczny build + GitOps deploy”

robisz oc start-build …

obraz dostaje nowy tag (np. :latest lub lepiej :build-20260219-1)

w Git zmieniasz image: w values-dev/values-prod (albo w chart values)

git push → Argo wdraża nowy obraz

to jest najbardziej przewidywalne.

Opcja B — dalej używasz :latest

budujesz :latest,

a potem robisz w Git np. zmianę “dummy” żeby wymusić rollout,

lub w Deployment ustawisz imagePullPolicy: Always (średnio polecam na OKD),

albo robisz oc rollout restart deploy/… (ale to już nie GitOps-only).

Co możesz osiągnąć już teraz (bez CI)

A) Stabilne DEV/PROD z różnymi ustawieniami

Masz już values-dev.yaml i values-prod.yaml.

Możesz różnicować:

liczba replik

limity CPU/RAM

host route (np. healthlog-dev.apps… vs healthlog.apps…)

konfiguracja app (URL backendu, feature flags)

sekrety (patrz niżej)

Zasada: DEV zmieniasz szybciej, PROD wolniej (np. manual sync).

B) Pełna historia zmian i rollback

W ArgoCD masz:

historię synców

diff “co się zmieniło”

rollback do wcześniejszego commita/rewizji

To jest ogromny plus bez żadnych dodatkowych narzędzi.

C) Drift detection (ktoś kliknie oc edit i popsuje)

Jeśli ktoś ręcznie zmieni Deployment w klastrze:

Argo pokaże drift (OutOfSync)

i (przy auto-sync) cofnie zmianę do tego co w Git

To jest “strażnik porządku”.

Scenariusz I – zmiana w konfiguracji projektu

Co zostanie zmienione ?
Wartości w /repo/git/healthlog-gui/kustomize/overlays/prod/values-prod.yaml

Co się realnie stanie po zmianie values-prod.yaml?

values-prod.yaml to input do renderowania Helm chartu (wartości).
Jeśli healthlog-gui-prod jest skonfigurowany tak, że używa chartu z helm/ i w Application ma helm.valueFiles: [kustomize/overlays/prod/values-prod.yaml]

to po zmianie pliku ArgoCD:

  • pobierze nowy commit z GitLaba,
  • wyrenderuje Helm na serwerze repo-server (w klastrze),
  • porówna wynik z tym co jest w OKD,
  • i wdroży różnice (sync).

W values-prod.yaml masz HL_GUI_SHOW_ENVIRONMENT_VARIABLES: „0”

Ale w chart’cie Helm nie ma ani jednego miejsca, które używa tego klucza (grep w helm/templates nic nie znalazł)

Czyli ArgoCD robi dokładnie to, co powinien:

pobiera nowy commit,

renderuje Helm,

a wynik manifestów jest taki sam jak wcześniej,

więc aplikacja zostaje Synced i auto-sync nie ma czego wdrażać.

Żeby to działało, musisz sprawić, aby ta wartość z values-prod.yaml wpływała na manifesty — najprościej: wstrzyknąć ją jako zmienną środowiskową do kontenera albo do ConfigMap

cd /repo/git/healthlog-gui
nano kustomize/overlays/prod/values-prod.yaml

# Zmieniasz np.:
# replicaCount
# resources
# zmienne env w configmapie jeśli chart je używa
# host route
# image tag (ważne przy deployu nowej wersji)

cd /repo/git/healthlog-gui
git add .
git commit -m "prod: usatwiono HL_GUI_SHOW_ENVIRONMENT_VARIABLES: 1"

# Nie uruchamiasz już ręcznie helm ani oc apply

Po jakimś czasie pojawi się informacja Synced i podany Autor oraz Komentarz z ostatniego git commit. Argo wykrywa więc zmiany ale ich nie wdraża automatycznie.

W tym momencie trzeba jeszcze ręcznie wykonać Sync dla aplikacji ealthlog-gui-prod, wchodząc w nią i klikając na Sync.

Po jakimś czasie pojawi się informacja Synced i podany Autor oraz Komentarz z ostatniego git commit. Argo wykrywa więc zmiany ale ich nie wdraża automatycznie.

W tym momencie trzeba jeszcze ręcznie wykonać Sync dla aplikacji ealthlog-gui-prod, wchodząc w nią i klikając na Sync.

# bez czekania, robisz hard refresh:
oc -n argocd annotate app healthlog-gui-prod argocd.argoproj.io/refresh=hard --overwrite

# podgląd zdarzeń sync
oc -n argocd describe app healthlog-gui-prod | sed -n '/Events:/,$p'

Events:
  Type    Reason              Age    From                           Message
  ----    ------              ----   ----                           -------
  Normal  OperationStarted    43m    argocd-application-controller  Initiated automated sync to 'f985a9324d2217609ce8e6c78ea680cd4ef814cd'
  Normal  ResourceUpdated     43m    argocd-application-controller  Updated sync status: Synced -> OutOfSync
  Normal  OperationCompleted  43m    argocd-application-controller  Sync operation to f985a9324d2217609ce8e6c78ea680cd4ef814cd succeeded
  Normal  ResourceUpdated     43m    argocd-application-controller  Updated sync status: OutOfSync -> Synced
  Normal  ResourceUpdated     43m    argocd-application-controller  Updated health status: Healthy -> Progressing
  Normal  ResourceUpdated     43m    argocd-application-controller  Updated health status: Progressing -> Healthy
  Normal  OperationStarted    37m    argocd-application-controller  Initiated automated sync to 'af8b5d0c3fa1fc77d56dc2065f8d25c60f630050'
  Normal  ResourceUpdated     37m    argocd-application-controller  Updated sync status: Synced -> OutOfSync
  Normal  OperationCompleted  37m    argocd-application-controller  Sync operation to af8b5d0c3fa1fc77d56dc2065f8d25c60f630050 succeeded
  Normal  ResourceUpdated     37m    argocd-application-controller  Updated sync status: OutOfSync -> Synced
  Normal  ResourceUpdated     37m    argocd-application-controller  Updated health status: Healthy -> Progressing
  Normal  ResourceUpdated     37m    argocd-application-controller  Updated health status: Progressing -> Healthy
  Normal  OperationStarted    7m21s  argocd-application-controller  Initiated automated sync to '24cb2cdcbdcaf906d813eb92bd2c4ad6e3718d01'
  Normal  ResourceUpdated     7m21s  argocd-application-controller  Updated sync status: Synced -> OutOfSync
  Normal  OperationCompleted  7m20s  argocd-application-controller  Sync operation to 24cb2cdcbdcaf906d813eb92bd2c4ad6e3718d01 succeeded
  Normal  ResourceUpdated     7m20s  argocd-application-controller  Updated sync status: OutOfSync -> Synced
  Normal  ResourceUpdated     7m20s  argocd-application-controller  Updated health status: Healthy -> Progressing
  Normal  ResourceUpdated     7m7s   argocd-application-controller  Updated health status: Progressing -> Healthy

Scenariusz II – zmiana w kodzie aplikacji

Zmieniamy kod naszej aplikacji w index.php ew.Dockerfile i chcemy ją przetestować w aplikacji healthlog-gui-dev. Przyjmujemy, że będziemy używać wersji 1.0.2 i taki tag nadamy obrazowi.

# wrzucamy zmiany index.php do GitLab, mimo że obraz budujemy ręcznie ale warto mieć spójne źródło prawdy
cd /repo/git/healthlog-gui

# edycja
nano index.php

git add index.php Dockerfile
git commit -m "gui: change zmiana wyglądu"
git push

# zbuduj nowy obraz w DEV (OpenShift BuildConfig)
cd /repo/git/healthlog-gui
oc -n healthlog-helm-dev start-build healthlog-gui --from-dir=. --follow
oc -n healthlog-helm-dev tag healthlog-gui:latest healthlog-gui:1.0.2

# sprawdź ImageStream
oc -n healthlog-helm-dev get is healthlog-gui -o jsonpath='{range .status.tags[*]}{.tag}{"\n"}{end}'
1.0.2
latest

# zmieniamy tag tylko dla dev w kustomize/overlays/dev/values-dev.yaml
nano kustomize/overlays/dev/values-dev.yaml
...
image:
  # jeśli budujesz obraz w tym samym projekcie, najlepiej używać wewnętrznego registry
  repository: image-registry.openshift-image-registry.svc:5000/healthlog-helm-dev/healthlog-gui
  tag: 1.0.3
...

# zapisujemy, commit+push:
git add kustomize/overlays/dev/values-dev.yaml
git commit -m "dev: deploy image 1.0.3"
git push

Po kilku minutach następuje Out of sync, później sync i podłączenie nowego obrazu aplikacji.

Widać zmiany w kodzie czyli np. ostatnie 4 pozycje z tabeli oraz wersję 1.0.3 na dole i w polu Zmienne środowiskowe

Scenariusz III – ręczne usunięcie projektu

# ktoś nieopatrznie usuwa cały projekt
oc delete project healthlog-helm-dev

# zakładamy go wiec od nowa
oc new-project healthlog-helm-dev

# Nadaj ArgoCD uprawnienia do namespace DEV
# Teraz Argo będzie miał prawo tworzyć zasoby w healthlog-helm-dev
oc adm policy add-role-to-user admin \
  system:serviceaccount:argocd:argocd-application-controller \
  -n healthlog-helm-dev
  
# potrzebne do “exec/portforward”, ale do deploy zwykle nie
oc adm policy add-role-to-user admin \
  system:serviceaccount:argocd:argocd-server \
  -n healthlog-helm-dev

# sprawdzamy czy aplikacja DEV w Argo ma poprawny destination namespace. Powinno być: healthlog-helm-dev
oc -n argocd get app healthlog-gui-dev -o jsonpath='{.spec.destination.namespace}{"\n"}'
healthlog-helm-dev

# Dodaj label “managed-by” do namespace DEV
oc label ns healthlog-helm-dev argocd.argoproj.io/managed-by=argocd --overwrite

# Największy brak po skasowaniu projektu: BuildConfig/ImageStream
oc new-build --name=healthlog-gui --binary --strategy=docker -n healthlog-helm-dev
cd /repo/git/healthlog-gui
# Zbuduj obraz z repo na bastionie
oc -n healthlog-helm-dev start-build healthlog-gui --from-dir=. --follow
# Nadaj tag zgodny z values-dev.yaml , ostatni tag ręczny
oc -n healthlog-helm-dev tag healthlog-gui:latest healthlog-gui:1.0.3
oc -n healthlog-helm-dev get is healthlog-gui -o jsonpath='{range .status.tags[*]}{.tag}{"\n"}{end}'

Argo zwykle samo zobaczy brak zasobów i zrobi self-heal, ale żeby nie czekać:

oc -n argocd annotate app healthlog-gui-dev argocd.argoproj.io/refresh=hard --overwrite

Po dłuższej chwili sprawdzamy

oc -n healthlog-helm-dev get all

W razie błędu: Failed to load live state: namespace „healthlog-helm-dev” for Secret „secret-healthlog-gui” is not managed

oc label ns healthlog-helm-dev argocd.argoproj.io/managed-by=argocd --overwrite