K8s 실전 활용을 위한 10단계 Ch.07
in Devops on Kubernetes
매니페스트와 파드
매니페스트를 작성하여 파드를 작성해보자.
매니페스트란 쿠버네티스의 오브젝트를 작성하기 위한 메타 정보를 YAML이나 JSON으로 기술한 파일이다. (주로 YAML을 사용)
파드를 단독으로 기동하는 매니페스트를 잓어하는 경우는 많지 않으며 보통 컨트롤러에 대한 매니페스트를 작성하게 되는데 이때 파드에 대한 정보를 기술하는 부분이 포함된다.
이를 파드 템플릿이라 하며 파드의 매니페스트와 같다. 그래서 이번 스텝에서는 파드를 단독으로 기술할 때 사용하는 매니페스트 기술법에 알아보자.
매니페스트 작성법
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
위 매니페스트는 kubectl run nginx --image=nginx:latest --restart=Never
를 실행한 것과 같은 의미를 갖는다.
metadata
는 파드의 이름을 지정하는 필수 항목이며 네임스페이스 내에서 유일해야한다.
spec
은 파드의 사양을 기술한다.
매니페스트 적용 방법
매니페스트 파일을 k8s 클러스터에 전송하여 오브젝트를 만드는 방법은 다음과 같다.
이는 파드뿐 아니라 모든 k8s 오브젝트에 적용할 수 있다.
kubectl apply -f 매니페스트_파일명.yaml
매니페스트를 통해 오브젝트를 만드는 kubectl 서브 커맨드로는 create
와 apply
가 있는데 둘의 차이점은 간단하다.
동일한 이름의 오브젝트가 있을 때 apply
는 매니페스트에 기술된 내용에 따라 오브젝트의 스펙을 변경하지만 create
는 에러를 반환한다.
기본적으로 클러스터 네트워크 상의 IP 주소는 클러스터 내에서만 접근이 가능하다. 때문에 kubectl을 통한 외부 클라이언트가 클러스터 내부에 있는 파드에 직접 접근은 서비스 없이는 불가능하지만, busybox
라는 도커 이미지를 사용하면 접근할 수 있다.
이는 임베디드 리눅스의 맥가이버 칼이라고도 불리는 유용한 명령어를 제공해주는 경량(1MB) 이미지이다.
파드의 헬스체크
LB에서는 헬스체크를 통해 서버 장애가 발생하면 해당 서버로의 트래픽 전송을 중지하고 나머지 서버들에게만 요청을 전송한다.
k8s에서는 노드에 상주하는 kubelet이 그 역할을 담당하게 된다.
kubelet의 헬스 체크는 다음 두 종류의 프로브를 사용해 실행 중인 파드의 컨테이너를 검사한다.
활성 프로브(Liveness Probe) : 컨테이너의 애플리케이션이 정상 실행 중인 것을 검사하고 검사에 실패하면 파드를 강제로 종료하고 재시작한다.
준비 상태 프로브(Readiness Probe) : 컨테이너의 애플리케이션이 요청을 받을 준비가 되었는지 아닌지를 검사하고 검사에 실패하면 서비스에 의한 요청 트래픽 전송을 중지한다.
파드의 컨테이너에는 프로브에 대응하는 핸들러를 구현해야하는데 이 핸들러는 컨테이너의 특성에 따라 다음 세 가지 중 하나를 선택할 수 있다.
exec : 컨테이너 내 커맨드를 실행. Exit 코드 0으로 종료하면 진단 결과는 성공으로 간주되며 그 외 값은 실패로 간주
tcpSocket : 지정한 TCP 포트번호로 연결할 수 있다면 진단 결과를 성공으로 간주
httpGet : 지정한 포트와 경로로 HTTP GET 요청이 정기적으로 실행. HTTP 상태 코드가 200이상 400미만이면 성공으로 간주, 그 외에는 실패로 간주. 지정 포트가 열려있지 않더라도 실패로 간주.
그러면 이제 직접 헬스 체크를 기술해보자.
여기서는 프로브에 대응하는 핸들러를 구현하고 있다.
apiVersion: v1
kind: Pod
metadata:
name: webapp
spec:
containers:
- name: weppapp
image: harry/webapp:0.1 # 핸들러가 구현된 이미지
livenessProbe: # 활성 프로브에 대한 핸들러 설정
httpGet:
path: /health_check
port: 3000
initialDelaySeconds: 3 # 처음으로 검사를 수행하기 전의 대기 시간
periodSeconds: 5 # 검사 간격
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 15
periodSeconds: 6
기본 설정으로는 활성 프로브가 연속해서 3번 실패하면 kubelet이 컨테이너를 강제 종료하고 재기동한다.