일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Mac
- Docker
- redash
- Zeppelin
- 로그인
- 자바
- Kafka
- SpringBoot
- spring
- 예제
- 머신러닝
- 간단
- config
- 자동
- Cluster
- vue
- hive
- fastcampus
- java
- login
- ec2
- Jenkins
- 레디스
- Redis
- gradle
- EMR
- 설정
- aws
- 클러스터
- 젠킨스
- Today
- Total
코알못
[CKA] Kubernetes Self-healing LivenessProbe 본문
쿠버네티스는 self-healing 기능이 있으며 Liveness Probe를 이용하면 해당 기능을 사용할 수 있다.
아래와 같이 spec.containers 부분에 정의하며
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: my-nginx
image: nginx
licenessProbe:
httpGet:
path: /
port: 80
위에 httpGet 방식 포함하여 세가지가 있어 서비스에 맞게 사용하면 된다.
매커니즘 | 형식 | 어떻게 확인 |
httpGet | httpGet: path: / port: 80 |
지정된 port, path를 주기적으로 호출하여 200이 아닌 값이 나오면 컨테이너 다시 시작 |
tcpSocket | tcpSocket: port: 22 |
지정된 포트로 TCP 연결 시도하여 연결 되지 않으면 컨테이너 다시 시작 |
exec | exec: command: - ls - /data/file |
명령 전달하고 종료코드가 0이 아니면 컨테이너 다시 시작 |
우선 nginx yaml 파일을 생성한다.
[node1 ~]$ kubectl run my-nginx --image=nginx --dry-run=client -o yaml > nginx.yaml
그 다음 아래에 livenessProbe를 추가 해보자!
# nginx.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: my-nginx
name: my-nginx
spec:
containers:
- image: nginx
name: my-nginx
ports:
- containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 80
그리고 해당 yaml 파일로 컨테이너를 생성한다.
[node1 ~]$kubectl create -f nginx.yaml
pod/my-nginx created
[node1 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx 1/1 Running 0 8s
해당 컨테이너에 대한 상세 정보를 보면 Liveness 부분에 default 값이 정의 되어 있다.
[node1 ~]$ kubectl describe pod my-nginx
..
Liveness: http-get http://:80/ delay=0s timeout=1s period=10s #success=1 #failure=3
각 의미하는 바와 만약 default 말고 설정 값을 변경하고 싶다면 yaml명을 보고 정의해주면 된다.
기능 | 내용 | yaml 명 |
delay | 체크 로직 언제 부터 시작할 것 인가 | initalDelaySeconds |
timeout | 몇초 뒤에 응답 없으면 실패로 판단 할 것 인가 | timeoutSeconds |
period | 간격을 어느정도 두고 체크 할 것 인가 | periodSeconds |
success | 연속 몇번 성공해야 성공으로 판단 | successThreshold |
failure | 연속 몇번으로 실패해야 실패로 판단 | failureThreshold |
현재 러닝중인 파드의 liveness 설정을 yaml 형태로 보고 싶다면 아래와 같이 -o 를 이용하여 확인 할 수 있다.
[node1 ~]$ kubectl get pod my-nginx -o yaml
...
spec:
containers:
- image: nginx
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
httpGet:
path: /
port: 80
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
정말 이슈가 있을때 liveness가 리스타트를 해주는지 확인을 위해 연습용 이미지인 smlinux/unhealthy 를 이용해보자!
해당 이미지는 5번째 호출까지 200을 리턴하며 그 이후에는 500을 리턴한다.
아래와 같이 yaml 파일을 생성한뒤
# liveness.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: my-nginx
name: my-nginx
spec:
containers:
- image: smlinux/unhealthy
name: liveness
ports:
- containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 8080
해당 파일을 이용하여 파드를 생성한다.
[node1 ~]$ kubectl create -f liveness.yaml
pod/my-nginx created
최초에 러닝 상태이며 기본 liveness 설정이 있으니 10s 간격으로 8080을 호출 할 것이다.
NAME READY STATUS RESTARTS AGE
my-nginx 1/1 Running 0 35s
80s 뒤에 다시 파드 상태를 보면 컨테이너가 재기동 되어 RESTARTS 부분에 1로 카운팅 된것을 볼 수 있다.
[node1 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx 1/1 Running 1 (10s ago) 2m11s
파드가 어떻게 되어 재기동 되었는지 보기 위해 describe를 통해 보면 75s 에 3번 fail 발생하여 컨테이너를 재기동 한것을 볼 수 있다.
[node1 ~]$ kubectl describe pod my-nginx
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m26s default-scheduler Successfully assigned default/my-nginx to node2
Normal Pulled 2m9s kubelet Successfully pulled image "smlinux/unhealthy" in 16.619266941s (16.619284142s including waiting)
Warning Unhealthy 55s (x3 over 75s) kubelet Liveness probe failed: HTTP probe failed with statuscode: 500
Normal Killing 55s kubelet Container liveness failed liveness probe, will be restarted
Normal Pulling 25s (x2 over 2m25s) kubelet Pulling image "smlinux/unhealthy"
Normal Created 25s (x2 over 2m9s) kubelet Created container liveness
Normal Pulled 25s kubelet Successfully pulled image "smlinux/unhealthy" in 682.784937ms (682.820938ms including waiting)
Normal Started 24s (x2 over 2m8s) kubelet Started container liveness
이제 다른 예제로 busybox 이미지(리눅스에서 필요한 명령어들만 모아 놓은 이미지)를 이용하여 /tmp/healthy 파일을 생성한뒤 30s 뒤에 해당 디렉토리를 삭제 하도록 하고
liveness 체크를 /tmp/healthy 파일 존재 여부로 잡아보자!
체크는 pod 실행뒤 10s뒤, 5s 마다 체크, 연속 1번 성공시 성공, 연속 2회 실패시 실패로 판단하도록 한다.
우선 아래 명령어를 통해 yaml 파일을 만들고
[node1 ~]$ kubectl run liveness --image=busybox --dry-run=client -o yaml > liveness-exec.yaml
yaml 파일에 liveness 부분과 디렉토리 삭제하는 명령어를 넣는다.
# liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: liveness
name: liveness
spec:
containers:
- image: busybox
name: liveness
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- ls /tmp/healthy
initialDelaySeconds: 10
periodSeconds: 5
successThreshold: 1
failureThreshold: 2
이제 해당 yaml 파일로 파드를 생성하면
$ kubectl create -f liveness-exec.yaml
파드가 정상적으로 생성 된 것을 볼 수 있다.
[node1 ~]$ kubectl get pod liveness
NAME READY STATUS RESTARTS AGE
liveness 1/1 Running 0 10s
파드 정보를 보면 아래와 같이 원하는바대로 설정 되었으며 Events 부분을 보면 /tmp/healthy 파일을 찾지 못하여 리스타트 된것을 볼 수 있다.
[node1 ~]$ kubectl describe pod liveness
Liveness: exec [ls /tmp/healthy] delay=10s timeout=1s period=5s #success=1 #failure=2
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m48s default-scheduler Successfully assigned default/liveness to node2
Normal Pulled 2m47s kubelet Successfully pulled image "busybox" in 679.302748ms (679.342749ms including waiting)
Normal Pulled 97s kubelet Successfully pulled image "busybox" in 695.942777ms (695.971378ms including waiting)
Warning Unhealthy 58s (x4 over 2m13s) kubelet Liveness probe failed: ls: /tmp/healthy: No such file or directory
Normal Killing 58s (x2 over 2m8s) kubelet Container liveness failed liveness probe, will be restarted
Normal Pulling 28s (x3 over 2m48s) kubelet Pulling image "busybox"
Normal Created 27s (x3 over 2m47s) kubelet Created container liveness
Normal Started 27s (x3 over 2m47s) kubelet Started container liveness
Normal Pulled 27s
다시 파드 RESTART 부분을 보면 카운트가 증가한것을 볼 수 있다.
[node1 ~]$ kubectl get pod liveness
NAME READY STATUS RESTARTS AGE
liveness 1/1 Running 5 (21s ago) 6m12s
끝!
'ETC' 카테고리의 다른 글
[CKA] kubernetes 리소스 조정(CPU,MEM) (0) | 2023.08.29 |
---|---|
[CKA] Kubernetes init & infra & static container (0) | 2023.08.24 |
[CKA] yaml 및 APIVersion (0) | 2023.08.12 |
[CKA] Kubernetes 동작 원리 및 namespace (0) | 2023.08.12 |
[CKA] Pod 생성 하기 (0) | 2023.08.11 |