전공영역 공부 기록

EKS IPv6에서 ArgoCD 설치 방법

악분 2024. 3. 24. 21:53
반응형

1. EKS IPv6에서 ArgoCD를 설치한다는 의미는?

EKS IPv6는 pod와 service가 모두 IPv6 IP를 사용합니다. 따라서 ArgoCD도 IPv6 IP를 지원해야 ArgoCD pod 실행 오류가 없습니다.

 

2. ArgoCD와 EKS IPv6 설치 호환

24년 3월 기준 ArgoCD는 듀얼스택 VPC에서 생성이 가능합니다. 공식문서에서 IPv6 쿠버네티스에서는 실행이 불가능하다고 말하고 있습니다. 다행히 EKS IPv6는 듀얼스택(host-local설정으로 듀얼스택모드 실행)모드?이므로 ArgoCD는 EKS IPv6에서 정상적으로 실행됩니다.

참고자료: https://argo-cd.readthedocs.io/en/stable/operator-manual/high_availability/

 

3. 하지만 ArgoCD 설치 오류 발생

하지만, ArgoCD가 사용하는 redis ha-proxy pod는 IPv6에서 실행되지 않습니다.

 

그리고 오류가 redis pod로그를 보면 데이터 동기화 오류가 발생합니다.

 

4. 설치 오류 이유

ArgoCD가 사용하는 redis는 디폴트가 IPv4소켓을 사용합니다. IPv6환경에서는 IPv4소켓 bind작업을 할 수 없으니 오류가 발생했습니다.

참고자료: https://github.com/argoproj/argo-cd/blob/master/manifests/ha/base/redis-ha/chart/values.yaml

 

5. 오류 해결방법

설치 오류를 해결하는 방법은 redis가 IPv6소켓을 사용하도록 설정하면 됩니다. 소켓 bind를 0.0.0.0에서 [::]으로 변경해야 합니다. 저는 ArgoCD 설치를 kustomize를 사용하므로 kustomize patch기능을 사용했습니다.

 

kustomize patch 내용은 저의 github에 공개되어 있습니다.

 

kustomization.yaml파일 내용은 아래와 같습니다.

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd

resources:
- ./namespace.yaml
- https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml

patches:
# change redis-ha bind address from IPv4 to IPv6
- path: pathces/argocd-redis-ha-configmap-patch.yaml
  target:
    kind: ConfigMap
    name: argocd-redis-ha-configmap

 

patch하는 configmap내용은 아래와 같습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-redis-ha-configmap
data:
  redis.conf: |
    dir "/data"
    port 6379
    rename-command FLUSHDB ""
    rename-command FLUSHALL ""
    maxmemory 0
    maxmemory-policy volatile-lru
    min-replicas-max-lag 5
    min-replicas-to-write 1
    rdbchecksum yes
    rdbcompression yes
    repl-diskless-sync yes
    save ""
  sentinel.conf: |
    dir "/data"
    port 26379
    sentinel down-after-milliseconds argocd 10000
    sentinel failover-timeout argocd 180000
    maxclients 10000
    sentinel parallel-syncs argocd 5
  haproxy.cfg: |
    defaults REDIS
      mode tcp
      timeout connect 4s
      timeout server 6m
      timeout client 6m
      timeout check 2s

    listen health_check_http_url
      bind [::]:8888  v4v6
      mode http
      monitor-uri /healthz
      option      dontlognull
    # Check Sentinel and whether they are nominated master
    backend check_if_redis_is_master_0
      mode tcp
      option tcp-check
      tcp-check connect
      tcp-check send PING\r\n
      tcp-check expect string +PONG
      tcp-check send SENTINEL\ get-master-addr-by-name\ argocd\r\n
      tcp-check expect string REPLACE_ANNOUNCE0
      tcp-check send QUIT\r\n
      server R0 argocd-redis-ha-announce-0:26379 check inter 3s
      server R1 argocd-redis-ha-announce-1:26379 check inter 3s
      server R2 argocd-redis-ha-announce-2:26379 check inter 3s
    # Check Sentinel and whether they are nominated master
    backend check_if_redis_is_master_1
      mode tcp
      option tcp-check
      tcp-check connect
      tcp-check send PING\r\n
      tcp-check expect string +PONG
      tcp-check send SENTINEL\ get-master-addr-by-name\ argocd\r\n
      tcp-check expect string REPLACE_ANNOUNCE1
      tcp-check send QUIT\r\n
      server R0 argocd-redis-ha-announce-0:26379 check inter 3s
      server R1 argocd-redis-ha-announce-1:26379 check inter 3s
      server R2 argocd-redis-ha-announce-2:26379 check inter 3s
    # Check Sentinel and whether they are nominated master
    backend check_if_redis_is_master_2
      mode tcp
      option tcp-check
      tcp-check connect
      tcp-check send PING\r\n
      tcp-check expect string +PONG
      tcp-check send SENTINEL\ get-master-addr-by-name\ argocd\r\n
      tcp-check expect string REPLACE_ANNOUNCE2
      tcp-check send QUIT\r\n
      server R0 argocd-redis-ha-announce-0:26379 check inter 3s
      server R1 argocd-redis-ha-announce-1:26379 check inter 3s
      server R2 argocd-redis-ha-announce-2:26379 check inter 3s

    # decide redis backend to use
    #master
    frontend ft_redis_master
      bind [::]:6379 v4v6
      use_backend bk_redis_master
    # Check all redis servers to see if they think they are master
    backend bk_redis_master
      mode tcp
      option tcp-check
      tcp-check connect
      tcp-check send PING\r\n
      tcp-check expect string +PONG
      tcp-check send info\ replication\r\n
      tcp-check expect string role:master
      tcp-check send QUIT\r\n
      tcp-check expect string +OK
      use-server R0 if { srv_is_up(R0) } { nbsrv(check_if_redis_is_master_0) ge 2 }
      server R0 argocd-redis-ha-announce-0:6379 check inter 3s fall 1 rise 1
      use-server R1 if { srv_is_up(R1) } { nbsrv(check_if_redis_is_master_1) ge 2 }
      server R1 argocd-redis-ha-announce-1:6379 check inter 3s fall 1 rise 1
      use-server R2 if { srv_is_up(R2) } { nbsrv(check_if_redis_is_master_2) ge 2 }
      server R2 argocd-redis-ha-announce-2:6379 check inter 3s fall 1 rise 1
    frontend stats
      mode http
      bind [::]:9101 v4v6
      http-request use-service prometheus-exporter if { path /metrics }
      stats enable
      stats uri /stats
      stats refresh 10s
반응형

'전공영역 공부 기록' 카테고리의 다른 글

EKS IPv6 pod간 통신  (0) 2024.03.31
ExternalDNS로 Route53에 cname레코드 등록 방법  (0) 2024.03.29
EKS IPv6 VPC CNI 특징  (0) 2024.03.23
EKS IPv6 생성방법  (0) 2024.03.17
IPv6 소켓 프로그래밍  (0) 2024.03.17