딸기말차

[MSA] 11. Kubernates Pod 본문

Bootcamp/MSA

[MSA] 11. Kubernates Pod

딸기말차 2023. 10. 24. 11:39

엔코아 플레이데이터(Encore Playdata) Backend 2기 백엔드 개발 부트캠프 (playdata.io)

 

백엔드 개발 부트캠프

백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.

playdata.io


1. Kubernates

쿠버네티스는 대부분 리소스를 오브젝트라고 불리는 형태로 관리한다.

 

1. yaml 파일

쿠버네티스는 yaml 파일로 컨테이너 리소스를 생성하거나 삭제할 수 있다.

yaml파일은 컨테이너 뿐만아니라 거의 모든 리소스 오브젝트들에 사용될 수 있다는 것이 장점으로,
컨테이너는 물론 설정값, 보안정보들을 yaml파일에 작성해 사용한다.

실제로 쿠버네티스에서 서비스를 배포할때도 kubectl 명령어가 아닌 여러 yaml 파일을 정의해 쿠버네티스에 적용시키는 방식으로 동작한다. 즉, yaml 파일을 잘 작성하는게 쿠버네티스를 잘 사용하는 방법이다

 

2. 여러개의 컴포넌트

쿠버네티스 노드의 역할은 크게 마스터와 워커로 구분한다.

여기서 마스터 노드는 쿠버네티스가 제대로 동작할 수 있게 클러스터를 관리하는 역할이고, 워커 노드에는 어플리케이션 컨테이너가 생성된다.

쿠버네티스 클러스터 구성을 위해 kubelet이라는 에이전트가 모든 노드에서 실행 된다.

kubelet은 컨테이너의 생성, 삭제 뿐만아니라 마스터와 워커 노드간의 통신 역할을 담당한다.
만약 kubelet이 정상적으로 실행되지 않으면, 해당 노드는 쿠버네티스와 제대로 연결되지 않을 수 있다.

쿠버네티스에서 반드시 도커를 사용해야하는 것은 아니고 ,OCI(Open Container Initiative)라는 컨테이너의 런타임 표준을 구현한 CRI(Container Runtime Interface)를 갖추고 있다면 어떤 컨테이너를 써도 상관없다.

 

3. 구성요소

쿠버네티스 클러스터는 kubectl, kubelet, api 서버, 캘리코 등으로 이루어져 있다.

# 쿠버네티스 클러스터를 이루는 pod들 확인
kubectl get pods --all-namespaces


2. 쿠버네티스 상태, 연결 된 노드, resource 확인

# 쿠버네티스 상태 확인
sudo systemctl status kubelet

부팅 후 쿠버네티스가 켜진 것 확인

# 연결 된 노드 확인
kubectl get nodes

연결 된 노드들

# 쿠버네티스 기본 resource들 확인
kubectl api-resources

여러 기본 resource들


3. Pod 생성 및 삭제

Pod란 쿠버네티스에서 컨테이너를 다루는 기본 단위로, 1개이상의 컨테이너로 구성 된 컨테이너의 집합이다.

1개의 파드에서는 1개의 컨테이너가 존재할 수도 있고, 여러 컨테이너가 존재할 수도 있다.

 

예를들어 Nginx 웹 서비스를 쿠버네티스에서 생성하려면 1개의 파드에 Nginx 컨테이너 1개만을 포함해 생성한다.

이때 동일한 Nginx 컨테이너를 여러개 생성하고 싶다면 1개의 nginx컨테이너가 들어있는 동일한 파드를 여러개 생성하면 된다. 

즉, Pod는 컨테이너 어플리케이션을 나타내기 위한 기본 구성요소가 된다.

# vim 명령어를 통해 파일 생성
vim nginx-pod.yaml

yaml 파일 작성

# nginx-pod.yaml 파일 작성

yaml 파일 내용

# 생성한 yaml 파일 적용
kubectl apply -f nginx-pod.yaml

yaml 파일 적용

# yaml을 통해 컨테이너가 생성 된 것 확인, 컴퓨터마다 속도가 다를 수 있다.
kubectl get pods

yaml을 통해 생성 된 컨테이너 확인

# 생성 된 컨테이너 좀 더 상세하게 확인
kubectl get pods -o wide

좀 더 상세히 확인

# curl 명렁어를 통해 IP 접속 (웹 접속)
curl 172.16.221.129

curl을 통해 실행한 컨테이너에 접속

