Kubernetes는 어떠한 이유로 충돌이 발생하면 컨테이너를 다시 시작한다. Traffic을 보낼 정상 컨테이너를 식별하고 필요할 때 다시 시작하도록 구성할 수 있는 Liveness 및 Readiness Probe를 사용한다.
ㅁ Liveness Probe: Kubernetes에서 Pod가 살아있는지 죽었는지 확인할 때 사용된다. Pod는 다양한 이유로 Dead 상태로 될 수 있는데 Kubernetes는 Liveness probe가 통과하지 못하면 Pod를 죽이고 다시 만든다.
clarkshim.tistory.com/76?category=1003649
ㅁ Readiness Probe:
Kubernetes에서 포드가 트래픽을 받을 준비가 되어 있는지 알기 위해 사용된다. Readiness Probe가 통과 할 때만 Pod가 서비스에 연결되어 트래픽을 수신한다.
Readiness Probe가 실패하면 트래픽이 Pod로 전송되지 않는다.
ㅁ Liveness Probe 구성
ㅇ릴단 healthcheck 디렉토리를 생성
mkdir -p ~/environment/healthchecks
아래와 같이 ~/environment/healthchecks/liveness-app.yaml 메니페스트를 만든다.
해당 파일에서 livenessProbe 필드는 kubelet이 컨테이너가 정상인지 여부를 고려하기 위해 컨테이너를 확인하는 방법을 결정한다.
- kubelet은 periodSeconds 필드를 사용하여 컨테이너를 지속적으로 확인합니다. 해당 yaml 파일에서 kubelet은 5초마다 liveness probe를 체크한다.
- initialDelaySeconds 필드는 kubelet에게 첫번째 프로브를 수행하기 전에 5초 동안 기다려야 한다고 알리는데 사용한다.
- probe를 수행하기 위해 kubelet은 포드를 호스팅하는 서버에 HTTP GET 요청을 보내고 서버에 /helath에 대한 핸들러를 체크하여 success code를 return하면 컨테이너가 정상으로 간주하고 실패 코드를 return 하면 kubelete은 컨테이너를 종료하고 다시 시작한다.
ㅇ 매니페스트 생성
cat <<EoF > ~/environment/healthchecks/liveness-app.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-app
spec:
containers:
- name: liveness
image: brentley/ecsdemo-nodejs
livenessProbe:
httpGet:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
EoF
ㅇ 매니페스트로 Pod 생성
$ kubectl apply -f ~/environment/healthchecks/liveness-app.yaml
ㅇ liveness-app pod 상태 확인
$ kubectl get pod liveness-app
ㅇ kubectl describe 명령을 통해 프로브 실패 또는 재시작을 표시하는 이벤트 기록을 확인 가능
$ kubectl describe pod liveness-app
ㅇ 컨테이너 상태 확인
$ kubectl logs liveness-app
ㅇ kubectl logs 컨테이너의 이전 인스턴스화에서 로그를 검색하기 위해서는 --previous 플래그를 사용
$ kubectl logs liveness-app --previous
ㅁ Readiness Probe 구성
Readiness Probe를 구성하기 위해 빈 파일 /tmp/healthy를 생성하고 이를 사용하여 kubelet이 정상적인 포드만으로 Deployment를 업데이트하는데 어떻게 도움이 되는지 이해할 수 있다.
cat <<EoF > ~/environment/healthchecks/readiness-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: readiness-deployment
spec:
replicas: 3
selector:
matchLabels:
app: readiness-deployment
template:
metadata:
labels:
app: readiness-deployment
spec:
containers:
- name: readiness-deployment
image: alpine
command: ["sh", "-c", "touch /tmp/healthy && sleep 86400"]
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 3
EoF
이제 Readiness Probe를 테스트 하기 위해 Deployment를 만든다.
$ kubectl apply -f ~/environment/healthchecks/readiness-deployment.yaml
적용 상태를 확인한다.
$ kubectl get pods -l app=readiness-deployment
서비스가 deployment로 가리킬때 모든 리플리카는 트래픽을 처리할 수 있다는 것을 확인한다.
$ kubectl describe deployment readiness-deployment | grep Replicas:
ㅇ 실패 테스트
수행중인 파드중 하나의 /tmp/healthy 파일을 지워 readiness probe가 fail 되는 것을 확인
$ kubectl exec -it <YOUR-READINESS-POD-NAME> -- rm /tmp/healthy
정상적으로 연결이 되지 않는 것을 볼 수 있다.
$ kubectl get pods -l app=readiness-deployment
Pod를 다시 정상으로 만들려면 /tmp/healthy 파일을 다시 만든다.
$ kubectl exec -it <YOUR-READINESS-POD-NAME>> -- touch /tmp/healthy
ㅁ 테스트 환경을 제거하는 방법은 설치한 yaml을 가지고 그대로 삭제하면 된다.
$ kubectl delete -f ~/environment/healthchecks/liveness-app.yaml
$ kubectl delete -f ~/environment/healthchecks/readiness-deployment.yaml
'AWS EKS 실습 > EKS Beginner' 카테고리의 다른 글
Kubernetes access 관리를 위한 IAM Groups 사용 (1) | 2021.02.25 |
---|---|
Intro to RBAC (0) | 2021.02.24 |
Autoscaling with HPA and CA (0) | 2021.02.24 |
Helm으로 nginx 설치 (0) | 2021.02.19 |
Sample Application 배포 (0) | 2021.02.18 |