개발 이야기/쿠버네티스 21

쿠버네티스 - 잡과 스케줄러 - 19

작업을 완료한 후에는, 종료되는 서비스가 있을 수 있다. 쿠버네티스는 '잡' 이라는 리소스로 해당 기능을 지원한다. 잡을 통해, 파드 내부 프로세스가 완료되면 해당 파드를 완료 시킬 수 있다. 물론 완료에 실패하면 이후처리를 결정 할 수 있다. 때문에 잡은 제대로 완료되는 것이 중요한 작업에 매우 유용하다. 이러한 작업의 좋은 예는 배치 작업이 있다. apiVersion: batch/v1 kind: Job metadata: name: batch-example spec: template: metadata: labels: app: batch-example spec: restartPolicy: OnFailure containers: - name: main image: 배치를 실행할 이미지 kubectl get..

쿠버네티스 - 레플리카셋 - 18

레플리카셋은 우리가 배웠던 레플리케이션을 대체할 새로운 요소다. 레플리케이션컨트롤러와 레플리카셋의 차이점은 다음과 같다. 1. 레플리카셋은 특정 레이블이 없는 파드를 매칭시킬 수 있다. 2. 레플리카셋은 특정 레이블의 키를 갖는 파드를 매칭시킬 수 있다. (key=*) 3. 두개의 레이블의 조합으로 파드를 매칭시킬 수 있다. apiVersion: apps/v1 kind: ReplicaSet metadata: name: suk9-rc spec: replicas: 3 selector: matchLabels: app: suk9-rc template: metadata: labels: app: suk9-rc spec: containers: - name: suk9-rc image: seokkyulee/suk9 po..

쿠버네티스 - 레플리케이션컨트롤러 - 17

레플리케이션컨트롤러의 역할은 실행중인 파드의 수를 레이블 셀렉터와 일치시키는 것이다. 쿠버네티스는 애플리케이션의 실행을 보장한다. 이런 기능을 담당하는 리소스가 레플리케이션 컨트롤러다. 노드가 다운되는 등, 특정 이유로 인해 파드가 사라진 경우 파드를 재실행한다. 반대로 너무 많은 파드가 실행된 경우 제거한다. 말 그대로 복제본(레플리카)을 컨트롤 한다. 이러한 조정 절차는 다음과 같다. 레이블 셀렉터와 매칭되는 파드를 찾는다. 매칭 된 파드의 수와, 설정된 수를 비교한다. 많다면 파드를 삭제하고, 부족하다면 현재 템플릿에서 파드를 추가 생성한다. 레플리케이션 컨트롤러는 세 가지 중요 요소를 가지고 있다. 레이블 셀렉터(label selector)는 레플리케이션컨트롤러의 파드의 매칭 범위를 결정한다. 레..

쿠버네티스 - 프로브 - 16

이전에 우리는 레플리카(레플리케이션 컨트롤러) 설정을 통해 파드가 죽은 경우, 쿠버네티스가 이를 되살리고 그 숫자를 관리한다는 사실을 알게 되었다. 이에 대해서 좀 더 자세히 알아보자. 만약 파드 안에 있는 컨테이너 중 하나가 죽으면 어떻게 될까? 파드가 노드에 스케줄링되는 즉시, 해당 노드의 kubelet은 파드의 컨테이너를 실행하고 파드가 존재하는 한 계속 실행되도록 할 것이다. 애플리케이션 내부의 문제로 컨테이너가 죽더라도 쿠버네티스는 이를 자동으로 되살린다. 물론 애플리케이션에서 쿠버네티스에 재실행을 요청할 수도 있다. 그러나 대부분의 경우 애플리케이션의 외부에서 애플리케이션 컨테이너의 상태를 체크하는 것이 좋다. 흔히 서버를 설정하다보면, 상위 인프라에 헬스 체크를 제공하게 된다. 쿠버네티스도 ..

쿠버네티스 - 파드 중지/삭제 - 15

