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 (4) | 2024.08.28 |
[Kubernetes] Service - ClusterIP, NodePort, LoadBalancer (2) | 2024.08.27 |
[Kubernetes] 왜 쿠버네티스인가? (0) | 2024.08.05 |
[Kubernetes] 쿠버네티스 소개 (0) | 2024.08.05 |