EKS ALB weight routing Canary 배포 6단계

소프트웨어 개발의 동적인 세계에서, 무중단 배포를 달성하는 것은 매우 중요합니다. Canary 배포는 새로운 기능을 일부 사용자에게 점진적으로 노출시켜 위험을 최소화하는 방법입니다. AWS EKSALB weight routing 사용하여 ALB Canary 배포를 효과적으로 구현할 수 있습니다. 이 블로그에서는 EKS와 ALB를 이용한 Canary 배포 설정 방법을 안내합니다.

Canary 배포란?

Canary 배포는 새로운 소프트웨어 버전을 프로덕션에 도입할 때 발생할 수 있는 위험을 최소화하기 위한 기술입니다. 새로운 버전을 소수의 사용자(“카나리아”)에게 먼저 배포한 후, 성능과 안정성을 모니터링하여 전체 사용자에게 점진적으로 배포합니다.

사전 준비 사항

• 필요한 권한이 있는 AWS 계정

• 기존 EKS 클러스터

• AWS CLI 및 kubectl이 EKS 클러스터와 상호 작용하도록 구성

• Kubernetes 및 YAML 구성 파일에 대한 기본 지식

단계별 가이드

1단계: 타겟 서비스 생성

먼저, Kubernetes 클러스터 내에서 별도의 서비스로 실행되는 애플리케이션의 두 버전을 준비해야 합니다. 예를 들어, app-v1과 app-v2가 있다고 가정합니다.

app-v1.yaml:

apiVersion: v1
kind: Service
metadata:
  name: app-v1
spec:
  selector:
    app: my-app
    version: v1
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

app-v2.yaml:

apiVersion: v1
kind: Service
metadata:
  name: app-v2
spec:
  selector:
    app: my-app
    version: v2
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

2단계: 서비스 배포

두 버전의 애플리케이션을 배포합니다:

kubectl apply -f app-v1.yaml
kubectl apply -f app-v2.yaml

3단계: ALB weight routing Ingress 구성

가중 라우팅 주석이 포함된 Ingress 리소스를 생성합니다. 이 구성은 지정된 가중치에 따라 트래픽이 app-v1과 app-v2 사이에 분배되도록 합니다.

ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: canary-ingress
  annotations:
    alb.ingress.kubernetes.io/actions.weighted-routing: |
      {
        "Type": "forward",
        "ForwardConfig": {
          "TargetGroups": [
            {
              "ServiceName": "app-v1",
              "ServicePort": "80",
              "Weight": 80
            },
            {
              "ServiceName": "app-v2",
              "ServicePort": "80",
              "Weight": 20
            }
          ]
        }
      }
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:region:account-id:certificate/certificate-id
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/ssl-redirect: "443"
    alb.ingress.kubernetes.io/target-type: ip
    kubernetes.io/ingress.class: alb
spec:
  rules:
    - host: canary.yourdomain.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: weighted-routing
                port:
                  name: use-annotation

4단계: Ingress 구성 적용

Ingress 리소스를 배포합니다:

kubectl apply -f ingress.yaml

5단계: 설정 확인

1. DNS 구성: canary.yourdomain.com의 DNS가 ALB를 가리키는지 확인합니다.

2. 트래픽 분배: 모니터링 도구를 사용하여 트래픽이 80%는 app-v1으로, 20%는 app-v2로 전달되는지 확인합니다.

6단계: 새로운 버전에 대한 트래픽 점진적 증가

Ingress 구성에서 가중치를 조정하여 app-v2로의 트래픽을 점진적으로 증가시킵니다.

alb.ingress.kubernetes.io/actions.weighted-routing: |
  {
    "Type": "forward",
    "ForwardConfig": {
      "TargetGroups": [
        {
          "ServiceName": "app-v1",
          "ServicePort": "80",
          "Weight": 50
        },
        {
          "ServiceName": "app-v2",
          "ServicePort": "80",
          "Weight": 50
        }
      ]
    }
  }

업데이트된 구성을 적용합니다.

kubectl apply -f ingress.yaml

ALB Canary 배포 결론

EKS와 ALB를 이용한 가중 라우팅을 통한 Canary 배포는 새로운 소프트웨어 버전을 배포할 때 발생할 수 있는 위험을 최소화하는 강력한 방법입니다. 트래픽을 점진적으로 분배하여 새로운 기능을 안정적으로 검증하고 모니터링할 수 있습니다.

이 가이드를 따라 Kubernetes 환경에서 트래픽 분배를 효과적으로 관리하고 Canary 배포를 수행해 보세요. 성공적인 배포를 기원합니다!

참고 자료

AWS ALB Ingress Controller

Kubernetes Ingress Documentation

AWS EKS Documentation

다른 정보는 아래를 확인하세요.

Kubernetes EFK 설치 하는 3가지 방법