https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/labels/ 참조
레이블은 키와 값의 쌍(딕셔너리)으로 구성되어 있다.
레이블(라벨)은 AWS 리소스를 작성할 때 태그를 지정하는 것 처럼, 오브젝트의 특성을 식별(Identity)할 때 사용한다. 이를 통해 어떤 어플리케이션인지, 관리자는 누구인지 등의 식별 정보를 저장할 수 있다. 저장한 식별 정보는 셀렉터를 통해 식별할 수 있다.
yaml파일을 생성할 때 labels로 지정할 수 있다.
레이블을 이용하면 느슨한 결합(loosely coupling) 방식으로 조직 구조와 시스템 오브젝트를 매핑할 수 있다. (= 낮은 결합도와 높은 응집도를 만족할 수 있다.)
쿠버네티스에서는 어플리케이션을 pod 단위로 띄우게 되는데, 이 때 pod과 pod 사이, pod와 다른 resource 사이에 결합을 레이블과 레이블 셀렉터를 통해 할 수 있다.
따라서, 레이블의 용도는 두 가지로 정리할 수 있다.
해당 문서에서는, 첫 번째 용도 위주로 서술한다.
해당 명령어를 통해 레이블을 확인할 수 있다.
kubectl get pods --show-labels
kubectl get pods -l env=dev
-l 명령어를 통해 특정 레이블을 가지고 있는 pod의 목록만 확인할 수 있다. (다중 검색도 가능)
레이블은 슬래시로 접두사를 구분할 수 있으며, 63자 이하여야 한다.
레이블 셀렉터를 지정할 때 키와 밸류 사이에 들어갈 수 있는 연산자는 =, ==, != 이고, =와 ==의 의미는 같다. 이렇게 필터링 하는 것을 일치성 기준 요건이라고 한다.
또한, 집합성 기준 요건에 따라 집합을 키로 필터링할 수 있다. 키와 밸류 사이에 들어갈 수 있는 연산자는 in, notin, exist (!env, env)이다.
https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/annotations/ 참조
비-식별 메타데이터를 의미한다. (레이블은 식별 데이터) 따라서, 레이블과는 다르게 어노테이션을 통해 검색이나 리소스 간의 연결을 할 수는 없다.
어노테이션은 단순하게 메타데이터(리소스에 대한 정보)를 저장하는 용도로 사용한다.
apiVersion: v1
kind: Pod
meatadata:
name: myapp-pod-annotation
annotations:
devops-team/developer: "John Smith"
spec:
containers:
- name: myapp
image: ghcr.io/c1t1d0s7/go-myweb:alpine
ports:
- containerPort: 8080
protocol: TCP
어노테이션은 식별데이터가 아니기 때문에 별도의 옵션은 없다. 따라서, 어노테이션을 확인하기 위해서는 -o yaml 명령어를 이용해야 한다.
어노테이션을 확인했을 때, cni라는 어노테이션을 확인할 수 있다. cni는 container network interface의 줄임말이며, pod 간의 통신을 담당하기 위한 인터페이스이다.
쿠버네티스는 실제로 컨테이너를 어떻게 실행할지, 컨테이너 간의 네트워크를 어떻게 통신할 것인지, 컨테이너의 스토리지를 어떻게 제공할 것인지에 대한 어떠한 코드도 없다. 쿠버네티스는 컨테이너, 네트워크, 볼륨을 관리하는 컨트롤 어플리케이션이다.
실제로 컨테이너를 구현하는 것은 Docker, 네트워크를 제공하는 것은 Calico이다. 쿠버네티스는 외부 구현체인 이들을 연결할 뿐이다. 이를 위해 필요한 것이 cni, csi 등의 인터페이스이다.
kubectl annotate pod myapp-pod-annotation message=hello
명령어를 통해 어노테이션을 붙일 수 있다.
kubectl annotate pod myapp-pod-annotation message=bye --overwrite
이미 존재하는 어노테이션의 내용을 수정하기 위해서는 overwrite를 붙여야 한다.
kubectl annotate pod myapp-pod-annotation -message
명령어를 통해 어노테이션을 삭제할 수 있다.
따라서, 레이블은 식별데이터이고 다른 리소스 간의 매핑, 느슨한 결합을 위해 사용하고, 어노테이션은 단순 비식별 데이터를 구하기 위해 사용한다고 할 수 있다.