kubectl get po kubectl delete po suk9 간단하게 파드를 삭제하려면, 파드 리스트를 확인 후, delete 명령어로 파드를 삭제할 수 있다. 물론 바로 삭제되지는 않고 특정 절차를 진행하게 된다. 1. 쿠버네티스가 프로세스에 SIGTERM 신호를 보낸다. 2. 30초 동안 기다린다. 3. 시간 동안 종료되지 않으면 SIGKILL 신호를 보내 종료한다. 따라서 그레이스풀하게 종료하려면 SIGTERM 신호를 바르게 처리해야 한다. kubectl delete po -l creation_method=manual 레이블 셀렉터를 통해 다수의 pod를 모두 삭제할 수도 있다. 위의 명령으로 셀렉터에 걸린 pod는 모두 삭제된다. 물론 namespace 안에서 유효하다. kubectl co..

쿠버네티스 - 네임스페이스 - 14

레이블을 통해 쿠버네티스의 모든 오브젝트들을 셀렉트 할 수 있다는 것을 알게 되었다. 하지만 이로서는 충분치 않다. 여러 오브젝트가 같은 레이블을 가지고 있는 경우 결과가 겹칠 수 있기 때문이다. 이번에는 오브젝트를 그룹으로 묶을 수 있는 기능인 네임스페이스를 알아보자. 백문이 불여일행이다. 일단 쳐보자. kubectl get ns default, kube-public, kube-system 등의 네임 스페이스가 보일 것이다. 지금까지 우리는 default 네임스페이스에서만 작업을 했다. kubectl get po -n kube-system kube-system의 pods 리스트를 볼 수 있다. 이런 시스템 파드들이 우리가 실행하는 파드들과 섞여 있다면 혼란 정도가 아니라, 안정성에도 좋지 않은 영향을 ..

쿠버네티스 - 레이블 - 13

실제 쿠버네티스를 이용해 서비스를 배포할 경우, 파드를 분류할 필요가 있다. 제대로 분류가 되어 있지 않다면, 무수히 많은 파드들이 뒤죽박죽 될 것이 분명하기 때문이다. 레이블 레이블은 리소스에 첨부하는 키-값 쌍이다. 원하는 만큼 추가할 수 있고 이를 통해 리소스를 선택할 수 있다. 바로 실습으로 확인해보자. apiVersion: v1 kind: Pod metadata: name: suk9 labels: creation_method: manual env: prod spec: containers: - image: seokkyulee/suk9 name: suk9 ports: - containerPort: 8080 protocol: TCP kubectl create -f suk9-manual.yaml kub..

쿠버네티스 - YAML - 12

쿠버네티스 리소스(파드를 포함하는)는 쿠버네티스 Rest Api 엔드포인트에 JSON 혹은 YAML 파일을 전송해 생성한다. Dockerfile이 가져다주는 이점들과 비슷한 맥락에서 설정은 파일로 나와 있는게 여러면에서 유리하다. kubectl get pods kubectl get po suk9-gnrzs -o yaml 현재 파드 목록을 출력한 뒤, 한 녀석을 골라 yaml 정의를 구경해보자. 이렇게 긴걸 언제 작성하지? 보다보면 이런 생각이 들텐데 걱정하지 않아도 된다. 실제로 우리가 작성하는 영역은 간소하다. suk9.yaml apiVersion: v1 kind: Pod metadata: name: suk9 spec: containers: - image: seokkyulee/suk9 name: suk..

쿠버네티스 - 파드 - 11

파드는 쿠버네티스에서 가장 중요한 개념이다. 파드는 컨테이너 그룹이며, 구성단위다. 쿠버네티스는 파드 단위로 배포하고 운영한다. 기본 단위인 파드를 쪼개, 여러 워커 노드에서 실행할 수는 없으며, 하나의 워커 노드에는 여러 파드가 있을 수 있다. 컨테이너 묶음의 장점 하나의 컨테이너에 여러 프로세스를 띄우는 것보다, 각자의 컨테이너에서 단일 프로세스를 실행하는 것이 낫다. 때문에 자연스레 다중 프로세스는 다중 컨테이너 환경에서 실행될 것이고 이런 다중 컨테이너를 파드라는 하나의 단위로 그룹핑하는 것이다. 이것은 하나의 컨테이너에서 복수의 프로세스가 동작하는 것과 같은 장점을 가질 수 있게 해 준다. 하지만 프로세스는 컨테이너 단위로 격리되어 있기 때문에 분리의 장점도 함께 가져가게 된다. 또한 파드 내의..