데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Argo Rollout이 Pod를 연결하는 방법

      seungkyua 21.06.16
      3,984 6 0

      Argo Rollout 은 new version pods 와 old version pods 를 어떻게 구분하는 것일까? Rollout 리소스로 생성하면 ReplicaSet 의 형태인 Pod 템플릿 영역인 (spec.template) 과 동일하다. 즉 ReplicaSet 이 Selector 로 지정한 label 로 Pod 를 찾아가는 것이다.

      아래 Rollout 1개와 Service 2개를 가지는 sample yaml 파일을 배포하여 동작 방법을 살펴보자.

      apiVersion: argoproj.io/v1alpha1
      kind: Rollout
      metadata:
        name: rollout-bluegreen
      spec:
        replicas: 2
        revisionHistoryLimit: 2
        selector:
          matchLabels:
            app: rollout-bluegreen
        template:
          metadata:
            labels:
              app: rollout-bluegreen
          spec:
            containers:
            - name: rollouts-demo
              image: argoproj/rollouts-demo:blue
              imagePullPolicy: Always
              ports:
              - containerPort: 8080
        strategy:
          blueGreen:
            activeService: rollout-bluegreen-active
            previewService: rollout-bluegreen-preview
            autoPromotionEnabled: false
      
      ---
      kind: Service
      apiVersion: v1
      metadata:
        name: rollout-bluegreen-active
      spec:
        selector:
          app: rollout-bluegreen
        ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      
      ---
      kind: Service
      apiVersion: v1
      metadata:
        name: rollout-bluegreen-preview
      spec:
        selector:
          app: rollout-bluegreen
        ports:
        - protocol: TCP
          port: 80
      

      Rollout 은 strategy 만 제외하면 ReplicaSet 혹은 Deployment 와 동일하다. 그래서 Rollout 을 배포하면 ReplicaSet 과 Pod 는 Kubernetes Core Resource 타입으로 동일하게 생성되고 조회할 수 있다.

      .spec.selector.matchLabels 와 .spec.template.metadata.labels 에서 지정한 label 은 동일해야 한다. 이 부분은 ReplicaSet 에서 요구하는 spec 과 같다.

      strategy 의 blueGreen 에는 rollout-bluegreen-active 와 rollout-bluegreen-preview 라는 service 가 2개가 지정되어 있다. Service 는 DNS 명 처럼 이름으로 IP 를 매칭하는 값을 가지는 기능과 Pod 를 연결하여 load balancing 해주는 대표적인 기능이 있다. rollout-bluegreen-active Service 에는 selector 로 "app: rollout-bluegreen" 값이 지정되어 있는데 이는 Rollout Template 에서 지정된 Pod 의 labels 를 가리킨다.

      그런데 rollout-bluegreen-active Service 와 rollout-bluegreen-preview 2개 모두 같은 selector 로 같은 Pod 를 보고 있는데 어떻게 new version 과 old version 을 구분할까?

      배포한 후에 설정들이 어떻게 바뀌는지 살펴보자.

      $ kubectl apply -f rollout-blue-green.yaml
      $ kubectl argo rollouts get rollout rollout-bluegreen --watch
      

      rollout 명이 rollout-bluegreen-[해시코드값] 으로 되어 있는데 여기서 해시코드 값이 6565b74f44 은 ReplicaSet 의 해시코드와 동일하다.

      $ kubectl get rs rollout-bluegreen
      

       

       

      이 해시코드 값은 Service 에서도 찾아 볼 수 있다.

      $ kubectl get svc rollout-bluegreen-active -o yaml
      ...
      apiVersion: v1
      kind: Service
      metadata:
        name: rollout-bluegreen-active
        namespace: default
      spec:
        clusterIP: 10.233.59.133
        clusterIPs:
        - 10.233.59.133
        ports:
        - port: 80
          protocol: TCP
          targetPort: 8080
        selector:
          app: rollout-bluegreen
          rollouts-pod-template-hash: 6565b74f44
        sessionAffinity: None
        type: ClusterIP
      ...
      

      selector 의 label 에 자동으로 rollouts-pod-template-hash: 6565b74f44 이 추가되어 rollout-bluegreen-active Service 는 현재 version 의 rollout 으로 생성된 Pod 를 가리키는 것을 알 수 있다.

      이제 이미지를 업데이트 하여 upgrade 배포를 해보자.

      $ kubectl argo rollouts set image rollout-bluegreen rollouts-demo=argoproj/rollouts-demo:yellow
      $ kubectl argo rollouts get rollout rollout-bluegreen --watch
      

       

       

       

      revision:2 아래에 rollout-bluegreen-6b5dc99488 이라는 새로운 해시코드 값으로 ReplicaSet 이 생성되었다.

      rollout-bluegreen-preview Service 의 selector 로 지정된 labels 을 보면 rollouts-pod-template-hash:6b5dc99488 가 생성되어 new version 의 pod 를 가리키는 것을 알 수 있다.

      $ kubectl get svc rollout-bluegreen-preview -o yaml
      ...
      apiVersion: v1
      kind: Service
      metadata:
        name: rollout-bluegreen-preview
        namespace: default
      spec:
        clusterIP: 10.233.44.227
        clusterIPs:
        - 10.233.44.227
        ports:
        - port: 80
          protocol: TCP
          targetPort: 80
        selector:
          app: rollout-bluegreen
          rollouts-pod-template-hash: 6b5dc99488
        sessionAffinity: None
        type: ClusterIP
      ...
      

      배포를 완료하고 ReplicaSet 을 조회해 보면 이전 해시코드 값을 갖는 ReplicaSet 의 DESIRED, CURRENT, READY 가 0 으로 세팅되어 있는 것을 알 수 있다.

      $ kubectl argo rollouts promote rollout-bluegreen
      $ kubectl get rs -l app=rollout-bluegreen
      NAME                           DESIRED   CURRENT   READY   AGE
      rollout-bluegreen-6565b74f44   0         0         0       5h35m
      rollout-bluegreen-6b5dc99488   2         2         2       10m
      

       

      이 방식을 응용하면 Deployment 로도 쉽게 배포 전략을 활용할 수 있다.

       

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      seungkyua 님의 최신 블로그

      더보기
      동영상 기고하기