서론

EKS 환경에서 GitOps를 구현하기 위한 도구인 ArgoCD의 설치 과정을 다룹니다. Kustomize를 통해 Helm Chart를 래핑하여 활용하는 방법을 다룹니다.

본 포스트에서 사용되는 설정 파일과 샘플 코드는 다음 레포지토리에서 확인하실 수 있습니다 Github 링크

설치 환경

  • EKS Cluster
  • Istio Service Mesh
  • Amazon ElastiCache (Valkey 8.2)

ArgoCD 설치 (Kustomize + Helm)

ArgoCD를 보다 선언적으로 관리하기 위해 ./argocd 디렉토리에 Kustomize 설정을 구성했습니다. 이 방식은 Helm Chart의 유연함과 Kustomize의 구조적 관리 장점을 동시에 가져갈 수 있습니다.

1. 프로젝트 구조

argocd/
├── kustomization.yaml
├── namespace.yaml
├── values.yaml
├── gateway.yaml
└── virtual-service.yaml

2. Kustomize 및 Namespace 설정

먼저 Namespace에 Istio 사이드카 주입을 위한 레이블을 추가하고, kustomization.yaml에서 Helm Chart를 정의합니다.

namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: argocd
  labels:
    istio-injection: enabled

kustomization.yaml

namespace: argocd
resources:
  - namespace.yaml
  - gateway.yaml
  - virtual-service.yaml

helmCharts:
  - name: argo-cd
    repo: https://argoproj.github.io/argo-helm
    version: 9.2.3
    releaseName: argocd
    valuesFile: values.yaml

3. values.yaml

환경을 고려하여 알맞게 구성해주시면 됩니다.

global:
  domain: argocd.domain.com

controller:
  replicas: 1

server:
  replicas: 1
  autoscaling:
    enabled: true
    minReplicas: 1
  service:
    type: ClusterIP

configs:
  params:
    server.insecure: true # ALB에서 TLS를 처리하므로 내부 통신은 insecure 설정

redis:
  enabled: false # ElastiCache valkey 사용으로 자체 Redis 비활성화

externalRedis:
  host: valkey.example.cache.amazonaws.com
  port: 6379

4. 설치 실행

Kustomize를 빌드하여 클러스터에 적용합니다.

kubectl apply -k ./argocd

Istio manifests

Istio 환경을 기준으로 작성하여 GatewayVirtualService를 설정했습니다.

gateway.yaml

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: argocd-gateway
  namespace: argocd
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - argocd.domain.com

virtual-service.yaml

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: argocd-server
  namespace: argocd
spec:
  gateways:
    - argocd-gateway
  hosts:
    - argocd.domain.com
  http:
    - route:
        - destination:
            host: argocd-server
            port:
              number: 80

핵심 고도화 전략 요약

1. Helm Chart & Kustomize 융합

  • Helm의 values.yaml을 통해 복잡한 차트 설정을 관리하면서, Kustomize의 resources 기능을 통해 Namespace, Gateway 등 추가 리소스를 깔끔하게 병합했습니다.

2. Redis를 Valkey(v8.2)로 교체

  • ArgoCD 내부 Redis 대신 AWS ElastiCache Valkey 클러스터를 활용하여 성능과 안정성을 높였습니다. externalRedis 설정을 통해 손쉽게 전환이 가능합니다.

3. Istio 통합 및 보안

  • istio-injection: enabled 레이블을 통해 ArgoCD 컴포넌트 간 통신을 서비스 메쉬 내에서 보호합니다.
  • server.insecure: true 설정을 통해 Istio Gateway 단계에서 종료되는 TLS 이후의 내부 통신 효율을 최적화했습니다.

접속 및 확인

1. 초기 비밀번호 조회

설치 직후 admin 계정의 초기 비밀번호는 아래 명령어로 확인할 수 있습니다.

kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d

다음 편에서는 이렇게 구축된 ArgoCD에 실제 리포지토리와 외부 클러스터를 연결하는 전략을 다룹니다.