Kubernetes - Pod의 특징 3가지
by youngjun._.Pod의 특징은 어떤 것들이 있을까!
특징은 크게 3가지로 나눌 수 있다.
1. Container
2. Label
3. Node Schedule
1. Container
pod 안에는 하나의 독립적인 서비스를 제공할 수 있는 컨테이너들이 있다.
컨테이너들은 서비스가 연결될 수 있도록 Port 가지고 있음
한 컨테이너가 포트를 하나 이상 가질 수 있지만 한 파트에서 컨테이너들끼리 Port가 중복될 수 없다!
두 컨테이너는 하나의 호스트로 묶여있다고 생각하면 됨
컨테이너1에서 컨테이너2로 접근할 때 localhost:8080 으로 접근할 수 있음
Pod가 생성될 때 고유의 IP 주소가 할당이 되는데
쿠버네티스 클러스터 내에서만 할당된 IP에 접근을 할 수 있음
* 외부에서는 접근할 수 없음
만약 Pod에 문제가 생기면 시스템이 문제를 감지해서 Pod를 자동으로 삭제하고
재생성하는데 이때 IP주소는 재생성된다. (휘발성임!)
이런 pod를 생성하는 yaml 파일 내용을 보면
Pod name: pod-1
containers에 container1과 container2를 만들 것
container1은 이미지가 p8000이라는 이름이고 8000번 포트로 오픈되어있음
container2는 이미지가 p8080이라는 이름이고 8080번 포트로 오픈되어있음
2. Label
라벨은 pod뿐만아니라 모든 Object에 달 수 있는데 Pod에서 가장 많이 사용 됨
라벨을 사용하는 이유는 목적에 따라 Object를 분류하고
분류된 Object들만 따로 골라서 연결하기 위해서이다.
라벨의 구성은 Key와 Value가 한쌍이고 한 Pod에는 여러개의 Label을 달 수 있음
6개의 Pod가 있는데 Label을 확인해보자.
Pod1은 Key가 type이고 Value가 Web이다.
web이라고 붙어있는 Label에 위치가 'lo' 라고 표현되어 있는데
하나는 Pod1의 dev 위치, 다른 하나는 Pod4 production 위치에 있다.
한마디로 web/db/server 타입이 각각 개발환경과 상용환경에 구성이 되어있는 것!
한쌍은 다른 한쌍은 상용에서 돌아가는 Pod(Pod4~6)
이상황에 만약 웹 개발자가 web 화면만 보고 싶을 경우!
type이 web인 Label이 달린 pod들을 Service에 연결해서
Service에 정보를 웹개발자에게 알려주면 된다.
상용환경을 담당하는 운영자라면
lo:production 라벨의 pod들을 Service에 연결해서 운영자에게 알려주면
각각의 담당자는 자신이 원하는 Pod를 골라서 접속할 수 있다.
* 사용목적에 따라 Label을 잘 달아놓으면
해쉬태크를 붙여서 검색용도를 활용하듯 원하는 용도로 선택해서 사용 가능!
아래 yaml 파일 내용을 확인해보자.
Pod를 만들 때 labels에 Key와 Value형식으로 값을 넣을 수 있다.
추후에 Service를 만들 때 selector에 Key-Value를 넣으면 해당 내용과 매칭되는 Label이 붙어있는 Pod에 연결 됨
3. Node Schedule
Pod는 결국 여러 Node들 중에 하나의 Node에 올라가야함
그 방법이 Node Schedule
1. 직접 Node를 선택하는 방법
2. Kubernetes가 자동으로 연결해주는 방법
3-1. 직접 Node를 선택
Pod에 Label을 달았던 것 처럼 Node에 Label을 달고 Pod를 만들 때 Node를 지정할 수 있음
yaml파일을 확인해보자.
Pod를 만들 때 nodeSelector라는 항목에 Node label과 매칭되는 Key-Value를 넣으면 된다.
3-2. Kubernetes가 Node 자동 선택
Kubernetes의 스케줄러가 판단해서 지정해준다!
Node에는 전체 사용가능한 자원량이 있음 (Memory의 CPU가 대표적)
메모리로 예를 들면
node1에는 몇개의 Pod가 들어가있어서 남는 메모리가 1Giga이고
node2에는 3.7Gi가 남은 상태임
Pod를 생성할 때 Pod에서 요구될 resource의 사용량을 명시할 수 있음
그림의 Pod는 2G를 요구한다고 했을 때
Kubernetes가 알아서 node2로 pod를 스케줄링 해줌!
사용량을 넣는 큰 이유중 하나가
만약 사용량을 설정하지 않으면 Pod안에 있는 앱에서 부하가 생길 때 무한정 Node의 자원을 사용하려고 하고
다른 pod들은 자원이 없어서 다같이 죽게된다.
pod를 만들 때 yaml 내용을 보자.
아래 Pod를 만들 때 yaml내용을 보면 Pod에서 사용될 resource를 지정해준다.
requests는 momory 2Gi를 요구한다는 것이고
limits는 최대 허용 메모리가 3Gi라는 내용임.
limits에 대해
1. Memory : 초과시 Pod를 종료!
2. Cpu : 초과시 request로 낮춤, 종료시키지 않음
이유는?
각 자원에 대한 특성 때문
예를들어 우리가 파일을 복사할 때
하나를 복사하고 있는데 또다른 하나를 복사하면 첫번쨰 파일이 느려지면서 두번째 파일이 복사가 됨
프로세스들이 CPU자원을 쓰는데 있어서 서로 문제를 일으키지 않음!(조금 느려짐)
하지만 파일을 복사하는데 두번째 파일이 첫번째 파일이 쓰는 메모리를 침범한 경우
잘못된 메모리를 참조했다고 하며 프로세스가 종료되는 경우가 있음
메모리는 잘못되면 프로세스간의 치명적인 문제를 일으키기 때문이다.
자원의 성격에 따라 kubernetes에서도 다르게 판단하는 것!
'Infra > Kubernetes' 카테고리의 다른 글
Kubernetes - Volume (0) | 2020.03.12 |
---|---|
Kubernetes - Service (3) | 2020.03.12 |
Kubernetes 환경 구축(Docker) (0) | 2020.03.12 |
Container와 VM의 차이점 (0) | 2020.03.12 |
왜 Kubernetes를 사용해야할까? (0) | 2020.03.12 |
블로그의 정보
개발하는만두
youngjun._.