개념
파드, 포드, 팟 다양하게 불리는 쿠버네티스 Pod에 대해서 알아보자
쿠버네티스 공식 홈페이지에서는 Pod를 다음과 같이 설명한다.
https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-overview/
[공식 홈페이지]
'쿠버네티스 애플리케이션의 기본 실행 단위로 쿠버네티스 객체 모델 중 만들고 배포할 수 있는 가장 작고 간단한 단위'
이렇게 설명되어있는데 나는 처음에 이걸봤을 때 쿠버네티스는 커녕 docker와 컨테이너에 대한 개념도 확실하지 않았기에 이해하지 못했다.
내가 이해한 Pod를 설명해보면
실제 작업을 수행하는 컨테이너를 담는 쿠버네티스 오브젝트 중에 하나로 쿠버네티스는 컨테이너를 직접 관리하지 않고 쿠버네티스가 담겨있는 Pod를 컨트롤 한다. 사용자는 이 Pod를 실행하거나 종료하거나 복제하거나 해서 관리한다. 가장 작은 단위라고 하는 이유는 사용자가 컨트롤 할 수 있는 가장 최소 단위의 오브젝트이기 때문이다. 오브젝트의 종류는 저번에 포스팅한 pod, service, namespace 등 이 있고 pod는 이 중 가장 작은 단위이다.
Pod의 구조
이 그림은 Pod 구조에 따른 그림을 예시로 그려본 것이다.
각각의 컨테이너는 node js로 웹서버를 구축한 것이다. 이 예시는 밑에서 자세히 설명하겠다.
위에서 말했지만 Pod는 컨테이너를 가지고 있다. 근데 한 Pod에 여러개의 컨테이너가 들어갈 수도 있고 한 Pod에 하나의 컨테이너만 들어갈 수도 있다. 이런 구조를 멀티 컨테이너 구조와 싱글 컨테이너 구조라 한다.
멀티 컨테이너 구조의 특징으로는
1. 한 Pod에 다수의 컨테이너가 있다.
2. 컨테이너들은 Pod의 IP를 localhost로 공유한다.
3. 기능에 따라 여러 종류의 패턴이 존재한다.
4. localhost로 리소스를 공유할 때 편리하다.
5. 컨테이너 스케일링이 어렵고 비효율 적이다.
싱글 컨테이너 구조의 특징으로는
1. 한 Pod 당 한 개의 컨테이너가 있다.
2. 컨테이너 스케일링에 효율적이다.
이런 구조적 특징을 가지고 있다.
쿠버네티스에 대해서 여러가지 예시를 구글링하다보면 이런 구조에 대해 헷갈리는 경우가 생길수도 있기 때문에 (나는 그랬었다...) 예를 들면 Pod에 컨테이너를 여러 개 넣을 수도 있는데 한 개 넣으면 손해 아닌가? 하나 쓸거면 그냥 컨테이너만 쓰면되는데 왜 굳이 Pod라는 개념을 사용하는 거지? 라는 생각을 가지고 있었다.
멀티컨테이너 구조의 특징부터 살펴보면
컨테이너들은 Pod의 IP를 localhost로 공유한다고 했는데 웹 서버를 예시로 들어보면 한 Pod 내에 여러 개의 웹서버가 켜져있고 각 웹서버는 각각 다른 포트 번호로 접근하게 해놓으면 각 컨테이너는 다른 컨테이너의 IP를 따로 알 필요없이 포트번호만 알면 접근 할 수 있다.
기능에 따라 여러 종류의 패턴이 존재하는데
쿠버네티스 공식 홈페이지에서는 사이드 카 패턴 등의 여러 패턴을 예시로 들고 있는데 공식 홈페이지를 참고 하기 바란다.
가장 중요한 특징으로는 컨테이너 스케일링이 어렵고 비효율적이다 라는 특징이 있는데 쿠버네티스 공식 홈페이지에서는 이러한 특징 때문에 싱글 컨테이너 구조를 추천한다고 적혀있다.(단일 컨테이너 구조) Pod의 특성은 휘발성이기 때문에 쉽게 지워지고 쉽게 만들고 복제하는 특징이 있다. 이러한 측면에서 쿠버네티스는 싱글 컨테이너 구조를 추천한다.
예제
실제 예시를 위해서 docker 이미지를 만드는 법과 만든 이미지를 docker hub에 업로드하는 법 그리고 pod를 배포하기 위한 yaml파일 작성에 대한 예시를 보여주겠다.
우선 docker 이미지를 만드는 법은
위와 같은 구조로 있어야합니다. app.js는 웹 서버를 실행 시키는 파일이고 Dockerfile은 컨테이너로 만들 내용이 적혀있다.
우선 docker 에 로그인 해야한다.
docker login 명령어를 통해 로그인을 하고
리눅스 우분투 기준으로 Dockerfile이 있는 디렉토리에서
docker build -t <도커허브ID>/<image이름> :<태그> . |
의 양식의 명령어를 입력한다.
docker build -t exampleID/exampleimage:v1 .
이런 식으로 명령어를 입력해 줍니다. 마지막 뒤에 . 는 도커파일이 위치한 장소를 가리키는걸로 알고 있는데 현재 디렉토리 안에 있으므로 . 을 꼭 입력해 줍니다. (틀린 점이 있으면 지적 바랍니다.)
이미지가 생성되었으면 이 이미지를 업로드 해주기 위한 명령어를 입력합니다.
docker push <도커허브ID>/<image이름>:<태그> |
의 양식으로 입력해 줍니다.
그러고 나서 docker hub를 확인해 보면 업로드 된 것을 확인할 수 있습니다.
실행시킬 컨테이너의 이미지까지 업로드 했으니 이제 쿠버네티스 환경에 배포하는 일만 남았습니다.
쿠버네티스상에서 오브젝트나 컨트롤러를 배포할 때는 kubectl 명령어를 사용합니다.
배포하는 방법에는
kubectl create명령어와 kubectl apply 명령어가 있습니다만 주로 kubectl apply 를 사용합니다.
apply의 경우는 기존에 만들어져있는 오브젝트를 업데이트 하는 경우에도 사용한다고 알고있습니다.
apiVersion: apps/v1 - name: container1 - name: container2 - name: container3
|
[위는 예시입니다.]
pod에 대한 yaml파일은 위의 양식처럼 작성이 됩니다.
- 각 부분에 대한 설명은 추후 추가 예정 -
이렇게 작성된 yaml파일을
kubectl apply -f pod.yaml |
로 명령어를 입력해주고
kubectl get all 이나 kubectl get pods로 확인을 해볼 수 있습니다.
다음 시간에는 service에 대해 알아보겠습니다.
'DevOps > 쿠버네티스(Kubernetes)' 카테고리의 다른 글
[쿠버네티스 #4] Replica set 과 Deployment (0) | 2020.01.29 |
---|---|
[쿠버네티스 #3] Service (0) | 2019.12.26 |
[쿠버네티스 #1] 쿠버네티스 오브젝트와 컨트롤러 (0) | 2019.12.09 |
[쿠버네티스 #tip1] 쿠버네티스 재 부팅시 The connection to the server localhost:xxxx was refused 에러가 떴을 때 (0) | 2019.12.06 |
[쿠버네티스 #0] Ubuntu 환경에서 쿠버네티스(Kubernetes) 환경구성하기 (0) | 2019.12.02 |