클라우드 엔지니어 꿈나무
Kubernetes(K8S) livenessProbe를 이용해 self-healing Pod 본문
livernessProbe (kubelet으로 컨테이너 진단하기)
Self-healing 기능, 건강한 container로만 서비스를 제공
Pod의 spec에 정의
일반 pod yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx:1.14
livernessProbe 적용 pod yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx:1.14
livenessProbe:
httpGet:
path: /
port: 80
livernessProbe 메커니즘
- httpGet probe: 지정한 IP 주소, port, path에 HTTP GET 요청을 보내 해당 컨테이너가 응답하는지 확인. 반환 코드가 200이 아닌 값이 나오면 오류, 컨테이너를 재시작
연속해서 세 번 실패 시, 건강하지 않은 컨테이너로 판단하여 container를 죽임 => docker hub에서 건강한 container를 다시 받아 실
livenessProbe:
httpGet:
path:
port: 80
- tcpSocket probe: 지정된 포트에 TCP 연결 시도, 연결되지 않으면 컨테이너 재시작
livenessProbe:
tcpSocket:
port: 22
- exec probe: exec 명령을 전달하고 명령의 종료 코드가 0이 아니면 컨테이너 재시작 (pod 재시작이 아니라 컨테이너가 재시작 = ip 는 바뀌지 않음)
livenessProbe:
exec:
command:
- ls
- /data/file
# 어떤 명령이든 컨테이너에서 실행할 command를 나열
apiVersion: v1
kind: Pod
metadata:
neme: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx:1.14
livenessProbe:
httpGet:
path: /
port: 80 #80포트 주기적으로 점검
#밑에 애들은 안 쓰면 defalut 값으로 적용
initialDelaySeconds: 15
perodSeconds: 20
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 3
# vi pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
neme: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx:1.14
livenessProbe:
httpGet:
path: /
port: 80
# kubectl create -f pod-nginx.yaml
# kubectl describe pod nginx-pod
default 값
delay=0s (initialDealySeconds) -> running 되면 바로 검진, delay=5s 라면 running 되고 5초 후 검진
timeout=1s (timeoutSeconds)
period=10s (periodSeconds) : 얼마만에 한 번씩 검사할 건지, interval이 짧으면 자주 검사, 길면 downtime이 긺
success=1 (successThreshold) : 한 번 성공하면 성공으로 봄
failure=3 (failureThreshold) : 세 번 실패하면 실패로 봄
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx:1.14
ports:
- containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 15 #pod 가 running 되고 15초 후에 검진하겠다.
periodSeconds: 30 # 30초마다 한 번씩 interval 을 가지고 건강 검진을 하겠다
successThreshold: 1 #한 번까지 연속 성공하면 성공으로 보겠다
timeoutSeconds: 3 # 3초 안에 응답이 안 떨어지면 실패로 보겠다
failureThreshold: 3 #3번까지 실패하면 실패로 보겠다
# kubectl get pod nginx-pod -o yaml => 동작 중인 pod를 yaml 파일로 보기
Liveness Probe example
unheathy 처음 5번까지는 200번 상태 코드 6번부터는 500번 실패 상태 코드를 전송하는 어플리케이션 컨테이너
# vi pod-liveness.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
containers:
- image: smlinux/unhealthy
name: unhealthy-container
#unheathy 처음 5번까지는 200번 상태 코드 6번부터는 500번 실패 상태 코드를 전송하는 어플리케이션 컨테이너
ports:
- containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 8080
# kubectl apply -f pod-liveness.yaml
# kubectl describe pod liveness-pod
periodSeconds:10 (default) 이기 때문에 10초마다 검사하다가 smlinux/unhealthy로 인하여 여섯 번째부터는 실패가 됨
x3 over 27s => 3번 시도했는데 다 실패
Killing으로 실행이 되는 것을 볼 수 있음
# kubectl describe pod liveness-pod => 다시 한 번 더
하기와 같이 killing 이후 새 container를 다시 Pull하여 재시도 하는 것을 확인할 수 있음 => 어플리케이션이 제대로 동작하지 않으면 새로운 컨테이너를 생성(관리 용이)
하기 liveness-exam.yaml 파일에 self-healig 기능을 추가하시오
- 동작되는 Pod내의 컨테이너에 /tmp/healthy 파일이 있는지 5초마다 확인
- Pod 실행 후, 10초 후부터 검사
- 성공 횟수 1번, 실패 횟수 연속 2번
apiVersion: v1
kind: Pod
metadata:
name: liveness-exam
spec:
containers:
- name: busybox-container
image: busybox
args: #arguments 컨테이너 내부에서 실행할 명령 및 인수 지정
- /bin/sh
- -c #명령
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 60
#busybox cantainers는 실행될 때, tmp디렉토리에 healthy 파일이 만들어짐, 그러다가 30초가 지나면 그 파일 삭제시켜 버리고 600초를 지나가게 함
기능 추가 후,
apiVersion: v1
kind: Pod
metadata:
name: liveness-exam
spec:
containers:
- name: busybox-container
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 60
livenessProbe:
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
failureThreshold: 2
initialDelaySeconds: 10
exec:
command:
- ls
- tmp/healthy
# kubectl describe liveness-exam
'kubernetes' 카테고리의 다른 글
Kubernetes(K8S) 따배쿠 Pod : static Pod(feat. kubelet daemon) (0) | 2023.10.15 |
---|---|
Kubernetes(K8S) 따배쿠 Pod : init container & infra container - Centos7 (1) | 2023.10.14 |
Kubernetes(K8S) 따배쿠 Pod : Pod 동작 flow - CentOS7 (0) | 2023.10.12 |
Kubernetes(K8S) 따배쿠 Container 정리와 Single / Multi Container Pod 생성 Centos7 (0) | 2023.10.11 |
Kubernetes(K8S) 따배쿠 yaml 템플릿 - Centos7 (0) | 2023.10.11 |