EKS + Fargate에서 ArgoCD 사용

이번 포스트에서는 기존 EKS 클러스터에서 ArgoCD를 사용하는 방법에 대해 설명하겠습니다.

I will not go through all the steps required to configure ArgoCD, but some troubles I encountered.



ArgoCD의 이 문서documentation는 ArgoCD를 Kubernetes 클러스터에 설치하고 애플리케이션을 동기화(배포)하는 방법에 대한 모든 정보를 제공합니다.

그러나 Fargate를 사용하는 EKS에서 ArgoCD API 서버에 액세스하려고 할 때 몇 가지 문제가 발생했습니다.

Fargate 포드는 프라이빗 서브넷 내에서만 시작할 수 있으므로 Kubernetes Ingress를 사용하여 외부 세계의 요청을 실제 포드로 라우팅해야 합니다. 그리고 AWS Load-Balancer-Controller 애드온을 사용하면 Kubernetes Ingress를 생성할 때 대신 AWS Application Load Balancer를 프로비저닝하여 프론티어의 모든 요청을 수락합니다.

You can install AWS Load-Balancer-Controller add-on following this documentation.



ArgoCD와 AWS Load-Balancer-Controller 추가 기능을 모두 EKS 클러스터에 설치하면 ArgoCD API 서버에 연결할 수 없습니다. 이는 ArgoCD API 서버를 실행하는 포드가 포트 8080을 사용하여 노출되고 포드에 연결된 보안 그룹이 기본적으로 8080의 인바운드 요청을 수락하지 않기 때문입니다. 이로 인해 대상 그룹에서 ALB의 상태 확인이 실패합니다.

따라서 ArgoCD API 서버 포드에 대한 새 보안 그룹을 정의하고 적용해야 합니다.

이렇게 하려면 this documentation을 따르기만 하면 됩니다.

Pod에 연결할 새 보안 그룹은 아래 요구 사항을 충족해야 합니다.
  • EKS 클러스터의 보안 그룹에서 포트 53(TCP)에 대한 인바운드 요청을 허용합니다.
  • EKS 클러스터의 보안 그룹에서 포트 53(UDP)에 대한 인바운드 요청을 허용합니다.
  • 포트 8080(TCP)에서 인바운드 요청을 허용합니다.

  • 새로운 보안 그룹을 생성하고 아래 yaml 파일을 적용해 봅시다.

    # argocd-pod-sg-policy.yaml
    apiVersion: vpcresources.k8s.aws/v1beta1
    kind: SecurityGroupPolicy
    metadata:
      name: argo-sgp
      namespace: argocd
    spec:
      podSelector:
        matchLabels:
          app.kubernetes.io/name: argocd-server
      securityGroups:
        groupIds:
          - ${NEW_CREATED_SECURITY_GROUP_ID}
          - ${EKS_CLUSTER_SECURITY_GROUP_ID}
    


    위의 yaml 파일을 적용하고 새로운 SecurityGroupPolicy를 생성해 봅시다. 또한 이 새로운 SecurityGroupPolicy는 이미 실행 중인 포드에 적용되지 않으므로 모든 ArgoCD API 서버 포드를 다시 시작해야 합니다.

    kubectl delete --all pod -n argocd
    


    마지막으로 새로운 AWS Application Load Balancer를 프로비저닝할 Kubernetes Ingress를 정의해 보겠습니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: argocd-ingress
      namespace: argocd
      annotations:
        alb.ingress.kubernetes.io/load-balancer-name: argocd-alb
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/target-type: ip
        alb.ingress.kubernetes.io/subnets: ${PUBLIC_SUBNET_IDS}
        alb.ingress.kubernetes.io/certificate-arn: ${ACM_CERT_ARN}
        alb.ingress.kubernetes.io/security-groups: ${ALB_SECURITY_GROUP}
        alb.ingress.kubernetes.io/backend-protocol: HTTPS
        alb.ingress.kubernetes.io/conditions.argogrpc: |
          [{"field":"http-header","httpHeaderConfig":{"httpHeaderName": "Content-Type", "values":["application/grpc"]}}]
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    spec:
      ingressClassName: alb
      rules:
      - host: dev-argocd.planit-study.com
        http:
          paths:
          - path: /
            backend:
              service:
                name: argogrpc
                port:
                  number: 443
            pathType: Prefix
          - path: /
            backend:
              service:
                name: argocd-server
                port:
                  number: 443
            pathType: Prefix
    


    위의 yaml 파일에서 argogrpc라는 서비스를 사용했습니다.
    ArgoCD API 서버는 gRPC와 HTTP/HTTPS 모두에서 실행됩니다.
    gRPC는 ArgoCD CLI의 요청을 처리하는 데 사용되고 HTTP/HTTPS는 UI(웹) 요청에 사용됩니다.

    gRPC 요청만 제공하는 새 서비스를 만드는 것이 이상적이므로 ArgoCD 설명서에도 있는 서비스를 만들어 보겠습니다.

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        alb.ingress.kubernetes.io/backend-protocol-version: HTTP2
      labels:
        app.kubernetes.io/name: argocd-server
      name: argogrpc
      namespace: argocd
    spec:
      ports:
      - name: "443"
        port: 443
        protocol: TCP
        targetPort: 8080
      selector:
        app.kubernetes.io/name: argocd-server
      sessionAffinity: None
      type: NodePort
    


    이제 CLI와 웹(UI)을 통해 ArgoCD API 서버에 성공적으로 액세스할 수 있습니다! 그리고 그게 다야! 이 포스팅이 도움이 되셨으면 합니다 :)

    좋은 웹페이지 즐겨찾기