# 생성한 파드 내 컨테이너에 접속
kubectl exec -it my-nginx-pod bash

컨테이너 접속

# etc 하위의 nginx 설정 파일 확인
ls /etc/nginx

nginx 설정파일 확인

# 파드 삭제
kubectl delete -f ./nginx-pod.yaml

파드 삭제


4. 여러 컨테이너를 단일 Pod에서 실행

여러 컨테이너를 단일 pod 내에 담아 실행하면, 컨테이너 끼리 namespace를 공유하기 때문에 같은 성향의 컨테이너 를 동시에 넣으면 에러가 날 확률이 매우 높다. 

대표적인 예시로 mariaDB와 Mysql을 동시에 넣으면, 같은 포트를 쓰기 때문에 충돌이 날 수있다.

때문에 한 pod에 한 컨테이너를 원칙으로 사용한다.

# nginx-pod.yaml 수정, 잘못 된 사용 예
vim nginx-pod.yaml

yaml 파일 수정

# tail이라는 프로그램은 파일의 맨 마지막을 보여준다.
# yaml 내 tail을 통해 로그 확인
tail nginx-pod.yaml

tail을 통한 파일 확인

# -f 옵션을 통해 실시간으로 로그 확인 (모니터링)
tail -f nginx-pod.yaml

-f 옵션을 통해 실시간 로그 확인

# 와일드카드를 사용해 파일 추적
*nginx-pod* : 앞 뒤 상관없이 nginx-pod가 중간에 있는 단어를 다 찾는다.

# 표준 입출력 2 : 에러를 의미
2> 옵션을 통해 에러를 /dev/null로 보내 콘솔에 에러는 표기하지 않는다.

# find 위치 -name [이름]  2>/dev/null
find / -name "*nginx-pod*" 2>/dev/null

파일 출력

# yaml 복사 후 pod 생성
cp ./nginx-pod.yaml ./nginx-pod-with-ubuntu.yaml
kubectl apply -f ./nginx-pod-with-ubuntu.yaml

nginx-pod-with-ubuntu.yaml을 만들기 위해 기존 yaml 복사

# 생성한 pod 실행되는 것 실시간 확인
watch -n 1 kubectl get pods

pod 실행여부 확인

# 파드 내 특정 컨테이너 접속
kubectl exec -it my-nginx-pod -c ubuntu-sidecar-container bash

ubuntu 컨테이너 접속

# 현재 pod 내 컨테이너 2개가 존재한다. -> nginx, ubuntu

# pod 내는 namespace를 공유하기 때문에 컨테이너는 ubuntu로 실행했지만 curl을 보냈을 때 nginx가 실행된다.
curl localhost

namespace 공유

이렇게 같은 pod 내에 있으면 namespace를 공유하기 때문에, ubuntu 컨테이너에 접속했지만 nginx 컨테이너를 사용할 수 있다.


5. 외부에서 OS 종료

외부에서 원격 컴퓨터를 종료하기 위해서는 root 권한이 필요하다.

# w1-k8s worker node 종료
ssh w1-k8s shutdown -h now

# w2-k8s worker node 종료
ssh w2-k8s shutdown -h now

# master node 종료
shutdown -h now

w1-k8s 종료
w2-k8s 종료
master 종료
전부 종료된 것 확인


6. 58일차 후기

쿠버네티스를 사용할 때는 쿠버네티스의 구성요소인 kubectl, kubeadm 등의 명령어를 사용하여 동작 시킬 수도있지만, yaml에 쿠버네티스 동작에 필요한 정보를 작성하여 사용할 수도 있다. 

yaml 파일은 쿠버네티스 뿐만아니라 거의 대부분 환경에서 적용할 수 있는 파일이다. 사용 문법이 특별히 어려운 것은 아니기 때문에, 사용 가능하다면 최대한 자주 사용해 익히면 좋을 것 같다는 생각이 들었다.

 

또한, 작성한 프로젝트를 컨테이너로 만들고, 만든 컨테이너를 쿠버네티스로 관리하기 위해 쿠버네티스의 pod에 대한 수업을 진행하였다.

내가 만든 컨테이너를 관리하기 위해 쿠버네티스를 사용하고, 이를 pod라는 단위로 묶어 사용할 수 있기 때문에 해당 개념을 알아두는게 쿠버네티스 활용에 도움이 될 것 같다는 생각이 들었다.