레이블(Labels) 은 파드와 같은 오브젝트에 첨부된 키와 값의 쌍이다.
레이블 셀렉터(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가지 요소

  1. 레이블 셀렉터: 관리하는 포드 범위 결정
  2. 복제본 수: 실행해야하는 포드의 수 결정
  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 # 실행중인 포드는 유지하고 싶을 때