[기본 오브젝트] Pod
본문은 인프런의 대세는 쿠버네티스 [초급~중급] 강의를 정리한 글입니다.
모든 본문의 내용과 이미지의 출처는 강의자료에 있습니다.
Object - Pod
Container
-
Pod안 에는 하나의 독립적인 서비스를 구동할 수 있는 Container들이 있다.
-
그 Container들은 서비스가 연동될 수 있도록 Port를 가지고 있다.
-
한 Container가 하나 이상의 포트를 가질 수는 있지만, 한 Pod 내에서 포트가 중복될 수는 없다.
-
이 두 Container는 하나의 Host로 묶여있다고 보면된다.
- 그래서 Container1에서 Container2로 접근할 때,
localhost:8080
으로 접근할 수 있다.
- 그래서 Container1에서 Container2로 접근할 때,
-
Pod가 생성될 때 고유의 IP 주소가 할당된다.
-
Kubernetes Cluster 내에서만 (Service 없이) 해당 IP를 통해서 접근할 수 있지만,
외부에서는 해당 IP로는 접근할 수 없다.
-
휘발성 IP 주소이다.
-
Pod에 문제가 생기면 시스템이 이를 감지해서 해당 Pod를 삭제하고 재생성 시키는데 이 때 IP주소는 변경된다.
-
Label 속성
-
Label은 Pod 뿐만 아니라 모든 오브젝트에 달 수 있는데, Pod에서 가장 많이 사용된다.
-
Label 사용 이유?
- 목적에 따라 오브젝트를 분류하고, 분류된 오브젝트들만 따로 골라서 연결하기 위해서이다.
-
Label의 구성
- Key : Value가 한 쌍이다.
- 한 Pod에는 여러개의 Label을 달 수 있다.
-
이미지 예시
-
(type) web, db, server가 한 쌍으로 (lo) dev 즉, 개발 서버에 존재하는 것이고,
(type) web, db, server가 한 쌍으로 (lo) production 즉, 상용에서 돌아가는 Pod들이다.
-
각각의 담당자는 자신이 원하는 Pod들만 골라서 접속할 수 있다.
-
이 상황에서 웹 개발자가 웹 화면만 보고싶다면
type이 web인 라벨이 달린 Pod들을 Service에 연결해서 이 Service 정보를 웹 개발자에게 알려주면 된다.
-
상용 환경을 담당하는 운영자에게는
lo에 production 라벨이 붙은 Pod들을 Service에 연결해서 이 Service 정보를 담당자에게 알려주면 된다.
-
-
사용 목적에 따라 Label을 등록해놓으면 Hash 태그를 붙여서 검색 용도로 사용하듯이 원하는 Pod를 선택해서 사용할 수 있다.
-
Pod에 labels에 key : value 타입으로 라벨을 붙인다.
apiVersion: v1
kind: Pod
metadata:
name: pod-2
labels:
type: web # labels에 key : value로 달 수 있다.
lo: dev
spec:
containers:
- name: container
image: kubetm/init
추후 서비스를 만들 때, selector에 해당하는 Label의 key와 value를 넣으면 해당 Label과 매칭되는 라벨이 붙어있는 Pod에 연결이 된다.
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
type: web # 이 라벨이 붙어있는 파드와 연결된다.
ports:
- port: 8080
Node Schedule
- Pod는 결국 여러 Node들 중에 한 Node에 올라가야 한다.
- 직접 Node를 선택
- 쿠버네티스가 자동으로 Node를 지정해주는 방법
직접 Node 선택
- Node에 Label을 달고, Pod를 만들 때, Node를 지정할 수 있다.
- Pod 생성 yaml에
nodeSelector:
항목에 Node의 Label과 매칭되는 key : value 값을 넣어주면 된다.
- Pod 생성 yaml에
쿠버네티스의 스케쥴러가 판단해서 Node를 선택
- 전체 사용가능한 자원(메모리, CPU)을 파악
- 이미지를 예시
- Node1 : 여러 Pod들이 들어가 있고 남은 메모리가 1GB
- Node2 : 남은 메모리가 3.7GB
- Pod를 생성할 때, 이 Pod에서 요구될 리소스의 사용량을 명시할 수 있다.
- 생성한 Pod가 2GB의 메모리를 요구한다 했을 때, 쿠버네티스가 알아서 Node2로 알아서 Pod를 스케쥴링 해준다.
- 요구될 리소스의 사용량을 명시하는 이유?
- 만약 이를 설정하지 않으면, Pod안에 있는 앱에서 부하가 생길 때, 무한정 Node에 있는 자원을 사용하려고 할 것이다.
- 그러면 그 Node에 있는 다른 Pod들은 자원이 없어서 다같이 죽게된다.
resources
의requests
: 요구되는 리소스 양,limits
: 최대 허용 메모리
limits
- Memory : limits 초과 시 Pod를 종료 시킴
- Cpu : limits 초과시 request로 낮추지만, 직접 Pod를 종료시키지는 않는다.
- Memory와 Cpu가 다르게 동작하는 이유?
- 각 자원의 특성 때문이다.
- Memory는 다른 영역을 침범하면 프로세스가 종료되는 치명적인 문제가 있기 때문에 바로 종료시켜 버리는 것이다.