Skip to main content

애플리케이션 관찰 및 유지보수

Liveness Probe

  • self-healing 기능

    • 건강한 컨테이너를 이용해 서비스 지원
  • liveness probe

    • 동작되는 컨테이너에 주기적으로 건강검진 명령을 주어 결과에 따라 건강한지 아닌지를 판단
    • 건강하지 않은 컨테이너는 kill시키고, 다시 동일 버전의 컨테이너를 다운로드 받아 실행
    • 항상 건강한 컨테이너를 가지고 서비스 지원을 보장
  • Pod가 계속 실행할 수 있음을 보장

    • LivenessProbe 동작 방식

httpGet probe

지정한 IP 주소, port, path에 HTTP GET 요청을 보내 해당 컨테이너가 응답하는지를 확인하며 반환코드가 200이 아닌 값이 나오면 오류로 인식하고 컨테이너를 다시 시작한다.

livenessProbe:
httpGet:
path: /
port: 80

tcpSocket probe

지정된 포트에 TCP 연결을 시도, 연결되지 않으면 컨테이너를 다시 시작한다.

livenessProbe:
tcpSocket:
port: 22

exec probe

exec 명령을 전달하고 명령의 종료코드가 0이 아니면 컨테이너를 다시 시작한다.

livenessProbe:
exec:
command:
- ls
- /data/file

liveness probe 매개변수

  • periodSeconds: health check 반복 실행 시간(초)
  • initialDelaySeconds: Pod 실행 후 delay할 시간(초)
  • timeoutSeconds: health check 후 응답을 기다리는 시간(초)

  • exec probe를 이용해 "cat /tmp/healthy" 명령을 5초마다 한 번씩 동작시킴으로 health check
  • health check는 Pod가 처음 실행되고 5초 후부터 시작되어야 한다.
  • health check 실행결과 오류가 없는 횟수가 1회이면 오류 없음으로 결정한다.
  • health check 실행결과 실패횟수가 3회 연속되며 Container를 restart 시킨다.
# vi liveness.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: registry.k8s.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5


kubectl apply -f liveness.yaml

kubectl get pod liveness-exec
# Liveness 항목 확인
kubectl describe pod liveness-exec

Readiness Probe

  • Pod가 read될 때 Endpoint를 전달해서 건강하지 않은 Pod에 traffic이 전달되지 않게 운영
  • 동작방식
    • liveness와 비슷함
    • Pod가 준비되었을 때 신호(Endpoint)를 보냄
  • ReadinessProbe 동작방식
    • httpGet
    • tcpSocket
    • exec
다음과 같은 조건의 self-healing 기능을 Deployment에 적용하시오.
  • readinessProbe 구성

    • httpGet probe를 이용해 smlinux/appjs 컨테이너에서 8080포트로 200 상태코드가 나오지 않으면 외부 traffic이 들어오지 못하도록 구성한다.
    • 컨테이너 시작 후 5초 후부터 readinessProbe가 동작되어야 하고, 실패횟수는 1회로 구성하시오.
  • livenessProbe 구성

    • httpGet probe를 이용해서 smlinux/appjs 컨테이너가 웹 통신에 실패하면 컨테이너를 다시 실행하시오.
    • 템플릿은 /data/ckad/liveness-busybox.yaml을 사용하시오.
# 파일 확인
cat /data/ckad/readiness-appjs.yaml
...
apiVersion: apps/v1
kind: Deployment
metadata:
name: appjs-deployment
spec:
replicas: 3
selector:
matchLabels:
app: appjs
template:
metadata:
labels:
app: appjs
spec:
containers:
- name: appjs-container
image: smlinux/appjs
ports:
- containerPort: 8080

# vi /data/ckad/readiness-appjs.yaml
...
apiVersion: apps/v1
kind: Deployment
metadata:
name: appjs-deployment
spec:
replicas: 3
selector:
matchLabels:
app: appjs
template:
metadata:
labels:
app: appjs
spec:
containers:
- name: appjs-container
image: smlinux/appjs
ports:
- containerPort: 8080

readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 5
# failureThreshold 미설정시 기본값 3
failureThreshold: 1

livenessProbe:
httpGet:
path: /
port: 8080

kubectl apply -f /data/ckad/readiness-appjs.yaml
kubectl describe pod appjs-deployment-[]-[]

Application monitor

  • Application monitoring

    • 신뢰성 있는 서비스 제공을 위해 동작중인 애플리케이션 성능을 검사해야 한다.
    • 쿠버네티스는 각 레벨에서 애플리케이션의 리소스 사용량에 대한 상세 정보를 제공한다.
    • 이 정보를 기반으로 애플리케이션의 성능을 평가하고 병목 현상을 제거하여 전체 성능을 향상할 수 있다.
  • metrics-server

    • 클러스터 전체의 리소스 사용 데이터 수집
    • 각 노드에 설치된 kubectl을 통해서 노드나 컨테이너의 CPU나 메모리 사용량 같은 메트릭을 수집
    • 쿠버네티스에서 HPA(Horizontal Pod Autoscaler)나 kubectl top 명령어를 사용하기 위해서는 반드시 metrics-server가 동작중이어야 한다.
  • 리소스 사용량 확인

    • 노드 CPU 사용률(%) / 노드 메모리 사용률(%)
    • kubectl top nodes
    • pod CPU 사용률(%) / 노드 메모리 사용률(%)
    • kubectl top pods
클러스터에서 Application들이 소비하는 리소스를 주기적으로 모니터링해야 한다.
  • 네임스페이스 devops에서 실행 중인 Pod들 중 CPU를 가장 많이 사용하는 Pod의 이름을 찾아 /opt/REPORT/2022/pod.txt에 저장하세요.
kubectl top pod --namespace=devops --sort-by=cpu | sed -n 2p | awk '{print $1}' > /opt/REPORT/2022/pod.txt