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

- # 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버전으로 서비스를 할 수 있다
- 기존 서비스에 영향을 끼치지 않고 서비스가 가능하다
- 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 |