K8s label란?

  • key value 형태로 구성하며 클러스터 안에 오브젝트를 만들 때 메타데이터로 설정할 수 있다.
  • key는 컨트롤러들이 Pod를 관리 할 때 자신이 관리해야 할 Pod를 구분하는 역할을 함
metadata:
  labels:
    rel: product
    name: mainui

https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/labels/

 

레이블과 셀렉터

레이블 은 파드와 같은 오브젝트에 첨부된 키와 값의 쌍이다. 레이블은 오브젝트의 특성을 식별하는 데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없다. 레이블로 오브

kubernetes.io

 

 

label 테스트

apiVersion: v1
kind: Pod
metadata:
  name: label-demo
  labels:
    environment: production
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

레이블 조회 및 key확인

  • # kubectl get pods --show-labels
  • # kubectl get pod -L app

 

레이블 추가 및 삭제

  • # kubectl label pod label-demo test=foo
    • test1=test1 test2=test2 test3=test3 형식으로 다수의 key-value 지정가능
  • # kubectl label pod label-demo test-
  • # kubectl label pod label-demo app=httpd --overwrite
    • 덮어쓰기

 

조건검색

  • # kubectl get pod -l 'env=prod,creation_method=manual'
    • -l 또는 --selector 사용가능
  • # kubectl delete pods --selector 'env=prod'

 

 

 

Node label

  • Worker Node의 특성을 Label로 설정
  • Worker Node의 특성을 고려하여 Pod를 선택적으로 배치 할 수 있다

 

 

Node label 테스트

  • # kubectl label nodes w1-k8s gpu=true disk=ssd
    • w1-k8s node에 gpu disk label 설정
  • #kubectl label nodes w2-k8s gpu=true
    • w2-k8s node에 gpu label 설정
  • #kubectl label nodes w3-k8s disk=ssd
    • w3-k8s node에 disk label 설정

 

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: node-selector-test
  name: node-selector-test
spec:
  containers:
  - image: nginx
    name: webserver
    ports:
    - containerPort: 80
  nodeSelector:
    gpu: "true"
    disk: ssd

  • nodeSelector에 의해서 설정 된 label이 있는 node가 선택된다

 

 

 

Annotation이란?

  • label과 동일하게 key-value 쌍으로 사용자가 설정 할 수 있다
  • k8s에게 특정 정보를 전달할 용도로 사용
  • 관리를 위해 필요한 정보를 기록할 용도로 사용
    • 릴리즈, 로깅, 모니터링에 필요한 정보들을 기록
annotations:
  builder: "jaon"
  buildDate: "20220331"
  imageRepository: https://xxx.com/"

 

 

Annocation 테스트

apiVersion: v1
kind: Pod
metadata:
  name: annotation-test
  annotations:
    image-registry: "https://hub.docker.com/"
spec:
  containers:
  - image: nginx
    name: annotation-test
    ports:
    - containerPort: 80

 

 

 

Canary Deployment

  • 블루 그린 업데이트
    • 기존에 실행된 Pod의 개수와 같은 개수의 신규 Pod를 모두 실행한 후 신규 Pod가 정상적으로 실행됐는지 확인한 이후 트래픽을 한꺼번에 신규 파드 쪽으로 옮김
    • downtime이 발생함.
  • 롤링 업데이트
    • 배포된 전체 Pod를 한꺼번에 교체하지 않고 일정 개수씩 교체하면서 배포
    • 서비스 중단없이 업데이트하는 방식
  • 카나리 업데이트
    • 기존 버전을 유지한 채로 일부 버전만 신규 Pod로 교체하고 버그나 이상이 없는지 확인

 

 

Canary 배포 테스트

apiVersion: v1
kind: Service
metadata:
  name: mainui-svc
spec:
  selector:
    app: mainui
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mainui-stable
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mainui
      version: stable
  template:
    metadata:
      labels:
        app: mainui
        version: stable
    spec:
      containers:
      - name: mainui
        image: nginx:1.14
        ports:
        - containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mainui-canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mainui
      version: canary
  template:
    metadata:
      labels:
        app: mainui
        version: canary
    spec:
      containers:
      - name: mainui
        image: nginx:1.15
        ports:
        - containerPort: 80
  • label을 통해서 기존에 구동중인 service에 canary버전을 단일진입점으로 포함시켜서 canary버전을 검증한다
    • canary버전에 문제가 없다면 기존 stable버전의 deployment를 삭제하여 canary버전으로 서비스를 할 수 있다
      • 기존 서비스에 영향을 끼치지 않고 서비스가 가능하다

'클라우드 > K8s' 카테고리의 다른 글

K8s 애플리케이션 변수관리  (0) 2022.03.17
K8s Self-healing  (0) 2022.03.17
K8s Network  (0) 2022.03.17
K8s Controller  (0) 2022.03.17
K8s namespaces  (0) 2022.03.17

+ Recent posts