miinsun
[이론] 쿠버네티스 레이블과 애너테이션 본문
유튜브 강의 '따배쿠'와 책 '쿠버네티스 입문'을 정리한 자료입니다.
레이블과 애너테이션은 그 자체의 의미는 유사한 것 같지만, 이둘이 작용하는 역할이 다르기 때문에 상황에 맞게 적절히 구분하여 사용해야한다.
📌 Kubernetes Label
쿠버네티스의 레이블은 selector와 함께 특정 레이블이 있는 자원들을 선택할 때 주로 사용된다.
레이블은 쿠버네티스 안에서 사용자가 오브젝트를 생성할 때 해당 오브젝트를 구분하는 용도이다. 사용자가 임의로 원하는 값을 지정해서 사용이 가능하다.
레이블은 키-값 쌍으로 구성된다.
레이블의 키는 쿠버네팉스 안에서 컨트롤러들이 파드를 관리 할 때 관리해야 할 파드를 구분해주는 역할을 한다.
- 유의 사항
1. 63 글자를 넘지 않아야 함
2. 시작과 끝 문자는 알파벳 대소문자 및 숫자여야 함
3. 중간에는 대시(-), 밑줄(_), 점(.), 숫자 등이 올 수 있음
4. 레이블 키 이름 앞에는 / 로 구분해서 접두어를 사용할 수 있다.
📌 Kubernetes Annotation
쿠버네티스의 애너테이션은 주석 성격의 메타데이터를 기록하는데 사용된다. 애너테이션은 레이블처럼 사용자가 원하는 값을 설정하다기보다는 쿠버네티스 시스템에서 필요한 정보들을 표시하는데 사용된다.
애너테이션의 키는 쿠버네티스 시스템이 인식할 수 있는값을 사용한다. 또한 인그레스에서 필요한 설정을 애너테이션으로 정의할 수 있다. ingress-nginx 같은 인그레스 컨트롤러는 애너테이션으로 사용자가 직접 nginx에 필요한 설정들을 정의할 수 있다.
📌 레이블을 이용한 카나리 배포
포드를 업데이트하는 방법
- 블루 그린 업데이트
- 기존에 실행된 파드 개수와 같은 개수의 신규 파드를 모두 실행한 뒤, 신규 파드가 정상적으로 실행되는 것이 확인되면 그 후 트래픽을 한꺼번에 신규 파드 쪽으로 옮기는 방식
- 카나리 업데이트
- 신규 파드를 배포할 때 한꺼번에 앱 컨테이너 전체를 교체하지 않고, 기존 버전을 유지한 채로 일부 버전만 신규 파드로 교체하며 버그나 이상이 있는지, 사용자의 반응은 어떤지 확인하는 방식
- 롤링 업데이트
- 배포된 전체 파드를 한꺼번에 교체하는 것이 아니라 일정 개수씩 교체하면서 배포하는 방식
안정 버전 디플로이먼트 설정 (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를 삭제해 서비스에서 제외하면 된다.
'Infra > Kubernetes' 카테고리의 다른 글
[CKA] CKA 알아둬야 하는 명령어 (0) | 2023.12.04 |
---|---|
[이론] 쿠버네티스 컨피그맵(ConfigMap)과 시크릿(Secret) (0) | 2023.06.14 |
[실습] 쿠버네티스 Ingress (0) | 2023.06.13 |
[이론] 쿠버네티스 Ingress (0) | 2023.06.13 |
[실습] minikube로 앱 외부로 노출하기 (0) | 2023.06.09 |