반응형
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에서 정상적으로 실행됩니다.
3. 하지만 ArgoCD 설치 오류 발생
하지만, ArgoCD가 사용하는 redis ha-proxy pod는 IPv6에서 실행되지 않습니다.
그리고 오류가 redis pod로그를 보면 데이터 동기화 오류가 발생합니다.
4. 설치 오류 이유
ArgoCD가 사용하는 redis는 디폴트가 IPv4소켓을 사용합니다. IPv6환경에서는 IPv4소켓 bind작업을 할 수 없으니 오류가 발생했습니다.
5. 오류 해결방법
설치 오류를 해결하는 방법은 redis가 IPv6소켓을 사용하도록 설정하면 됩니다. 소켓 bind를 0.0.0.0에서 [::]으로 변경해야 합니다. 저는 ArgoCD 설치를 kustomize를 사용하므로 kustomize patch기능을 사용했습니다.
kustomize patch 내용은 저의 github에 공개되어 있습니다.
- gitub링크: https://github.com/choisungwook/aws_ipv6/blob/main/kubernetes_manifests/argocd/kustomization.yaml
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 |