label은 kubernetes object를 특정 기준으로 묶어 여러 group으로 만드는 방법 중 하나이다. selector는 이러한 label을 기준으로 특정 kubernetes object group을 선택해 policy를 적용하는 방법이다.
label들은 key-value로 이루어져 있는데, 가령 다음과 같다.
{
"Class": "Mammal",
"kind": "Domestic",
"Color": "Green"
}
{
"Class": "Mammal",
"kind": "Domestic",
"Color": "Orange"
}
이렇게 key-value로된 label들을 가진 item을 선택할 때 사용하는 것이 바로 selector
인 것이다. selector를 통해 item을 선택할 때도 key-value
형식으로 선택해야한다.
Class=Mammal & Color=Green
위의 selector를 만족하는 item은 아래 밖에 남지 않는다.
{
"Class": "Mammal",
"kind": "Domestic",
"Color": "Green"
}
kubernetes는 서로 다른 category로 label를 object에 부여하고 그룹을 만들고, selector로 label을 설정하여 group을 선택하는 것이다.
label을 만드는 방법은 매우 쉽다. metadata
의 labels
아래로 key: value
값들을 나열하기만 하면 된다.
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp
labels:
app: App1
function: Front-end
spec:
containers:
- name: simple-webapp
image: simple-webapp
ports:
- containerPort: 8080
simple-webapp
pod는 label
로 app: App1
, function: Front-end
를 가지게 된다. 이후에 해당 label을 통해서 selector를 사용하기 위해서는 다음과 같이 사용할 수 있다.
kubectl get pods --selector app=App1
이러면 app=App1
라벨을 가진 pod만 선택되게 된다.
우리가 앞전에 사용했던 ReplicaSet
을 다시 보도록 하자.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: simple-webapp
labels:
app: App1
function: front-end
spec:
replicas: 3
selector:
matchLabels:
app: App1
template:
metadata:
labels:
app: App1
function: front-end
spec:
containers:
- name: simple-webapp
image: simple-webapp
spec.template.metadata.labels
의 라벨들을 보면 spec.selector
의 matchLabels
와 app: App1
으로 일치한다. ReplicaSet
은 이 label을 보고 어떤 pod들 관리하여 replica수를 유지할 지 결정하게 되는 것이다.
여기서 재미난 점은 ReplicaSet
자체도 metadata.labels로
selector와 동일한 값을 가지고 있다는 것인데, 그렇다고
ReplicaSet자체도 관리의 대상으로 포함되지 않는다. 왜냐하면
ReplicaSet이 관리하는 항목은 오직
pod`이기 때문이다.
service
역시도 selector
를 통해서 pod를 지정한다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: App1
ports:
- protocol: TCP
port: 80
targetPort: 9376
app: App1
라벨을 선택하고 있는 것을 알 수 있다. 따라서 해당 selector
에 선택된 pod들은 service
의 영향을 받는다.
여기서 한 가지 재미난 점은 label
은 selector
와 함께 사용되어 kubernetes object들을 그룹핑하는 역활을 한다는 것이다. 그렇다면 추가적인 정보성 데이터를 담고 싶을 때는 무엇을 써야하는가? 이때는 annotation
을 쓰면 된다.
name
, version
, build-information
등등 정보성 데이터를 넣고 싶다면 annotations
에 써주면 된다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: simple-webapp
labels:
app: App1
function: front-end
annotations:
buildversion: 1.34
spec:
replicas: 3
selector:
matchLabels:
app: App1
template:
metadata:
labels:
app: App1
function: front-end
spec:
containers:
- name: simple-webapp
image: simple-webapp
참고로, cluster내의 모든 object 중에 특정 label을 가진 object들을 모두 불러오는 명령어는 다음과 같다.
kubectl get all --selector env=dev