분류 전체보기
Docker 명령어와 엔트리포인트(CMD vs ENTRYPOINT)
도커 컨테이너 안에서는 어떤 프로세스가 실행되나? 이미지마다 다르지만, 이미지 내부에는 어떤 프로세스를 실행할지 정의되어 있다. 바로 Dockerfile의 CMD 항목이다. 예를 들어, nginx 이미지에서는 CMD ["nginx"]mysql 이미지에서는 CMD ["mysqld"] 이런 식으로 정의되어 있고, 컨테이너 실행 시 이 명령이 자동 실행된다. 하지만 Ubuntu 이미지는 CMD ["bash"] 로 되어 있다. bash는 터미널 환경이 있어야 동작하는데, 도커는 기본적으로 터미널을 붙이지 않기 때문에 bash가 바로 종료되고, 컨테이너도 종료된다. CMD 덮어쓰기: 실행할 명령어 바꾸기 docker run 명령 뒤에 명령어를 붙이면, 이미지에 정의된 CMD를 덮어쓸 수 있다.docker run..
Kubernetes Deployment 업데이트와 롤백
Kubernetes - Deployment 업데이트와 롤백(rollback) Deployment는 단순히 파드를 생성하는 역할만 하는 게 아니라, 애플리케이션의 버전을 관리하고 롤백할 수 있는 기능도 지원한다. 이를 통해 배포 중 문제가 생겼을 때 손쉽게 이전 버전으로 복구할 수 있다. 롤아웃(Rollout)과 리비전(Revision) Deployment를 처음 생성하면 하나의 **롤아웃(Rollout)**이 시작되고, 리비전 1이 만들어진다.kubectl create -f deployment.yaml이후, 애플리케이션 버전을 업데이트하면 다시 롤아웃이 발생하고, 그때마다 새로운 **리비전(Revision)**이 생성된다. 예를 들어 새로운 컨테이너 이미지로 업데이트하면 리비전 2가 생기는 식이다. ..
Kubernetes Logging
Logging의 필요성Kubernetes를 사용하다보면 클러스터에서 실행 중인 애플리케이션의 로그를 어떻게 확인하는지가 매우 중요하다. 따라서 기본적인 로깅 메커니즘을 숙지하는 것은 매우 중요한 요소이다. Docker에서의 로그 확인방법Docker에서는 다음과 같은 명령어를 통해 이미지를 컨테이너를 실행시킨다. docker run test-app 여기서 run 옵션에 `-d`를 추가하면 detached 모드로 실행되는데 백그라운드로 실행되므로 로그가 보이지 않는다. 이 때 로그를 확인하는 방법은 다음과 같다. docker logs docker logs -f # 실시간으로 로그를 볼 수 있음 Kubernetes에서의 로그 확인 방법 동일한 test-app 이미지를 Kubernetes Pod로 배포한..
Kubernetes Monitoring
IntroKubernetes 클러스터를 모니터링하면서 가장 궁금한 부분은 아무래도 클러스터 내의 노드 개수, 각 노드의 상태, CPU, 메모리, 네트워크, 디스크 사용량과 같은 성능 지표들일 것이다. 따라서 이러한 모니터링 데이터를 수집하고 저장하기 위한 솔루션이 필요한데, 이를 위한 다양한 오픈소스 / 상용 솔루션들이 존재한다. 오픈소스 솔루션으로는 Metrics Server, Prometheus, Elastic Stack 등이 있으며 상용 솔루션으로는 Datadog, Splunk 등이 존재한다. 초기 Kubernetes에서는 Heapster라는 솔루션이 사용되었으나 현재는 Metrics Server가 사용되고 있다.Metrics Server는 클러스터마다 하나씩 설치되며, 이 서버는 각 노드와 Pod..
Kubernetes Admission Controller의 두 가지 유형
Admission Controller의 두 가지 유형1. Validating Admission Controller 요청을 검증한 후 통과/거부 여부를 결정한다. 에를 들어 NamespaceExists가 활성화되어 있는경우 Namespace가 없으면 요청을 거부한다. 2. Mutating Admission Controller 요청을 수정하여 API 서버로 전달한다.예를 들어 DefaultStorageClass가 설정된 경우 PVC 생성 요청에 StorageClass가 없으면 DefaultStorageClass를 자동으로 삽입한다. 실행 순서Mutating Admission Controller가 먼저 실행된 후 Validating Admisson Controller가 요청을 검증한다. 해당 순서가 중요한 이..
Kubernetes Admission Controller
Kubernetes API Request Flow우리가 평소에 kubectl 명령어로 Pod를 만들거나 Service를 만들 때, 요청은 Kubernetes의 API server로 전달된다. API server는 다음과 같은 일련의 과정을 거쳐 작업을 수행하게된다. 1. Authenticaion클러스터는 먼저 이 요청이 누구로부터 온 것인지 Authentication 과정을 거친다. 보통은 kubeconfig에 있는 인증서 정보를 활용해서 인증을 진행한다. 2. Authorization이 사용자가 해당 작업을 할 수 있는 권한이 있는지를 확인한다.RBAC(Role Based Access Control)에 의해 create, get, delete와 같은 작업 권한이 체크된다. RBAC의 한계RBAC만으로도..
(TIL) Scheduler Profiles
기본 스케줄링 흐름1. Pod 생성 시 스케줄링 큐에 할당된다. 큐 내부에서는 Priority에 따라 정렬된다. `PrioritySort` 플러그인을 통해 Priority가 높은 순으로 정렬되며 이 우선순위는 PriorityClass resource를 만들어 설정할 수 있다.apiVersion: scheduling.k8s.io/v1kind: PriorityClassmetadata: name: high-priorityvalue: 1000000 2. 이후 큐에 있는 Pod가 POP되면 필터링을 거치게된다. 필터링과정에서 Pod이 요구하는 조건을 충족시키지 못하는 노드를 제외시키며 이 과정은 `NodeResourcesFit` 플러그인이 담당한다. Pod의 nodeName 필드가 지정된 경우 `NodeName..
(TIL) Kubernetes Custom Scheduler
Kubernetes Multiple SchedulersKubernetes에는 기본적으로 default-scheduler가 존재한다.하지만 특정 서비스에 대해 다른 스케줄링 알고리즘, 비즈니스 로직 기반 배치, 커스텀 스케줄링 로직등을 사용하고 싶을 수 있다.이를 위해 우리는 Multiple Scheduler, 다른 말로 Custom Scheduler를 구성할 수 있다. Custom Scheduler 생성 방법1. kube-scheduler binary kube-scheduler라는 프로그램(바이너리 파일)을 사용해서 스케줄러를 추가로 실행시킬 수 있다. `/usr/local/bin/kube-scheduler --config=/etc/kubernetes/custom-scheduler.yaml`위와 같이 ..