Kubernetes
- 오브젝트 생성 명령어 : 컨테이너, 파드, 디플로이먼트, 잡 컨트롤러
- 매니페스트
1교시
쿠버네티스 실습은 베이그란트/EKS 뭘 쓰던 상관없지만, 스토리지 실습 때는 베이그란트 환경은 사전 작업이 필요.
나는 EKS로 진행해야징
EKS 환경 구축 명령어
eksctl create cluster --name eks-demo --version 1.18 --region ap-northeast-2 --nodegroup-name linux-noded --nodes 3 --nodes-min 1 --nodes-max 4 --ssh-access --ssh-public-key [키페어명] --node-type t3.medium --managed
삭제는
eksctl delete cluster --name eks-demo
호스트에서 AWS 안으로 들어간다.
-> 쿠버네티스 서버(Fargate. 전적으로 AWS가 관리한다) 안에 노드를 3개 만들어놓은 상태.
-> 이 서버가 포함된 클러스터는 k8s로 만들었고, 관리는 EKS 서비스가 해주고 있다.
-> 호스트에서 kubectl 명령어로 AWS 안의 k8s 클러스터에 명령 전달
-> 서버에 있는 API가 요청을 받아 각 노드에 뿌린다
-> 노드에 있는 kubelet이 서버로부터 받은 명령에 따라 내부에 파드 생성, 파드 안에 컨테이너 생성
kubectl run [오브젝트 이름] --image=[이미지명] -it --restart=Never
-> run의 기본값은 앞에 container가 있다.
-> 오브젝트는 파드, 컨트롤러, 서비스 등등
-> --image의 기본값은 docker hub
-> -it는 도커에서 쓰던 것과 동일. 터미널에 출력하기
-> --restart 옵션에 따라 파드의 가동 방법 변경 : 컨트롤러 부착
Never는 파드가 직접 가동된다(단독 실행형 파드)
(Always/OnFailure는 컨트롤러를 통해 파드 가동)
-> 뒤에 --rm 옵션을 붙이면 실행이 끝난 후 자동으로 삭제된다
kubectl config get-contexts을 실행해서 환경들을 볼 수 있는데, *가 있는 것이 기본값이자 현재 사용 중인 환경
명령을 실행하면 *가 있는 환경으로 날아간다.
2교시
NAME : 오브젝트명
READY : 가동 중인 컨테이너 수
AGE : 오브젝트 생성 후 지난 시간
STATUS가 CrashLoopBackOff라면 이 파드가 어떤 문제 때문에 재시작을 반복하고 있다는 의미
이 조회 명령을 -o wide 옵션을 붙여서 실행하면 더 많은 필드를 볼 수 있다.
kubectl run 명령어를 실행하면
-> kubectl이 쿠버네티스에게 명령 전달
-> 노드에 이미지가 없으면 원격 리포지토리(도커 허브)에서 다운로드
-> 노드의 containerd가 컨테이너 실행
-> kubectl이 터미널에 메시지 표시
파드가 정지되었을 때 재가동시킬 필요가 있는지에 따라 --restart 옵션 부여.
파드를 디플로이먼트 컨트롤러의 제어 하에 실행하려면 --restart 옵션의 값을 Always로 작성
--restart의 기본값은 Always다. 이 경우 백그라운드에서 실행되기에 -it 옵션은 무시된다.
-> -it는 빼고 실행하는 것이 좋다.
kubectl get all
-> 파드/서비스 등을 전부 출력
엥? 디플로이먼트가 안나오네? kubectl get deploy해도 안나온다.
기존 디플로이먼트 부착한 파드 삭제하고 : kubectl delete pod hello-world
새로 하나 만들자 : kubectl create deployment --image=[이미지명] [디플로이먼트 이름]
3교시
Deployment controller : 파드를 지정된 개수를 유지해주는 컨트롤러
-> 디플로이먼트 생성 시 ReplicaSet이 같이 생성됨 : 파드의 지정 개수
디플로이먼트는 레플리카셋 기준으로 파드를 만들고 유지한다.
-> 레플리카셋의 DESIRED 필드가 유지할 개수, CURRNET가 현재 개수
-> 디플로이먼트의
UP-TO-DATE 필드는 최근에 업데이트된 파드의 개수
AVAILABLE은 정상 가동되어 서비스 가능한 파드의 개수
디플로이먼트 조정 : DESIRED 파드 개수를 변경
kubectl scale --replicas=[변경할 스케일] [디플로이먼트 이름]
생성과 조정을 한 번에 할 수도 있다.
생성 시 --replicas=[스케일] 옵션을 붙이면 된다.
디플로이먼트 삭제 시 이름 작성에 주의 : deployment.apps/webserver 이렇게 전부 적지 말고 webserver만 적으면 된다.
4교시
Job controller
파드가 비정상 종료하면 재시작. 파드가 정상 종료할 때까지 지정된 횟수만큼 재실행.
서버 타입의 파드 제어(컨트롤러에 의한 제어)
-> 요구를 계속 대기하면서 종료하지 않는다.
-> 수평 스케일
-> 비정상 종료 시 가동
단독 파드 구동
-> 비정상으로 종료해도 가동하지 않음
-> 컨테이너 종료 후 삭제 필요
-> 수평 스케일 X
대충 요약
1. 도커/쿠버네티스 모두 리포지토리로 이미지를 다운받아 컨테이너 가동
2. kubectl은 쿠버네티스 조작을 위한 기본적인 도구
3. 파드는 쿠버네티스에서 컨테이너의 최소 가동 단위
4. 파드를 관리할 컨트롤러는 워크로드에 맞게 선택
5. 디플로이먼트는 지속적 서비스를 제공해야 하는 워크로드(웹 서버, API 서버 등)에 적합한 컨트롤러
5교시
- Manifest
쿠버네티스의 오브젝트를 생성하기 위한 메타 정보를 YAML/JSON으로 작성한 파일.
보통 컨트롤러에 대한 매니페스트를 작성하고 파드에 대한 정보를 기술하는 부분이 포함된다(파드 템플릿)
kubectl apply -f [매니페스트 파일명]
이후 노드의 IP 주소 확인(kubectl get pod -o wide)
파드에 접근해 컨테이너 생성/접속
-> kubectl run busybox --image=busybox --restart=Never --rm -it sh
매니페스트 파일로 만들었으니 삭제할 때도
kubectl delete -f [매니페스트 파일명]
6교시
- 매니페스트와 파드 - 파드의 헬스 체크 기능
-> 파드의 컨테이너에 있는 애플리케이션이 정상적으로 가동 중인지 확인하는 기능.
이상이 감지되면 컨테이너를 강제 종료/재시작할 수 있다.
활성 프로브(Liveness Probe)
컨테이너의 앱이 정상적으로 실행 중인 것을 검사. 검사에 실패하면 파드 상의 컨테이너를 강제 종료 후 재시작
-> 사용하려면 매니페스트에 명시적으로 설정 필요
준비 상태 프로브(Readiness Probe)
컨테이너의 앱이 요청을 받을 준비가 되었는지 검사. 검사에 실패하면 서비스에 의한 요청 트래픽 전송 중지
(준비가 될 때까지 요청을 전송하지 않기 위해)
-> 이 또한 사용하려면 매니페스트에 명시적 설정 필요
예시) HTTP로 헬스 체크를 하는 경우
1. http://파드 IP 주소:포트번호/healthz를 정기적으로 확인하도록 하고, 이에 대한 응답을 반환하도록 구현
2. 파드의 컨테이너에 프로브에 대응하는 핸들러 구현
-> exec, tcpSocket, httpGet
실행 직후 파드 상태를 보면 상태는 Running인데 Ready는 0인 순간이 있다.
-> 요청에 응답이 가능해질 때 1이 된다.
이번에는 kubectl logs webapl을 실행해서 로그 기록을 보자.
이번에는 kubectl describe pod webapl을 실행해서 상세 정보 확인
7~8교시
https://kubernetes.io/docs/reference/kubernetes-api/
매니페스트 파일 작성 방법 문서
- 사이드카 패턴 : 하나의 파드 안에 여러 개의 컨테이너를 담아서 동시에 실행시키는 패턴
여러 개의 컨테이너를 조합하여 사용 -> 컨테이너의 재사용/생산성이 높아진다
매번 필요에 맞는 컨테이너를 만드는 것이 아니라 전에 만든 컨테이너를 재활용할 수 있어 단기간에 결과를 볼 수 있다.
'교육' 카테고리의 다른 글
[103일 차] 21.12.17 : 자습 1 (0) | 2021.12.17 |
---|---|
[102일 차] 21.12.16 : Kubernetes 4 (0) | 2021.12.16 |
[99일 차] 21.12.13 : Kubernetes 1 (0) | 2021.12.13 |
[98일 차] 21.12.10 : Docker (0) | 2021.12.10 |
[97일 차] 21.12.09 : Terraform 6 (0) | 2021.12.09 |
댓글