05-15 08:39
Recent Posts
Recent Comments
관리 메뉴

miinsun

[이론] 쿠버네티스 레이블과 애너테이션 본문

Infra/Kubernetes

[이론] 쿠버네티스 레이블과 애너테이션

miinsun 2023. 6. 14. 13:00

유튜브 강의 '따배쿠'와 책 '쿠버네티스 입문'을 정리한 자료입니다.


레이블과 애너테이션은 그 자체의 의미는 유사한 것 같지만, 이둘이 작용하는 역할이 다르기 때문에 상황에 맞게 적절히 구분하여 사용해야한다.

📌 Kubernetes Label

쿠버네티스의 레이블은 selector와 함께 특정 레이블이 있는 자원들을 선택할 때 주로 사용된다.

레이블은 쿠버네티스 안에서 사용자가 오브젝트를 생성할 때 해당 오브젝트를 구분하는 용도이다. 사용자가 임의로 원하는 값을 지정해서 사용이 가능하다.

레이블은 키-값 쌍으로 구성된다.
레이블의 키는 쿠버네팉스 안에서 컨트롤러들이 파드를 관리 할 때 관리해야 할 파드를 구분해주는 역할을 한다.

- 유의 사항
1. 63 글자를 넘지 않아야 함
2. 시작과 끝 문자는 알파벳 대소문자 및 숫자여야 함
3. 중간에는 대시(-), 밑줄(_), 점(.), 숫자 등이 올 수 있음
4. 레이블 키 이름 앞에는 / 로 구분해서 접두어를 사용할 수 있다.

 


📌 Kubernetes Annotation

쿠버네티스의 애너테이션은 주석 성격의 메타데이터를 기록하는데 사용된다. 애너테이션은 레이블처럼 사용자가 원하는 값을 설정하다기보다는 쿠버네티스 시스템에서 필요한 정보들을 표시하는데 사용된다.

애너테이션의 키는 쿠버네티스 시스템이 인식할 수 있는값을 사용한다. 또한 인그레스에서 필요한 설정을 애너테이션으로 정의할 수 있다. ingress-nginx 같은 인그레스 컨트롤러는 애너테이션으로 사용자가 직접 nginx에 필요한 설정들을 정의할 수 있다.

 

 


📌 레이블을 이용한 카나리 배포

포드를 업데이트하는 방법

  1. 블루 그린 업데이트
    • 기존에 실행된 파드 개수와 같은 개수의 신규 파드를 모두 실행한 뒤, 신규 파드가 정상적으로 실행되는 것이 확인되면 그 후 트래픽을 한꺼번에  신규 파드 쪽으로 옮기는 방식
  2. 카나리 업데이트
    • 신규 파드를 배포할 때 한꺼번에 앱 컨테이너 전체를 교체하지 않고, 기존 버전을 유지한 채로 일부 버전만 신규 파드로 교체하며 버그나 이상이 있는지, 사용자의 반응은 어떤지 확인하는 방식
  3. 롤링 업데이트
    • 배포된 전체 파드를 한꺼번에 교체하는 것이 아니라 일정 개수씩 교체하면서 배포하는 방식

 

안정 버전 디플로이먼트 설정 (stable.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-testapp
  labels: 
    app: myapp
    version: stable
  spec:
    replicas: 2
    selector:
      matchLabels:
        app: myapp
        version: stable
    template:
      metadata:
        labels:
          app: myapp
          version: stable
      spec:
        containers:
        - name: testapp
          image: arisu1000/simple-container-app::v0.1
          ports:
          - containerPort: 8000

 

카나리 배포 버전 디플로이먼트 설정 (canart.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-testapp-canary
  labels: 
    app: myapp
    version: canary
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: myapp
        version: stable
    template:
      metadata:
        labels:
          app: myapp
          version: stable
      spec:
        containers:
        - name: testapp
          image: arisu1000/simple-container-app::v0.2
          ports:
          - containerPort: 8000

 

레이블을 이용해서 안정성있는 stable 버전과 카나리 배포에 필요한 canary 버전을 구분해 주었다.

다음으로 2개의 deploymet에 접근하는 서비스를 만들어주자.

apiVersion: v1
kind: Service
metadata:
  labels: 
    app: myapp
  name: myapp-svc
  namespace: default
spec:
  ports:
  - nodePort: 30880
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: myapp
  type: NodePort

 

curl localhost:30880 명령을 계속해서 입력하면

v0.1과 v0.2 앱 컨테이너를 번걸아 가면서 접속함을 확인 할 수 있다. 즉 여러 개 디플로이먼트를 하나의 접속 주소로 묶어 여러 버전을 동시에 서비스한다는 것이다. 이렇게 기존 버전과 신규 버전이 함께 존재하므로 카나리 형태의 배포를 만들 수 있었다.

카나리 버전이 정상적으로 동작하지 않는다면 canary deploymet를 삭제해 서비스에서 제외하면 된다.

 

Comments