[Kubernetes] 쿠버네티스의 네트워킹 개요

2023. 7. 14. 14:01기술 창고/Kubernetes

728x90
SMALL

쿠버네티스가 어떻게 네트워킹을 처리하는지에 대해 알아보도록 하겠습니다.
뿐만 아니라 Service 검색이 어떻게 작동하는지에 대해서도 알아보겠습니다.

 

 

컨테이너 네트워킹

앞서 도커의 컨테이너를 사용할 때 각 컨테이너에 보통 독립적인 image 를 받아서 하나의 어플리케이션만을 운영하는 것을 권장한다는 것을 알고 있을 것입니다.


예를 들어, 한 컨테이너에 java 어플리케이션을 넣고 거기에 MySQL을 포함시켜서 컨테이너를 운영하는 것은 지양해야 합니다.
하나의 Java 어플리케이션 컨테이너, 하나의 MySQL 컨테이너를 따로 분리시켜 운영시키는 것을 권장합니다.
즉, 도커는 단일 서비스를 위해 설계되었다는 것입니다.

 

 

 

Java 어플리케이션 컨테이너와 MySQL 컨테이너를 각자 독립적으로 운영하면서 네트워킹을 통해 연결시켜주어야 합니다.
그 전에 독립적으로 운영하는 것이 보편적이고 권장하는 내용이지만 이 두 개의 컨테이너를 하나의 Pod에 넣어서 같이 관리해주는 간편한 방법이 있습니다.

 

 

Pod로 묶어서 관리하게 되면 두 컨테이너는 로컬 호스트를 사용하여 서로를 인지할 수 있게됩니다.
Java 어플리케이션에서 코드를 작성할 경우, MySQL 로컬 호스트 주소를 넣어주면 MySQL에 접근하여 데이터를 조회할 수 있게 됩니다.

 

 

이러한 방법대로 여러 컨테이너를 하나의 Pod 에 관리하는 방법이 있지만 간편하다고 해도 이 방법을 추천하지 않습니다.
이유는 동일한 Pod에서 데이터베이스와 어플리케이션을 실행하면 포드 관리가 훨씬 더 복잡해지기 때문입니다.
또한, Pod 에서 문제가 발생하게 되면 이것이 어플리케이션이나 데이터베이스 컨테이너에 의한 문제인지 일일히 확인해야 합니다.
이러한 이유들 때문에서라도 각각 별도의 컨테이너, 별도의 Pod, 별도의 Service로 배포해야 합니다.

 

 

어플리케이션과 데이터베이스 컨테이너 간의 통신을 하기 위한 코드를 작성하기 위해서는 데이터베이스의 Service의 ip 주소를 참조하기만 하면 됩니다.
이러한 ip 주소는 쿠버네티스에 의해 임의로 할당되기 때문에 저희가 ip 주소를 미리 알 수 있는 방법은 없습니다.
다음 번에 쿠버네티스 클러스터를 실행할 때는 해당 Service에 다른 ip 주소가 할당되어 있을 수도 있습니다.

쿠버네티스에는 자체적으로 유지 관리되는 프라이빗 DNS 서비스가 있습니다.

여기서의 DNS 서비스는 일련의 키/값의 쌍을 이루는 형태로 이루어져있는 데이터베이스입니다.
키는 Label을 의미합니다. 즉, 배포하는 Service의 이름을 말합니다.
값은 해당 Service의 ip 주소입니다.


이러한 DNS 시스템의 유지 관리는 쿠버네티스가 전적으로 책임지고 있기 때문에 이 부분에 있어서는 개발자가 고려할 사항은 아니니 안심해도 됩니다.
이 DNS Service 를 kube-dns 라고 합니다.
이 내용을 종합해보면 Webapp이라고 하는 Java 기반 어플리케이션 컨테이너에서 데이터베이스 컨테이너를 호출하게 되면 kube-dns 서비스 컨테이너에 접속한 뒤, 찾는 데이터베이스 컨테이너의 label을 확인하고 해당되는 ip주소를 찾습니다.
그 ip 주소를 가지고 접근하고자 하는 데이터베이스 컨테이너에 접근하여 데이터를 호출하게 됩니다.
즉, 이 DNS Service는 컨테이너 간의 통신을 위한 징검다리 역할을 한다고 보면 됩니다.

 

 

 

!! 정리하자면,

1. 쿠버네티스 네트워킹은 기본적으로 각각 하나의 어플리케이션 및 이미지로 독립적으로 Pod 및 Service로 컨테이너를 운영하여 다른 컨테이너와 통신하는 방식의 네트워킹을 수행한다!

2. 네트워킹을 수행할 때 연결하고자 하는 컨테이너들의 Service들을 쿠버네티스가 운영하는 프라이빗 DNS 서비스를 통해 연결을 수행한다!

 

이렇게 정리할 수 있겠습니다.

728x90
반응형
LIST