클라우드/Kubernetes

쿠버네티스 Healthcheck

Cloud_Park 2020. 1. 13. 18:37
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

컨테이너의 상태를 주기적으로 체크해서 응답이 없으면  컨테이너를 자동으로 재시작해준다. 컨테이너가 정상적으로 기동중인지 체크하는 기능

https://bcho.tistory.com/1264?category=731548

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을 로딩하거나, 많은 데이타를 로딩하거나 ㅡ외부 서비스를 호출하는 경우에에는 일시적으로 서비스가 불가능한 상태가 될수 있다.

 이런경우 컨테이너를 재시작한다 하더라도 정상적으로 서비스 불가능할 수가 있다.   이런 경우 일시적으로 서비스가 불가능한 상태로 마킹해주면 되는데 이러한 기능은 쿠버네티스의 버시스와 함께 사용하면 유용하다.

https://bcho.tistory.com/1264?category=731548

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가 기동중인것을 확인