사용자가 모든 오브젝트를 일일이 관리할 수는 없습니다.
관리하고자 하더라도 사용자의 사각지대에 있는 오브젝트를 실제 프로덕션 환경에서 관리하기 위해서는 수동 작업은 권장되지 않습니다.
실제로는 자동으로 안정 상태가 유지되고, Kubernetes는 이런 요구를 충족하기위해 Liveness Probe
를 사용합니다.
Liveness Probe는 POD에 의해 컨테이너를 동작시키고 동작중인 컨테이너의 상태를 주기적으로 모니터링합니다.
POD에서 오류가 발생하면 해당 컨테이너를 재 시작시킵니다. Kubernetes의 핵심 동작이 바로 이 Liveness Probe로 실행됩니다.
HTTP GET 프로브
: HTTP 요청 / 응답으로 확인TCP 소켓 프로브
: 포트 연결 시도해서 확인Exec 프로브
: 컨테이너 내부의 바이너리를 실행하고 종료 코드 확인Liveness Probe는 POD의 상태를 감지하고 재시작하는 것으로 그 역할을 다 하지만 여러 사유로 인해 POD가 삭제되거나 NODE 자체에 장애가 발생하는 경우에는
POD를 재 시작 할 수 없습니다. 이러한 상황에 대비해 가용성을 높이기 위해서는 RC, RS, DS 등의 Controller를 사용해야 합니다.
정상 상태
apiVersion: v1 kind: Pod metadata: name: nasa-pod-liveness spec: containers: - image: nginx:latest name: nasa ports: - containerPort: 8080 protocol: TCP livenessProbe: httpGet: path: / port: 8080
livenessProbe
: Liveness Probe 정의 httpGet
: HTTP GET 프로브 정의tcpSocket
: TCP 소켓 프로브 정의 Exec
: Exec 프로브 정의[root@nasa-master nasa]# kubectl apply -f nasa-pod-liveness.yml pod/nasa-pod-liveness created [root@nasa-master nasa]# kubectl get pods --watch NAME READY STATUS RESTARTS AGE nasa-pod-liveness 1/1 Running 0 19s
--watch
옵션을 사용해 지속적으로 모니터링합니다.apiVersion: v1 kind: Pod metadata: name: nasa-pod-liveness-error spec: containers: - image: nginx:latest name: nasa ports: - containerPort: 8081 protocol: TCP livenessProbe: httpGet: path: / port: 8082
PORT
를 임의로 다르게 주어 error
상태를 발생시킵니다.[root@nasa-master nasa]# kubectl apply -f nasa-pod-livness-error.yml pod/nasa-pod-liveness-error created
[root@nasa-master nasa]# kubectl get pods --watch NAME READY STATUS RESTARTS AGE nasa-pod-liveness 1/1 Running 0 30s nasa-pod-liveness-error 0/1 Pending 0 0s nasa-pod-liveness-error 0/1 Pending 0 0s nasa-pod-liveness-error 0/1 ContainerCreating 0 0s nasa-pod-liveness-error 1/1 Running 0 5s nasa-pod-liveness-error 1/1 Running 1 62s nasa-pod-liveness-error 1/1 Running 2 2m1s nasa-pod-liveness-error 1/1 Running 3 3m1s
nasa-pod-liveness-error 1/1 Running 4 4m2s nasa-pod-liveness-error 1/1 Running 5 5m1s nasa-pod-liveness-error 0/1 CrashLoopBackOff 5 5m58s
[root@nasa-master nasa]# kubectl describe pods nasa-pod-liveness-error ... ... State: Running Started: Fri, 17 Aug 2020 05:12:20 +0000 Last State: Terminated Reason: Error Exit Code: 137 Started: Fri, 17 Aug 2020 05:11:20 +0000 Finished: Fri, 17 Aug 2020 05:12:16 +0000 Ready: True Restart Count: 3
종류
컨테이너 실행 후로부터 모니터링을 시작하기까지 시간을 delay
모니터링사이에 시간 간격을 timeout
으로 표기합니다.
POD가 실행되고 어플리케이션이 제대로 동작하기까지 시간이 걸리므로 초기 지연 시간을 initialDlaySecond 로 정의할 수 있습니다.
Event 필드는 POD의 상태를 시간대별로 확인할 수 있으며 이 경우 Liveness Probe에 문제가 있습니다는 사실을 확인할 수 있습니다.
Kubernetes가 처음 나왔을 때는 POD를 복제하고 항상성을 유지시키기 위한 수단은 Replication Controller
가 유일 했습니다.
그러나 Replication Controller의 몇 몇 문제점과 기능 개선을 위해 ReplicaSet이라는 Controller가 추가되었습니다. 최근에는 Replication Controller를 사용하지 않고 대부분 ReplicaSet을 사용하기에 Replication Controller에 대해서 다루진 않겠습니다.
POD의 다중 Label 지원
POD에 설정된 Label의 키만 선택 가능
Replication Controller에서는 POD의 여러 Label 중 하나의 Label에 대해서만 관리 POD를 지정할 수 있었고 반드시 Label의 key=value가 모두 일치해야만 POD를 지정할 수 있었습니다. 그러나 ReplicaSet은 다중 Label을 지정할 수 있고 key만 가지고도 Label을 지정할 수 있습니다.
apiVersion: apps/v1 kind: ReplicaSet metadata: name: replicaset-nasa spec: replicas: 3 selector: matchLabels: app: nasa-nginx-pods-label template: metadata: name: nasa-nginx-pod labels: app: nasa-nginx-pods-label spec: containers: - name: replicaset-nasa image: nginx:latest ports: - containerPort: 80
matchLabels
및 matchExpressions
필드로 Label을 선택
합니다. ReplicaSet의 Label Selector는 kubectl explain replicaset.spec.selector로 지정할 수 있습니다.[root@nasa-master nasa]# kubectl apply -f nasa-rs.yml replicaset.apps/replicaset-nasa created
[root@nasa-master nasa]# kubectl get replicasets.apps NAME DESIRED CURRENT READY AGE replicaset-nasa 3 3 3 3m9s
[root@nasa-master nasa]# kubectl get po NAME READY STATUS RESTARTS AGE replicaset-nasa-7fvdx 1/1 Running 0 2m21s replicaset-nasa-gbft4 1/1 Running 0 2m21s replicaset-nasa-r84dt 1/1 Running 0 2m21s
Label Selector
사용matchLabels
Label Selector (matLabels Label Selector는 오브젝트 파일에서 다음과 같은 형식으로 정의합니다.... spec: selector: matchLabels: key: value ...
spec: selector: matchExpressions: - key: <stirng> operator: <In | NotIn | Exists | DoesNotExist> values: - <string>
key
와 values
를 따로 지정합니다는 점입니다.replicas: 4
[root@nasa-master nasa]# vim nasa-rs.yml [root@nasa-master nasa]# [root@nasa-master nasa]# kubectl apply -f nasa-rs.yml replicaset.apps/replicaset-nasa configured
created
라는 출력이 나왔는데 이번에는 configured
라는 출력이 나왔습니다.[root@nasa-master nasa]# kubectl get po NAME READY STATUS RESTARTS AGE replicaset-nasa-bpmbg 1/1 Running 0 52s replicaset-nasa-lkv4h 1/1 Running 0 32s replicaset-nasa-s2tlp 1/1 Running 0 52s replicaset-nasa-wxhq6 1/1 Running 0 52s
ReplicaSet은 자동으로 복구해주고 생성을 확인하는 것을 보면 tracking
하고 있는 것 같습니다.
edit
옵션을 사용해 특정 POD의 Label을 edit-test로 바꾸어 보았습니다[root@nasa-master nasa]# kubectl edit pod replicaset-nasa-bpmbg pod/replicaset-nasa-bpmbg edited [root@nasa-master nasa]# [root@nasa-master nasa]# kubectl get po NAME READY STATUS RESTARTS AGE replicaset-nasa-72hgn 0/1 ContainerCreating 0 4s replicaset-nasa-bpmbg 1/1 Running 0 6m5s replicaset-nasa-lkv4h 1/1 Running 0 5m45s replicaset-nasa-s2tlp 1/1 Running 0 6m5s replicaset-nasa-wxhq6 1/1 Running 0 6m5s [root@nasa-master nasa]# [root@nasa-master nasa]# [root@nasa-master nasa]# [root@nasa-master nasa]# kubectl get po --show-labels NAME READY STATUS RESTARTS AGE LABELS replicaset-nasa-72hgn 1/1 Running 0 66s app=nasa-nginx-pods-label replicaset-nasa-bpmbg 1/1 Running 0 7m7s app=edit-test replicaset-nasa-lkv4h 1/1 Running 0 6m47s app=nasa-nginx-pods-label replicaset-nasa-s2tlp 1/1 Running 0 7m7s app=nasa-nginx-pods-label replicaset-nasa-wxhq6 1/1 Running 0 7m7s app=nasa-nginx-pods-label
apiVersion: apps/v1 kind: DaemonSet metadata: name: nasa-ds spec: selector: matchLabels: app: nasa-ds template: metadata: labels: app: nasa-ds spec: nodeSelector: node: nasa containers: - name: nasa image: nginx:latest ports: - containerPort: 80
- apiVersion apps/v1 → Kubernetes의 apps/v1 API를 사용 합니다.
- kind: DaemonSet → DaemonSet의 작업으로 명시 합니다.
- metadata.name → DaemonSet의 이름을 설정 합니다.
- metadata.namespace → 네임스페이스를 지정 합니다.
- metadata.labels → DaemonSet를 식별할 수 있는 Label을 지정 합니다.
- spec.selector.matchLabels → 어떤 Label의 POD를 선택하여 관리할 지 설정 합니다.
- spec.template.metadata.labels.name → 생성할 POD의 Label을 POD명: ” ” 으로 지정 합니다.
- spec.template.spec.containers → 하위 옵션들은 컨테이너의 설정을 정의합니다.
[root@nasa-master nasa]# kubectl apply -f nasa-ds.yml daemonset.apps/nasa-ds created [root@nasa-master nasa]# kubectl get ds NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nasa-ds 0 0 0 0 0 node=nasa 32s
DESIRED, CURRENT, READY
탭의 값이 모두 0입니다. POD가 아예 생성되지 않습니다.[root@nasa-master nasa]# kubectl label nodes nasa-node1 node=nasa node/nasa-node1 labeled