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?
Co to znaczy, że masz wystawiony klaster redisa? Chcesz wykorzystać jakąś współdzieloną instancję klastra do argocd?
- Tego redisa to masz w trybie HA czy w trybie cluster mode?
- 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)
- 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ąć?
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: {}
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
Widzę, że ten sentinel też łapie się pod wersję community to pewnie przetestuję go.
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.
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"