Kubernetes

Pod
Pod
안에는 하나의 독립적인 서비스를 구동할 수 있는 컨테이너
들이 존재한다.
해당 컨테이너
는 서비스가 연결될 수 있도록 포트를 가지고 있는데,
한 컨테이너
가 포트를 여러 개는 가질 수 있지만, 한 Pod
내에서 포트가 중복될 순 없다.
한 Pod
내에서 컨테이너는 localhost:{해당 컨테이너 포트}
으로 접근할 수 있다.
그리고 Pod
는 생성이 될 때 고유의 IP 주소가 할당이 된다.
하지만, 이는 Kubernetes Cluster
내부에서만 접속이 가능하고, 외부에서는 접속이 불가능하다.
또한, 만약 Pod
에 문제가 생기면 시스템이 이걸 감지해서 Pod
를 삭제하고 다시 재성성한다.
이때, 고유의 IP 주소는 변경이 된다.
즉, 휘발성이 있는 특징을 가진 IP라고 할 수 있다.
Pod 생성 예시
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container1
image: kubetm/p8000
ports:
- containerPort: 8000
- name: container2
image: kubetm/p8080
ports:
- containerPort: 8080
- metadata:
- name: pod - 1
- 네임은 pod-1이다.
- spec
- containers:
- 컨테이너1과 컨테이너2를 생성한다.
- containerPort:
- 컨테이너 생성시 사용할 포트번호를 설정한다.
- containers:
Label
라벨은 Pod
뿐만 아니라 모든 오브젝트에 적용할 수 있지만, Pod
에서 가장 많이 사용이 된다.
라벨을 사용하는 이유는 목적에 따라 오브젝트들을 분류를 하고,
분류된 오브젝트들만 따로 골라 연결을 하기 위해서이다.
라벨의 구성은 Key와 Value가 한 쌍이다.
또한, 한 Pod
에 여러 개의 라벨을 달 수 있다.

위의 그림을 살펴보면 type: web을 라벨을 갖는 Pod
만을 뽑아서 추후 설명할 Service
와 연결한 뒤
서비스 정보를 웹 개발자에게 알려줄 수 있을 것이다.
또한, lo:production을 갖는 Pod
만을 뽑아 운영자에게 줄 수도 있을 것이다.
그렇게 되면 담당자는 자신이 원하는 파드들만 골라서 접속을 할 수 있다.
이렇게 사용 목적에 맞게 라벨을 잘 달아 놓으면 우리는 해시태그처럼
원하는 Pod
를 쉽게 선택을 해서 사용할 수 있다.
Label 활용 코드
Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
type: web
lo: dev
spec:
containers:
- name: container
image: kubetm/init
type: web 이라는 라벨을 갖는 파드를 생성한다.
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
type: web
ports:
- port: 8080
type: web 라벨을 갖는 Pod
와 Service
를 연결한다.
이런식으로, Label를 활용해서 쉽게 쿠버네티스 컴포넌트 간의 연결이 가능하다.
Node Schedule
Pod
는 결국 여러 노드들 중에 한 노드에 올라가야 한다.
이때, 쿠버네티스에서 노드를 지정하는 방식은 두 가지가 존재한다.
-
Pod
생성시 직접 노드를 선택하는 방법 - 쿠버네티스가 자동으로 지정해주는 방법
각각에 관해 알아보자.
Pod
생성시 직접 노드를 선택하는 방법
apiVersion: v1
kind: Pod
metadata:
name: pod-3
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1
containers:
- name: container
image: kubetm/init
nodeSelector 항목에 node
의 라벨과 매칭되는 Key Value를 넣으면 된다.
쿠버네티스가 자동으로 지정해주는 방법
apiVersion: v1
kind: Pod
metadata:
name: pod-4
spec:
containers:
- name: container
image: kubetm/init
resources:
requests:
memory: 2Gi
limits:
memory: 3Gi
- requests:
Pod
를 만들 때 사용될 리소스는 메모리 2기가이다.
- limits:
- 최대 허용 메모리는 3기가로 한다.
리밋
의 옵션(?)- 자원의 성격에 따라
Kubernetes
에서는 다르게 판단을 한다. - Memory: 초과시 Pod를 그냥 종료 시킴
- Cpu: 초과시 request로 낮출 뿐,
Pod
를 종료시키진 않는다. - 예시
- 우리가 파일을 복사할 때 하나를 추가로 복사하면 첫번째 파일이 좀 늦어지면서,
두번째 파일이 복사되는 것을 생각하면 된다.
- 우리가 파일을 복사할 때 하나를 추가로 복사하면 첫번째 파일이 좀 늦어지면서,
- 자원의 성격에 따라
- 사용량을 넣는 큰 이유
- 사용량을 설정하지 않으면
Pod
안에 있는 앱에서 부하가 생길 때, - 무한정
node
에 있는 자원을 사용하려 하여 해당node
에 있는 다른 파드들도 자원이 없어 죽게 된다.
- 사용량을 설정하지 않으면
Node Schedule 간단 정리
우선, node
도 서버이므로, 전체 사용 가능한 자원량이 존재한다.
자원량에는 메모리와 CPU가 대표적인데 일단 메모리로 예로 들면,
노드1
에는 남은 메모리가 1기가이고 노드2
에는 남은 메모리가 3.7기가라고 하자.
이때, 한 Pod
가 위의 코드처럼 2기가의 메모리를 요구한다고 했을 때,
Kubernetes
가 해당 Pod
를 적절히 스케줄링을 해줘야 한다.
그때, 사용하는 것이 Node Schedule 방법이다.
실습
Pod 실습



Pod
가 정상적으로 생성이 되었고 사진에 보이는 IP는 같은 클러스터 내에서만 접근할 수 있는 IP 이다.
실제 Container
와 통신
클러스터IP를 통해 Container
와 통신해본다.


이런식으로, Pod
에 직접 접근해서 localhost로 접근할 수도 있다.
Label 실습
pod-2 생성
apiVersion: v1
kind: Pod
metadata:
name: pod-2
labels:
type: web
lo: dev
spec:
containers:
- name: container
image: kubetm/init
pod-3 생성
apiVersion: v1
kind: Pod
metadata:
name: pod-3
labels:
type: web
lo: dev
spec:
containers:
- name: container
image: kubetm/init
해당 Label을 선택하는 Service
생성
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
type: web
ports:
- port: 8080
type: web 지정하여 해당 Label을 갖는 위 Pod
와 연결한다.



실제로, Service
에 Pod
가 잘 연동되어있는 것을 확인할 수 있다.
'Infra > Kubernetes' 카테고리의 다른 글
[Kubernetes] ConfigMap, Secret - Env, Mount (0) | 2024.09.02 |
---|---|
[Kubernetes] Volume - emptyDir, hostPath, PV/PVC (0) | 2024.08.28 |
[Kubernetes] Service - ClusterIP, NodePort, LoadBalancer (0) | 2024.08.27 |
[Kubernetes] 왜 쿠버네티스인가? (0) | 2024.08.05 |
[Kubernetes] 쿠버네티스 소개 (0) | 2024.08.05 |