Java-Bom / ReadingRecord

📚 책 읽고 정리하기 📚
https://javabom.tistory.com/category/Reading%20Record
473 stars 27 forks source link

[9] 레이블과 애너테이션 #225

Closed csbsjy closed 3 years ago

csbsjy commented 3 years ago

레이블

셀렉터와 함께 특정 레이블이 있는 자원들을 선택할 때 사용 포맷: [key: value 형식] ex) name: nginx-app

활용케이스

  1. 서비스 중인 특정 파드에 문제가 생겼을 때 이슈가 생긴 파드의 레이블만 변경하여(서비스의 타겟이 되지 않도록 하여) 분리해서 확인할 수 있다.
  2. 노드에도 레이블 설정이 가능하기 때문에 클러스터의 자원 할당을 할 때 노드 레이블을 기준으로 할 수 있다.

레이블 규칙

  1. 63글자 이하
  2. 시작과 끝은 알파벳 대소문자 및 숫자
  3. 중간에는 대시, 밑줄, 점, 숫자가 올 수 있음

접두어가 있는 레이블

/를 기준으로 접두어를 둘 수 있는데 일반적으로 사용자 레이블에선 쓰이지 않고 쿠버네티스 시스템이 사용하는 레이블에 사용된다.

ex) kubernetes.io/

레이블 셀렉터

등호기반 셀렉터(=, ==, !=), 집합기반 셀렉터(notin, in, exist, !), !

AND 연산(,로 연결)

애너테이션: 주석성격의 메타데이터를 기록할 때 사용

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        environment: develop # label 추가 
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    environment: develop # label selector 
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

아래처럼 -l 조건으로 특정 레이블에 속한 파드만 얻어올 수 있다.

kubectl get pods -l environment=develop 

애너테이션

주석 성격의 메타데이터를 기록하는데 사용

Ex) 릴리즈 정보, 로깅, 모니터링에 필요한 정보들, 담당자 등등

apiVersion: v1
kind: Pod
metadata:
  name: annotations-demo
  annotations: # 주석성격의 애너테이션 
    imageregistry: "https://hub.docker.com/"
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
kubectl describe pod annotaion 

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: javabom-myapp
  labels:
    app: myapp
    version: stable # stable(기존버전)
spec:
  replicas: 3 # 3개 배포 
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.14.2
        ports:
        - containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: javabom-myapp
  labels:
    app: myapp
    version: canary # canary(신규버전)
spec:
  replicas: 1 # 1개 배포 
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.14.3 # 버전업
        ports:
        - containerPort: 80

이렇게 두 디플로이먼트의 레이블을 지정한 뒤

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 30880
      targetPort: 80

서비스에서 두 디플로이먼트의 공통 레이블인 myapp 을 지정하면 동시에 구버전/신규버전을 서비스 할 수 있다.

신규버전이 확인되어 구버전을 제거하거나 신규버전에 문제가 생긴다면 replica 갯수를 0으로 조정할 수 있다.

배포그림 참고: https://www.weave.works/blog/kubernetes-deployment-strategies