Konfiguracja argocd z klastrem redisa

0

Cześć,
mam wystawiony klaster redisa (jako serwisy zdjęcie na dole jak to wygląda) i próbuję go podłączyć pod helm chart argocd, niestety da się tam wpisać jeden adres ip (po wpisaniu adresu Master A działa, są wrzucane dane na Master A i leci replikacja na Slave A. Macie jakiś pomysł jak podpiąć cały klaster, żeby na każdy master zapisywał dane i replikował je na slave? Może jakiś LB,proxy przed tym ma stać? albo inna konfiguracja typu 1x master 3x slave?
screenshot-20240702131929.png

0

Co to znaczy, że masz wystawiony klaster redisa? Chcesz wykorzystać jakąś współdzieloną instancję klastra do argocd?

  1. Tego redisa to masz w trybie HA czy w trybie cluster mode?
  2. Jeśli w trybie cluster mode, to klient klastra redisowego musi mieć świadomość, że pracuje z klastrem. Możliwe, że argocd jeszcze nie wspiera (https://github.com/argoproj/argo-cd/pull/14001)
  3. Jeśli w trybie HA, to argocd powinien ogarnąć via redis sentinel.

Czy Twoim celem jest deployment argocd w trybie HA, czy może celem jest wykorzystanie istniejącego klastra redisowego? Co chcesz osiągnąć?

0

Aktualnie mam postawione argocd z redisem (po kilka replik dla argo i redisa) na klastrze HA k8s. Helm chart https://github.com/argoproj/argo-helm/blob/main/charts/argo-cd/values.yaml pozwala wybrać albo redis-ha (teraz go używam) w klastrze k8s albo externalRedis). Chcę wykorzystać właśnie ten externalRedis, który i tak będzie mi potrzebny jeszcze do innych rzeczy więc chciałem go spróbować połączyć również z argo. I się zastanawiam jaką konfigurację redisa przyjąć, aktualnie mam w configu redisa włączone cluster-enabled yes (tutaj myślałem że cluster-enabled yes = HA) no i ten klaster jest skonfigurowany żeby działał tak jak na zdjęciu powyżej. I problem jest w tym, że w argocd w tej konfiguracji externalRedis nie mogę podać kilka adresów ip dla każdego mastera. Odpowiadając na twoje pytanie moim celem jest wykorzystanie istniejącego klastra redisa i podpięcie go pod argocd. Jeżeli się nie da w takiej konfiguracji co mam teraz to może masz jakiś pomysł jak inaczej do tego podejść?

# External Redis parameters
externalRedis:
  # -- External Redis server host
  host: ""
  # -- External Redis username
  username: ""
  # -- External Redis password
  password: ""
  # -- External Redis server port
  port: 6379
  # -- The name of an existing secret with Redis (must contain key `redis-password`) and Sentinel credentials.
  # When it's set, the `externalRedis.password` parameter is ignored
  existingSecret: ""
  # -- External Redis Secret annotations
  secretAnnotations: {}
1

redis ha != redis cluster mode i jeśli Twój exsternalRedis to cluster, to argocd jeszcze tego nie wspiera (podlinkowany pull request do argocd).
Gdybyś miał Redis HA, to będziesz miał też redis sentinel i wówczas można się pokusić i próbę konfiguracji, tak by argocd łączyło się via sentinele.

W sekrecie dla redisa masz na to przewidziane osobne propertiesy.

   - name: REDIS_USERNAME
            valueFrom:
              secretKeyRef:
                name: {{ default "argocd-redis" .Values.externalRedis.existingSecret }}
                key: redis-username
                optional: true
          - name: REDIS_PASSWORD
            valueFrom:
              secretKeyRef:
                name: {{ default "argocd-redis" .Values.externalRedis.existingSecret }}
                optional: true
                {{- if .Values.externalRedis.host }}
                key: redis-password
                {{- else }}
                key: auth
                {{- end }}
          - name: REDIS_SENTINEL_USERNAME
            valueFrom:
              secretKeyRef:
                name: {{ default (include "argo-cd.redis.fullname" .) .Values.externalRedis.existingSecret }}
                key: redis-sentinel-username
                optional: true
          - name: REDIS_SENTINEL_PASSWORD
            valueFrom:
              secretKeyRef:
                name: {{ default (include "argo-cd.redis.fullname" .) .Values.externalRedis.existingSecret }}
                key: redis-sentinel-password
                optional: true

Dla argocd-application-controller, argocd-repo-server, argocd-server mógłbyś skorzystać z extraArgs: [] i tam przekazać namiary na sentinele i wskazać mastera:

extraArgs:
    - --redis
    - --redis-sentinel=twoj-sentinel1:26379
    - --redis-sentinel=twoj-sentinel2:26379
    - --redis-sentinel=twoj-sentinel3:26379
    - --redis-sentinel-master=nazwa-twojeo-mastera
0

Widzę, że ten sentinel też łapie się pod wersję community to pewnie przetestuję go.

0

Ok, postawiłem klaster ha z sentinelem, sprawdziłem działa. (https://docs.vultr.com/set-up-high-availability-redis-using-sentinel-in-ubuntu)
Dodałem taki config, zmieniony bo przy komendach --redis-sentinel wyskakiwał CrashLoopBackOff przez złą komendę. Przy tej na dole pody się odpalają.

extraArgs:
    - --sentinel=twoj-sentinel1:26379
    - --sentinel=twoj-sentinel2:26379
    - --sentinel=twoj-sentinel3:26379
    - --sentinelmaster=nazwa-twojeo-mastera

Taki secret (na redis master utworzyłem użytkownika z hasłem i wpisałem do secretu, na pierwszym sentinel tak samo utworzony i wpisany w secret, pytanie czy tego użytkownika trzeba utworzyć wszędzie czy na master wystarczy)

apiVersion: v1
kind: Secret
metadata:
  name: secret-sa-sample
  namespace: argocd
type: Opaque
data:
  REDIS_USERNAME: haslo w base64
  REDIS_PASSWORD: haslo w base64
  REDIS_SENTINEL_USERNAME: haslo w base64
  REDIS_SENTINEL_PASSWORD: haslo w base64

Natomiast teraz jakby nie mógł się połączyć
Failed to resync revoked tokens. retrying again in 1 minute: NOAUTH Authentication required.

Zastanawiam się czy nie odpuścić przez słabe wsparcie ze strony argo i pozostać przy internal redisie w klastrze k8s.

1

Ok, zadziałało trzeba było inne klucze w sekrecie podać, nie spojrzałem na key wcześniej.

apiVersion: v1
kind: Secret
metadata:
  name: secret-sa-sample
  namespace: argocd
type: Opaque
data:
  redis-username: haslo w base64
  redis-password: haslo w base64
  redis-sentinel-username: haslo w base64
  redis-sentinel-password: haslo w base64
extraArgs:
    - --sentinel=twoj-sentinel1:26379
    - --sentinel=twoj-sentinel2:26379
    - --sentinel=twoj-sentinel3:26379
    - --sentinelmaster=nazwa-twojeo-mastera
# External Redis parameters
externalRedis:
  # -- External Redis server host
  host: "ip hosta"
  # -- External Redis username
  username: ""
  # -- External Redis password
  password: ""
  # -- External Redis server port
  port: 6379
  # -- The name of an existing secret with Redis (must contain key `redis-password`) and Sentinel credentials.
  # When it's set, the `externalRedis.password` parameter is ignored
  existingSecret: "secret-sa-sample"

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.