[Devops] Pod란 무엇인가?

J-USER·2023년 4월 2일
0

DevOps

목록 보기
9/10
post-thumbnail

파드란?

파드
= 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위
= 하나 이상의 컨테이너를 포함한 컨테이너 그룹

그래서 파드는 스토리지 및 네트워크 스택을 컨테이너끼리 공유하게 된다.

🙋 네트워크 스택을 공유한다는게 무슨 의미?
🤖 Pod 안의 모든 컨테이너가 localhost를 통해 서로에게 도달이 가능하다는 것

예를들어 로컬컴퓨터에서 react를 실행하면 localhost:3000으로 실행이 가능하고, 만약 spring be를 실행한다면 localhost:8080으로 접근이 가능할것이다. 이는 같은 컴퓨터에서 작동했긴때문에, 즉 같은 네트워크 스택을 공유하기 때문에 port로 접근할 수 있다는 뜻이다.

🙋 근데 왜 공유해야하는데?
🤖 파드간의 네트워킹 구성을 단순화하고 여러 네트워크 인터페이스를 관리하는 오버헤드를 줄이기 위해서야.

만약 컨테이너 한개를 파드에 실행해보자.

  • eth : physical network interface (LAN)
  • veth : virtual network interface

🙋 veth 가 뭔데? VM과 같은거야?
🤖 ㄴㄴ 다름 둘다 하나의 컴퓨터를 여러대처럼 운용하지만, 가상 네트워크 인터페이스는 많은 프로그램이 동시에 인터넷에 액세스하는데 도움주는것이고,
반면에 VM은 서로 간섭하지 않고 동일한 컴퓨터에서 다른 작업을 수행하기 위함임.

예시를 보면, docker0과 veth0은 같은 네트워크(172.17.0.0/24)로 묶여있고 docker0는 veth0의 default gateway 역할을 하고 있다.

🙋 default gateway 가 뭔데?
🤖 기본 게이트웨이는 인터넷의 올바른 위치로 메시지를 보내는 역할임.
🙋 좀 자세히 설명해줘;;
🤖 컴퓨터가 무엇을 어디로 보내야 할지 모를 경우 기본 게이트웨이로 보내면서 "이것을 올바른 곳으로 보내주세요!" 라고 하는거라고;;

이때 docker가 컨테이너를 실행할 때 네트워크 namespace를 적절히 설정하여 container1 안에서는 veth0만 보이게 된다.

🙋 namespace 가 뭔데?
🤖 시스템 내에서 리소스를 분리하고 격리하는거임.
🙋 그게 왜 필요한데?
🤖 동일한 리소스의 여러 인스턴스가 서로 간섭하지 않게 하기 위해서요.
🙋 그걸 어케 나누는데?
🤖 ㅂㄷㅂㄷ;; 리소스와 리소스를 사용하는 시스템 간에 추상화 수준을 제공해서 다른 리소스로부터 격리 시킴.

여기서 두번째 컨테이너를 실행해보자.

veth1이 새롭게 지정되었고, 마찬가지로 첫번째 컨테이너와 같은 네트워크 대역이기 때문에 서로의 IP를 알면 서로 통신할 수 있다.

🙋 컨테이너와 bridge간의 연결은 어케하는데?
🤖 linked virtual ethernet device pair로 연결함.
🙋 하..그게뭔데 10덕아..
🤖 물리적 이더넷 케이블로 연결된 것처럼 서로 통신할 수 있도록 두 개의 가상 네트워크 인터페이스를 함께 연결하는 방법임.
🙋 좀 쉽게 설명해봐;;
🤖 가짜 전화선에 연결된 가짜 전화기 두개라고 생각하세용

이렇게 되면, Pod의 네트워크 스택이 veth0, veth1 로 서로 나뉘어져있게 된다. 그래서 도커에서는 컨테이너를 실행할 때 새로운 virtual network interface(veth)를 생성하는 대신 기존에 생성된 interface를 이용하게 된다.

이게 가능한 이유는 namespace는 매우 유연한 구조로 되어있기 때문이다.

이제 두 컨테이너는 같은 veth0을 공유하게 되었다. 이 특징은 두가지를 의미하는데

  1. 서로의 ip를 알필요없이 port를 통해 컨테이너끼리 통신할 수 있다.

  2. 두 컨테이너 모두 바깥에서 172.17.0.2로 접근을 할 수 있다.

사실상 두개가 같은 말이긴 하지만.. (그냥 나눠보고 싶었음) 쿠버네티스에서는 이러한 것을 특별한 컨테이너를 통해 구현한다.

이 컨테이너는 각 Pod마다 존재하며 다른 컨테이너에게 network interface를 제공하는 역할만을 담당한다.

만약 쿠버네티스 Pod가 실행되는 worker node에 들어가서 docker ps라고 검색을 하면 적어도 한개 이상의 pause라는 명령으로 실행된 컨테이너를 볼 수 있을것이다.

pause 명령을 가진 컨테이너는 쿠버네티스가 SIGTERM 명령을 내리기 전까지 아무것도 하지 않고 sleep 상태로 존재합니다. 하는 일이 거의 없지만 이 pause 컨테이너가 서로 다른 컨테이너끼리, 바깥 세상과의 통신을 담당하는 Pod의 핵심이다.

profile
호기심많은 개발자

0개의 댓글