쿠버네티스 Healthcheck
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
containers:
- name: liveness
image: gcr.io/terrycho-sandbox/liveness:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
metadata:
name: readiness-rc
spec:
replicas: 2
selector:
app: readiness
template:
metadata:
name: readiness-pod
labels:
app: readiness
spec:
containers:
- name: readiness
image: gcr.io/terrycho-sandbox/readiness:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /readiness
port: 8080
healthcheck
쿠버네티스는 각 컨테이너의 상태를 주기적으로 체크해서 문제가 잇는 컨테이너를 자동으로 재시작하거나 또 문제가 있는 컨테이너(pod)를 서비스에서 제외 시킬수있다. 이러한 기능을 healthcheck라고 하고
컨테이너가 살아있는지 확인하는 방법 Liveness probe, 컨테이너가 서비스가 가능한지 확인하는 Realiness porb 2가지 방법이 있다.
Probe type
1. command probe
2. HTTP probe
3. TCP probe
1. command probe
컨테이너의 상태 체크를 쉘 명령을 수행하고 나서, 결과값을 가지고 컨테이너의 작동유무를 확인한다. 정상:0 , 비정상: 0 외 나머지값
이름: command-prob.yaml
내용
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
containers:
- name: liveness
image: gcr.io/terrycho-sandbox/liveness:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
Spex->liveness Probe-> exec ->command에 확인할 명령어를 넣는다. 정상:0 , 비정상: 0 외 나머지값
2. HTTP probe
흔한 방식이고 get을 이용하여 상태를 체크한다. 지정한 URL로 get을 보내어 리턴되는 http 응답코드로 확인하고 정상: 200~300 , 비정상: 나머지 값
제목: http-prob.yaml
내용
metadata:
name: readiness-rc
spec:
replicas: 2
selector:
app: readiness
template:
metadata:
name: readiness-pod
labels:
app: readiness
spec:
containers:
- name: readiness
image: gcr.io/terrycho-sandbox/readiness:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /readiness
port: 8080
spec->containes->readinessPorb->httpGet안에 paht와 port를 추가
이외로 서비스포트와 probe포트를 다르게 할 수 있다.
3. TCP probe
지정된 port에 tcp연결을 통해 판단한다. (정상: 연결, 비정상: 연결 안 됨)
제목 tcp-prob
내용
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod-tcp
spec:
containers:
- name: liveness
image: gcr.io/terrycho-sandbox/liveness:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
spec->liveness에 tcpSocket, initialDelaySecond, periodSeconds를 설정해준다.
Liveness Probe
간단하게 Liveness probe는 살아있는지 유무(컨테이너 생존), Readiness probe는 서비스가 가능한지 상태를 확인(서비스 가능 유무)하는 것이라 했는데 깊게 알아보자.
Liveness Probe
컨테이너의 상태를 주기적으로 체크해서 응답이 없으면 컨테이너를 자동으로 재시작해준다. 컨테이너가 정상적으로 기동중인지 체크하는 기능
probe가 pod 의 기동을 확인했고 kubelet으로 pod를 restart 시키는 그림
헬스체크 확인 방법중 command방법을 예로들면
/temp/healthy라는 임의에 파일에 아무런 글자가 적혀있다.
DockerFile을 작성할떄
FROM file:verson
EXPOSE 8080
COPY server.js
COPY healthy /tmp/
CMD node server.js> log.out
pod를 정의해보자
apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
containers:
- name: liveness
image: gcr.io/terrycho-sandbox/liveness:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
initalDelaySecond(컨테이너가 기동 되면서 애플리케이션이 기동될텐데, 설정 정보나 각종 초기화 작업이 필요하기 때문) 만큼 대기하고 periodSeconds에 정해진 주기 단위로 컨테이너의 헬스 체크를 한다.
파드확인하기
kubectl get pod
pod에 접속하여 파일 확인/삭제
kubectl exec -it liveness-pod cat /tmp/healthy
kubectl exec -it liveness-pod rm /tmp/healthy
파드확인하기
kubectl get pod -> restart num가 1 올라간다.
자세한 내용보기
kubectl descripbe pod liveness-pod
“Killing container with id docker://liveness:Container failed liveness probe.. Container will be killed and recreated.” 메세지가 나오면서 liveness probe 체크가 실패하고, 컨테이너를 재 시작
Readiness probe
컨테이너 체크중 liveness의 경우 컨테이너 비정상적으로 작동이 불가한 경우도 있지만, Configuration을 로딩하거나, 많은 데이타를 로딩하거나 ㅡ외부 서비스를 호출하는 경우에에는 일시적으로 서비스가 불가능한 상태가 될수 있다.
이런경우 컨테이너를 재시작한다 하더라도 정상적으로 서비스 불가능할 수가 있다. 이런 경우 일시적으로 서비스가 불가능한 상태로 마킹해주면 되는데 이러한 기능은 쿠버네티스의 버시스와 함께 사용하면 유용하다.
3개의 pod를 로드밸런싱으로 서비스를 하고 있을 때 Readiness porbe를 이용해서 서비스 가능 여부를 주기적으로 체크할결우 하나가 불가능상태가 되었을때 불가능한 상태로 체크하고 서비스목록에 제외 시킨다.
Liveness probe와 차이점은 Liveness probe는 컨테이너의 상태가 비정상이라고 판단하면, 해당 Pod를 재시작하는데 반해, Readiness probe는 컨테이너가 비정상일 경우에는 해당 Pod를 사용할 수 없음으로 표시하고, 서비스등에서 제외한다.
readiness를 호출하여 정상유무확인하기 (정상:200, 비정상:500)
이름: server.js
var os = require('os');
var fs = require('fs');
var http = require('http');
var handleRequest = function(request, response) {// 200,500 출력
if(request.url == '/readiness') {
if(fs.existsSync('/tmp/healthy')){
// healthy
response.writeHead(200);
response.end("Im ready I'm "+os.hostname() +" \n");
}else{
response.writeHead(500);
response.end("Im not ready I'm "+os.hostname() +" \n");
}
}else{
response.writeHead(200);
response.end("Hello World! I'm "+os.hostname() +" \n");
}
//log
console.log("["+
Date(Date.now()).toLocaleString()+
"] "+os.hostname());
}
var www = http.createServer(handleRequest);
www.listen(8080);
yaml파일 생성
이름: readiness-rc.yaml
내용:
apiVersion: v1
kind: ReplicationController
metadata:
name: readiness-rc
spec:
replicas: 2
selector:
app: readiness
template:
metadata:
name: readiness-pod
labels:
app: readiness
spec:
containers:
- name: readiness
image: gcr.io/terrycho-sandbox/readiness:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /readiness
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
HTTP 로 체크를 하는 HTTP Probe를 적용해보자 HTTP Probe는 , HTTP GET으로 /readiness URL로 5초마다 호출을 해서 HTTP 응답 200을 받으면 해당 컨테이너를 정상으로 판단하고 200~300 범위를 벗어난 응답 코드를 받으면 비정상으로 판단하여, 서비스 불가능한 상태로 인식해서 쿠버네티스 서비스에서 제외시킨다.
replication Controller로 인해 pod를 생성하여 로드벨런서를 연결시켜준다
파일: readiness-svc.yaml
내용:
apiVersion: v1
kind: Service
metadata:
name: readiness-svc
spec:
selector:
app: readiness
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
type: LoadBalancer
pod 확인하기
kubectl get pod
2개의 Pod가 기동중인것을 확인