CKA
(TIL) Kubernetes에서의 Resource Request & Limits
IntroPod는 기본적으로 노드의 자원을 사용하며, 여기서 자원은 주로 CPU와 메모리를 말한다.스케줄러는 요청된 자원양을 기준으로 Pod의 배치를 결정하며, 해당 조건을 yaml파일에 명시할 때는 pod가 아니라 각 container 단위로 설정된다. Requestrequest는 최소 보장 자원을 의마한다. resources: requests: memory: "512Mi" cpu: "0.5" 위와 같이 설정하였을 때, 스케줄러는 이 값을 기준으로 노드를 선택하며, 최소한으로 보장되는 값이다.여기서 cpu에 0.5라고 설정하는 것은 500m이라고 설정하는 것과 같다. Limitslimits는 최대 허용 자원을 의미하며, 해당 컨테이너는 이 값을 넘을 수 없다. resources: limi..
(TIL) Kubernetes Taints & Toleration 와 Node Affinity
Intro앞서 Kubernetes에서 파드의 스케줄링 노드 제한조건으로 사용할 수 있는 Taints & Toleration과 Node Affinity의 개념에 대해서 알아보았다. 동일한 역할을 하는 다른 두 개념이 존재한다는 것은 당연하게도, 두 개념이 필요에 따라 선택적으로 사용되거나 함께 사용되어야 하기 때문이다. Example다음과 같은 시나리오를 상정한다. Red, Blue, Green 이라는 세 가지 노드가 존재한다.Red, Blue, Green 이라는 세 가지 Pod가 존재한다. 우리는 이 상황에서 같은 색의 파드가 같은 색의 노드에만 배치될 수 있도록 하려고한다고 하자.Taints & Toleration 만 사용한 경우각 노드에 다음과 같은 Taints를 설정한다.Red : key = col..
(TIL)Kubernetes의 Node Selector와 Node Affinity
Intro쿠버네티스 클러스터 내부에는 다양한 성능의 노드들이 혼재하여 존재할 수 있다. 우리는 데이터 처리를 위한 파드는 특정한 고사양 노드에서만 실행되기를 원할 수 있는데, 기본 스케줄러는 이러한 사항을 고려하지 않고 랜덤한 노드에 파드를 배치하게된다. 이러한 상황에서 선택할 수 있는 해결책이 `Node Selector`이다. Labeling다음과 같은 명령어를 사용해서 간단하게 node에 label을 붙일 수 있다.kubectl label nodes node1 size=large 위 명령어를 사용하면, node1이라는 노드에 size=large라는 라벨을 가지게 할 수 있다. Node Selector 적용apiVersion: v1kind: Podmetadata: name: dataproc-podsp..
(TIL) Taints and Tolerations
Taints and TolerationTaints는 벌레 퇴치제, Toleration은 내성을 말한다.Kubernetes에서 이 두 개념은 특정 파드가 어떤 노드에 배치되지 않도록 하거나 특정한 파드만 배치될 수 있도록 노드의 수준을 제한하는 설정에 사용되는 개념이다. Taint는 노드에 설정되며 Toleration은 파드에 설정된다. 동작 예시node1, node2, node3 세 노드가 존재하고pod1,pod2,pod3,pod4 네 pod이 존재한다고 가정하자 node1에 `taint: app=blue:NoSchedule` 로 설정하고 pod에 아무런 설정도 하지 않는 경우 어떤 pod도 node1에 배치될 수 없다. tolerations: - key: "app" operator: "Equal..
(TIL) Kubernetes Labels & Selectors
Labels란Key-Value 형식의 메타데이터로 Kubernetes 객체에 붙일 수 있는 정보이다.객체를 분류하고 그룹화하기위한 용도로 사용된다. Selector란Labels 기반으로 필터링을 진행하기 위한 도구로 특정 조건을 기준으로 Kubernetes 객체를 선택한다.kubectl get pods --selector="app=frontend" 사용 예시apiVersion: v1kind: Podmetadata: name: mypod labels: app: app1 tier: frontendspec: containers: - name: nginx image: nginx kubectl get pods --selectors="app=app1" 이라는 명령어를 통해 위 객체를 ..
(TIL) Kubernetes Manual Scheduling
Scheduler 없이 파드가 동작하는 방식Kubernetes에서 Scheduler가 따로 설정되어있지 않는 경우, 기본적으로 kube-scheduler라는 컴포넌트가 파드를 어떤 노드에 배치할지 결정한다.만약 클러스터에 스케줄러가 아예 없거나 비활성화 되어있는 경우, 파드는 Pending 상태로 멈춰있게된다.Kubernetes 스케줄러의 내부 동작 방식 1. 파드가 생성된다. (처음 생성된 파드는 spec.nodeName이 비어있음)2. kube-scheduler는 nodeName이 없는 파드를 감지3. 스케줄링 알고리즘을 통해 적절한 노드를 선택4. spec.nodeName에 선택된 노드의 이름을 설정5. 내부적으로 Binding 객체를 생성하여 할당한다. 수동 스케줄링 방법nodeName 필드를 직..
(TIL) kubectl apply의 내부 동작
kubectl applykubectl apply를 통해 객체를 관리하는 방식은 declarative 방식에 해당한다.이 명령어는 3가지 정보를 비교하는데 local configuration, live object, last-applied configuration 이 이에 해당한다.local configuration우리가 작성한 yaml 파일에 해당한다.live object클러스터에 존재하는 실제 객체 상태를 의미한다.last-applied configuration가장 마지막으로 kubectl apply를 실행했을 때의 상태를 의미한다.해당 데이터는 kubectl.kubernetes.io/last-applied-configuration 이라는 필드로 저장된다. imperative와의 혼용?imperativ..
(TIL) Kubernetes의 imperative, declarative
Imperative vs Declarative길을 찾는 예시를 통해 Imperative와 Declarative의 차이를 확인해보면 다음과 같다.100m 앞으로 가서 오른쪽으로 꺾은 후 200m 직진하세요 와 같이 설명하는 것을 imperative,홈플러스로 가세요와 같이 설명하는 것을 Declarative 방식이라고 한다.즉 imperative은 무엇을 어떻게 할지를 지시하며 declarative는 무엇을 원하는지만 명시하는 방식이다.인프라에서의 Imperative vs Declarative인프라 관리에서도 동일한 개념이 적용된다.웹 서버 VM을 생성하라NGINX를 설치하라설정 파일을 수정하라 (포트 8080으로)Git에서 코드를 다운로드해라NGINX를 실행해라NGINX 웹서버가 포트 8080에사 동작한..