본문 바로가기

Framework and Tool108

Kubernetes - job and cron job - 출처: Kubernetes in action - 잡 리소스 레플리케이션 컨트롤러, 레플리카셋, 데몬셋은 지속적인 Task를 실행하므로 이런 종류로 생성한 리소스들의 파드들은 프로세스가 종료되면 다시 시작된다. 하지만 완료 가능한 Task 같이 프로세스 종료 후 재시작 하지 않는 유형도 고려해볼 수 있다. 쿠버네티스에서는 잡 리소스라는것으로 이런 작업 유형을 지원한다. 잡은 파드 내부의 컨테이너에서 실행중인 프로세스가 성공적으로 완료했다고 판단되면 컨테이너를 다시 시작하지 않는 파드를 실행핸다. 노드에 장애가 발생하면 잡이 관리하는 파드는 레플리카셋 파드와 동일하게 다른 노드로 스케줄링 된다. 만약 프로세스 자체적으로 장애가 있다면 설정에 따라 재시작할 것인지를 설정할 수 있다. 잡 리소스의 예로는 데.. 2022. 10. 21.
Kubernetes - ReplicaSet, DaemonSet - 출처: Kubernetes in action - 레플리카 셋 초기에는 레플리케이션 컨트롤러(이하 "rc") 만이 파드를 복제하고 노드에 장애가 발생하면 재 스케줄링 하는 유일한 쿠버네티스 구성요소였다. 이후 등장한 레플리카 셋은 차세대 구성요소이며, rc는 사장될 예정이다. 현재 쿠버네티스 rc 문서(https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/) 에서도 레플리케이션을 세팅할 때는 디플로이먼트를 사용할것을 권고하고 있다. rc와 레플리카셋은 거의 동일해서 하나만 알면 다른 하나를 사용하는데 무리가 없다. 일반적으로 레플리카셋 리소스를 직접 생성 하지는 않으며 상위 수준의 디플로이먼트 리소스를 이용한다. .. 2022. 10. 14.
Kubernetes - Replication controller - 출처: Kubernetes in action - 레플리케이션 컨트롤러 레플리케이션 컨트롤러(이하 "rc")는 쿠버네티스 리소스이며 파드가 항상 실행되도록 보장해준다. 어떤 워커노드가 다운 되거나 워커 노드 내에서 파드가 사라지면 감지해서 교체 파드를 생성한다. 직접 생성한 파드 A와 rc에 의해 생성된 파드 B가 같은 워커 노드에 있을 때 노드가 다운 된다면 파드 A는 유실되지만 파드 B는 rc에 의해 관리되기 때문에 새로 생성된다. - rc의 동작 rc는 실행중인 파드 목록을 모니터링해서 "특정" 유형의 파드수가 설정한 파드 수와 일치하는지를 확인한다. 모니터링해서 파드 수가 모자라면 신규 파드를 생성하며 파드가 많아지면 제거한다. 파드수가 모자라는 상황은 이해가 가는데 어떻게 파드가 많아질 수 있.. 2022. 10. 11.
Kubernetes - Liveness probe - 출처: Kubernetes in action - 파드 유지 쿠버네티스의 최대 장점은 컨테이너 목록을 제공하면 관리자가 신경쓰지 않아도 클러스터 어딘가에서 계속 실행되고 있다고 믿을 수 있다는것이다. 파드가 워커 노드에 스케줄링되면 노드의 kubelet은 컨테이너를 실행한다. 이때 주 프로세스에 crash가 발생하면 kubelet은 컨테이너를 재시작한다. 하지만 문제는 앱이 쓸 수 없게 되는 상황에서 언제나 crash가 발생하지는 않는다는것이다. 예를 들어 자바 앱에서 메무리 누수가 일어나는 경우 OOM이 일어날지언정 JVM 프로세스는 계속 실행된다. 이럴 경우 OOM 익셉션을 잡아서 재시작하면 되겠지만 이런식으로 모든 경우의 수를 대비할수는 없다. 그러므로 앱 내부 기능이 아닌 외부에서 앱의 상태를 .. 2022. 10. 10.
Kubernetes - Namespace - 출처: Kubernetes in action - 출처: https://github.com/ahmetb/kubectx - 네임스페이스 앞에서 배운 레이블을 통해 리소스를 그룹화할 수 있었다. 레이블은 하나의 오브젝트에 여러 개를 할당할 수 있으므로 오브젝트 그룹이 서로 겹칠 수 있다. 만약 레이블이 어떤 구조로 되어있는지 모르는 사용자가 kubectl을 통해 처음 리소스를 조회할 때 셀렉터를 지정하지 않고 조회하면 모든 오브젝트를 봐야 한다. 쿠버네티스는 한번에 하나의 그룹에서만 작업할 수 있도록 오브젝트를 그룹화해주는 네임스페이스 개념을 제공한다. 네임스페이스를 사용하면 많은 구성요소를 가진 복잡한 시스템을 더 작은 개별그룹으로 분리할 수 있다. 리소스를 개발, QA 같은 환경으로 나누거나 원하는 방.. 2022. 10. 9.
Kubernetes - Label 및 Annotation - 출처: kubernetes in action - 레이블 파드 예제에서는 2개 정도밖에 생성해보지 않았지만 실제 환경에서는 서비스 규모에 따라 컴포넌트가 수십개 이상이 될수도 있다. 여기에 개발, 운영과 같은 환경까지 고려하면 배수만큼 늘어나므로 파드들을 관리하기가 쉽지 않다. 레이블은 개발자나 시스템 관리자가 파드를 쉽게 그룹화할 수 있도록 해준다. 레이블을 활용하면 파드에 대한 작업을 수행할 때 개별적으로 하지 않고 한꺼번에 할 수 있다. 파드를 기반으로 설명했지만 레이블은 다른 쿠버네티스 리소스에도 적용할 수 있다. 리소스에 키/값 형태를 추가하고 레이블 셀렉터를 통해 리소스 선택시 활용한다. 실제로 레이블을 활용하는 예로는 앱이나 배포 환경에 대한 레이블을 붙이는것이다. app에는 파드가 속한 .. 2022. 10. 9.
Kubernetes - Pod - 출처: Kubernetes in action - 파드 파드는 하나 이상의 컨테이너 그룹이다. 쿠버네티스는 컨테이너를 개별적으로 배포하지 않으며 컨테이너 그룹인 파드를 배포 및 운영한다. 파드에 속한 컨테이너 그룹은 하나의 워커 노드에 배포된다. 즉 파드 내의 컨테이너들은 각각 다른 워커 노드에 배포되지 않는다. 단순히 기술적인 관점에서는 여러 프로세스를 하나의 컨테이너에서 실행시킬 수 있다. 하지만 이 방법은 권고되지 않는다. 컨테이너는 단일 프로세스를 실행할 목적으로 설계되었다. (자식 프로세스를 생성하는 경우는 예외) 만약 단일 컨테이너에서 여러 프로세스를 실행하면 아래와 같은 문제가있다. 여러 프로세스가 로그를 동일 표준 출력에 기록하면 관리하기가 난해하다. 프로세스별로 재시작하는 매커니즘을 원.. 2022. 10. 9.
Kubernetes - deploy app tutorial - 출처: Kubernetes in action - 출처: https://kubernetes.io/docs/concepts/overview/components/ - 출처: https://preiner.medium.com/kubernetes%EC%9D%98-%EC%9D%B4%ED%95%B4-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-17245a0d5f4d - 앱 실행 일반적으로 쿠버네티스에 앱을 배포할때는 구성 요소를 기술한 JSON이나 YAML 매니페스트를 준비해야 하지만 첫번째 앱 배포 예제이므로 간단한 방법으로 배포해본다. 책에서는 "kubectl run" 명령어를 통해 레플리케이션 컨트롤러를 생성하여 파드 생성을 제어한다. 그러기 위해 명령어 옵션에 "--generator=r.. 2022. 10. 6.
Kubernetes - cluster 생성 - 출처: kubernetes in action - 출처: https://kubernetes.io/docs/concepts/overview/components/ - Kubernetes cluster 설치 이전까지 살펴본 Docker 학습은 쿠버네티스 클러스터에 배포하기 위한 준비 과정이라고 볼 수 있다. 이제 본격적으로 쿠버네티스 클러스터를 설치하여 배포해보자. 회사내에서 사용하는 규모 정도되면 다중 노드 쿠버네티스 클러스터 설치해야 하는데 이는 단순한 작업이 아니다. 쿠버네티스 지식뿐만 아니라 리눅스와 네트워크에 관한 상당한 지식도 요구하기 때문이다. 클라우드 공급자를 통해 설치하는 대신 학습 목적을 위해 단일 노드 클러스터인 minikue를 이용한다. kubeadm 으로도 설치할 수 있지만 쿠버네티스.. 2022. 10. 6.
Kubernetes - Docker basic - 출처: Kubernetes in action - Docker를 사용한 컨테이너 이미지 생성 간단한 Node.js 앱을 만들어서 컨테이너 이미지로 패키징해보자. 앱의 기능은 http 요청을 받아 해당 호스트머신의 이름을 응답하는 것이다. 위의 코드는 8080으로 http 서버를 시작하고 모든 요청에 대해 200을 상태코드와 함께 hostname 정보를 응답한다. 위의 앱을 이미지로 패키징하려면 우선 Dockerfile을 생성해야 한다. Dockerfile은 이미지를 생성하기 위해 수행해야할 사항들을 기술한 파일이라고볼 수 있다. FROM node:7 ADD app.js /app.js ENTRYPOINT ['node', 'app.js'] app.js와 동일한 path에 위의 내용으로 Dockerfile을.. 2022. 10. 6.