본문 바로가기
Recent Study/Kubernetes 학습과정

3. Pod - Container, Label, NodeSchedule & 실습

by Thinking 2024. 1. 3.

 Pod 특징을 보면 Pod 안에는 하나의 독립적인 서비스를 구동할 수 있는 컨테이너들이 있습니다. 컨테이너들은 서비스가 연결될 수 있도록 포트를 가지고 있는데 한 컨테이너가 하나 이상의 포트를 가질 수는 있지만, 한 Pod 내에서 컨테이너들끼리 포트가 중복될 수는 없습니다.

 

1) Container

: 위 2개 컨테이너는 한 호스트로 묶여있다고 보면 되는데 Container1에서 2로 접근할 때 localhost:8080로 접근할 수 있습니다. 그리고 Pod가 생성될 때 고유의 IP가 자동으로 할당되는데 쿠버네티스 클러스터 내에서만 위 IP를 통해서 Pod에 접근할 수 있습니다. 외부에서는 접근이 불가합니다. 만약 Pod에 문제가 생기면 시스템이 스스로 감지해서 Pod를 삭제하고, 다시 재생성하는데 이때 IP주소는 변경됩니다.

 

2) Label

: Pod 뿐만 아니라 모든 오브젝트에 달 수 있는데, Pod에서 가장 많이 사용됩니다. 라벨을 사용하는 이유는 목적에 따라 오브젝트들을 분류하고, 분류된 오브젝트들만 따로 골라서 연결을 하기 위해서 입니다. 라벨은 key, value가 한 쌍이고, 한 Pod에는 여러개의 Label을 달 수 있습니다.

 

 위를 예로 들면 웹, DB, server가 있는데 위 3개는 개발 서버로, 아래 3개는 상용에서 돌아가는 Pod들입니다. 만약 웹 개발자가 웹 화면만 보고 싶다면 type이 web인 라벨이 달린 Pod를 서비스에 연결해서 이 서비스의 정보를 웹 개발자에게 알려주면 됩니다. 또한 상용 환경을 담당하는 운영자라면, lo의 production이 붙은 라벨이 달린 Pod들을 서비스에 연결해서 정보를 운영자에게 보여줄 수 있습니다. 

 

3) Node Schedule

: Pod는 결국 여러 노드들 중 한 노드에 올라가야 합니다. 방법은 직접 노드를 선택하는 방법이 있고, Kubernetes가 자동으로 지정해주는 방법이 있습니다. 직접 선택은 Node에 label을 달고, Pod를 만들 때 Node를 지정할 수 있습니다. k8s 자동 선택으로 노드에는 전체 사용 가능한 자원량이 있습니다. 메모리와 cpu가 대표적입니다. Pod를 생성할 때 파드에서 요구될 수 있는 리소스의 사용량을 명시할 수 있습니다. k8s가 알아서 Node2로 Pod를 스케줄링 해줍니다.

 

 사용량을 넣는 큰 한가지 이유는 만약 설정하지 않으면 Pod안에 있는 앱에서 부하가 생길 때 무한정 노드에 있는 자원을 사용하려고 할거고, 다른 Pod는 자원이 없어서 죽게 됩니다. 메모리의 경우 Limits를 넘으면 바로 파드를 종료시킵니다. 반면 Cpu의 경우 limits를 넘겨버리면 requests 수치까지 낮추지만 직접 Pod를 종료하진 않습니다. 이렇게 다르게 다르게 동작하는 이유는 프로세스들이 CPU 자원을 쓰는데 있어서 서로 큰 문제를 일으키지 않기 때문입니다. 하지만 메모리는 잘못되면 프로세스간 치명적인 문제를 일으킬 수 있습니다.

 

 

실습

1.pod

1. Pod 생성 실습

 Container1, 2를 pod-1 내에 생성하고 이는 8000 포트와 8080 포트를 열어두었습니다. 이미지는 컨테이너 이미지입니다. 이를 업로드 하면 아래와 같이 pod-1이 생성된 것을 볼 수 있습니다.

 

(1) 그리고 pod에는 해당 ip가 존재하는데, 이는 쿠버네티스 클러스터 내에서만 접속이 가능하고 현재 실습에서 k8s-master에서 동작하는 것이 쿠버네티스 클러스터 내에서 동작하는 것이라고 생각하면 됩니다. 아래와 같이 확인이 가능합니다.

 

 

 

(2) 이제 master가 아닌 pod-1 내 포트가 할당된 container에서 접속을 해보려고 합니다. k8s 대시보드에서 파드 -> Exec를 누르면 해당 컨테이너에 접속하여 쉘을 사용할 수 있습니다. 확인결과 아래와 같이 나왔는데요. 아마 curl이 설치되어 있지 발생한 것 같아서, 저는 apt update, apt install curl 해주었습니다. 그럼 잘 연결이 되었죠?

curl 설치 전
curl 설치 후

 

 

(3) 이번에는 위 Pod 실습시 사용했던 Container2를 1과 같은 포트와 이미지를 사용해서 만들어보겠습니다. 이는 컨테이너가 같은 포트가 될 때 오류가 나는지 확인해보는 것이고, 결과로 container1은 이상이 없지만, 2가 아래와 같은 로그를 내는 것을 확인할 수 있습니다.

2. 같은 포트 사용시 오류 로그 발생 확인 실습

 

 

(4) 이번에는 Pod가 생성될 때 마다 새로운 IP를 부여받는지 확인하는 실습을 해보겠습니다. 이를 위해 컨트롤러를 만들겠습니다. 컨트롤러가 Pod를 만들어주고, Pod가 죽었을 때 다시 생성해주는 관리 역할을 해줍니다. 그리고 생성된 Pod가 문제가 있다고 가정하고, 삭제해보겠습니다. 이때 부여받은 IP는 20.109.131.5/32 입니다.

 이처럼 Pod가 삭제된 것을 보고, 새로운 Pod를 생성하게 됩니다. 이때 부여받은 IP는 20.109.131.6로 바뀐 것을 확인할 수 있었습니다.

 

 

1.Label

(1) 아래와 같이 dev, prod와 db, server, web의 기능을 지닐 pod를 만들었습니다. 그리고 selector, lo에 해당 원하는 라벨을 선택하면 그 아래와 같이 해당 pod들을 목적에 따라 연결할 수 있습니다.

3. Label 실습

 

 

3.node schedule 실습

 전에 만들었던 master, node1, node2 노드가 있었습니다. 첫 번째로 node1에 pod1를 생성하고, 사용할 메모리와 Cpu를 배정합니다. 다음에는 pod2를 node2에 Cpu와 메모리를 할당합니다. 이렇게 되면 남아있는 자원이 서로 다를텐데요. pod3를 자동 배정을 선택하도록 하면 어떤 노드를 선택할까요? 정답은 현재 노드중 남은 자원량이 더 많은 node를 선택하게 됩니다. k8s가 스케줄링을 할 때 노드마다 점수를 매겨서 가장 높은 점수가 있는 노드에게 Pod를 할당합니다. 점수에 영향을 끼치는 부분이 남은 자원량이기 때문입니다.

4. node schedule