레이블은 키-값 쌍이고, 한 키에는 값이 하나만 붙는다. 같은 키에 다른 값을 다시 넣으면 경고 없이 덮인다.
kubectl label node node1 environment=production
kubectl label node node1 environment=staging --overwrite
kubectl get node node1 --show-labels
마지막 값만 남는다. --overwrite 없이 같은 키를 다시 넣으면 명령 자체가 거부되므로, 덮이는 사고는 대개 --overwrite 를 습관적으로 붙일 때 난다.
레이블 값에는 쉼표나 대괄호를 넣을 수 없다. 값은 63자 이하이며 영숫자로 시작하고 끝나야 하고, 중간에 - _ . 만 쓸 수 있다. environment=production,staging 같은 표기는 애초에 유효하지 않다.
가장 단순하고 셀렉터에서 그대로 쓸 수 있는 방식이다.
kubectl label node node1 env-production=true env-staging=true
spec:
nodeSelector:
env-production: "true"
값이 아니라 키의 존재 로 판별하므로 셀렉터에서 env-production 만 써도 된다.
kubectl get nodes -l env-production
값이 여러 개인 것이 아니라 여러 값 중 하나면 된다 가 실제 요구인 경우가 많다. 이때는 노드 쪽을 손대지 말고 파드 쪽에서 In 으로 받는다.
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: environment
operator: In
values:
- production
- staging
노드는 environment 값을 하나만 가지면 되고, 파드가 허용 목록을 갖는다. 대부분의 경우 이것이 맞는 설계다.
스케줄링에 쓰지 않고 정보만 남기는 값이라면 애너테이션이 맞다. 길이 제약이 훨씬 느슨해 JSON 배열도 넣을 수 있다.
kubectl annotate node node1 example.com/environments='["production","staging"]'
다만 애너테이션은 셀렉터로 조회되지 않는다. 스케줄링이나 -l 조회가 필요하면 레이블이어야 한다.