레이블(Labels) 은 파드와 같은 오브젝트에 첨부된 키와 값의 쌍이다.
레이블 셀렉터(Selectors)를 통해 클라이언트와 사용자는 오브젝트를 식별할 수 있다.
- Kubernetes Documentation: Labels and Selectors
레이블(Labels)
- 리소스에 첨부하는 키/값(key:value) 쌍
- 필터링하며 검색가능
Pod를 정의한 YAML에서는 metadata.labels에 레이블을 정의한다.
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 label pod http-go-v2 test=foo
기존의 레이블을 수정하려면 --overwrite
옵션을 사용한다.
kubectl label pod http-go-v2 rel=beta --overwrite
레이블 삭제를 하려면 아래와 같은 명령어를 사용한다.
kubectl label pod http-go-v2 rel-
레이블 보기
kubectl get pod --show-labels
특정 레이블 컬럼으로 확인
kubectl get pod -L app,rel
레이블로 필터링하여 검색
kubectl get pod --show-labels -l 'env'
kubectl get pod --show-labels -l '!env'
kubectl get pod --show-labels -l 'env!=test'
kubectl get pod --show-labels -l 'env!=test,rel=beta'
모든 리소스를 지우는 명령
kubectl delete all --all
레플리케이션 컨트롤러와 레플리카셋
Replication: 데이터 저장과 백업하는 방법과 관련이 있는 데이터를 호스트 컴퓨터에서 다른 컴퓨터로 복사하는 것
레플리케이션컨트롤러
- 포드가 항상 실행하도록 유지
- 포드가 실행된 노드가 클러스터에서 사라지면 다른 노드에 대체 포트를 생성
- 지속적인 모니터링을 통해 실제와 원하는 수가 일치하는지 확인
레플리케이션컨트롤러 3가지 요소
- 레이블 셀렉터: 관리하는 포드 범위 결정
- 복제본 수: 실행해야하는 포드의 수 결정
- 포드 템플릿: 새로운 포드를 설명
레플리케이션컨트롤러 장점
- 새 포드를 항상 실행
- 노드에 장애가 있으면 다른 노드에 복제본 생성
- 수동, 자동으로 스케일링(수평)
레플리케이션컨트롤러 생성 및 확인
공식 문서 - ReplicationController
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3 # 1) 복제본 수: 실행해야하는 포드의 수 결정
selector: # 2) 레이블 셀렉터: 관리하는 포드 범위 결정
app: nginx
template: # 3) 포드 템플릿: 새로운 포드를 설명
metadata: # <-- 여기 부분 부터는 포드와 동일함
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- 주의해야할 점은 ReplicationController.selector에 정의하는 labels 와 pod에정의하는 labels이 일치해야 정상적으로 생성된다.
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-j9fld 1/1 Running 0 30s
nginx-jmjr4 1/1 Running 0 30s
nginx-rt4n4 1/1 Running 0 30s
$ kubectl get rc
NAME DESIRED CURRENT READY AGE
nginx 3 3 3 36s
- 레플리케이션컨트롤러에 의해 생성된 pod를 확인할 수 있다.
- 레플리케이션컨트롤러에 의해 생성된 pod 한개를 강제로 지우면 다시 새로운 pod를 생성한다.
- 레플리케이션컨트롤러가 설정된 DESIRED, CURRENT 개수를 확인할 수 있다.
$ kubectl describe rc nginx
Name: nginx
Namespace: default
Selector: app=nginx
Labels: app=nginx
Annotations: <none>
Replicas: 3 current / 3 desired # Replicas 정보
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed # Pod의 상태
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events: # 이벤트 내용을 보면 언제 pod가 만들어 졌는지 확인할 수 있다.
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m19s replication-controller Created pod: nginx-jmjr4
Normal SuccessfulCreate 3m19s replication-controller Created pod: nginx-rt4n4
Normal SuccessfulCreate 3m19s replication-controller Created pod: nginx-j9fld
$ kubectl get pod -L app
NAME READY STATUS RESTARTS AGE APP
nginx-j9fld 1/1 Running 0 6m35s nginx
nginx-jmjr4 1/1 Running 0 6m35s nginx
nginx-rt4n4 1/1 Running 0 6m35s nginx
$ kubectl label pod nginx-j9fld app=apache --overwrite
pod/nginx-j9fld labeled
$ kubectl get pod -L app
NAME READY STATUS RESTARTS AGE APP
nginx-j9fld 1/1 Running 0 7m23s apache # 레이블 변경
nginx-jmjr4 1/1 Running 0 7m23s nginx
nginx-rt4n4 1/1 Running 0 7m23s nginx
nginx-zs8vc 1/1 Running 0 4s nginx # 신규로 생성
- 레플리케이션컨트롤러에 의해 생성된 pod에 적용된 레이블을 강제 변경한다면
- 레플리케이션컨트롤러에 의해 생성된 새로운 pod를 신규로 생성한다.
$ kubectl edit rc nginx # 설정변경, replicas를 3->10 으로 수정
replicationcontroller/nginx edited
$ kubectl get pod -L app
NAME READY STATUS RESTARTS AGE APP
nginx-8xlcv 1/1 Running 0 3s nginx # 생성
nginx-g2txj 0/1 ContainerCreating 0 3s nginx # 생성
nginx-jmjr4 1/1 Running 0 10m nginx
nginx-k2jnm 0/1 ContainerCreating 0 3s nginx # 생성
nginx-kdxwk 0/1 ContainerCreating 0 3s nginx # 생성
nginx-pkwjw 1/1 Running 0 3s nginx # 생성
nginx-rt4n4 1/1 Running 0 10m nginx
nginx-sp6jc 0/1 ContainerCreating 0 3s nginx # 생성
nginx-zdktx 0/1 ContainerCreating 0 3s nginx # 생성
nginx-zs8vc 1/1 Running 0 3m30s nginx
$ kubectl delete rc nginx # 레플리케이션컨트롤러 삭제
$ kubectl delete rc nginx --cascade=false # 실행중인 포드는 유지하고 싶을 때