제 8 장: 서비스 디스커버리 와 네트워크

지금까지 우리는 쿠버네티스에서 애플리케이션을 어떻게 파드(Pod) 형태로 실행하고, 다양한 컨트롤러(디플로이먼트, 스테이트풀셋, 데몬셋, 잡/크론잡)를 사용하여 이 파드들을 효과적으로 관리하는지 살펴보았습니다. 하지만 애플리케이션을 성공적으로 배포하는 것만큼이나 중요한 것은, 이렇게 배포된 애플리케이션들이 서로 어떻게 통신하고, 또 외부 사용자들이 어떻게 이 애플리케이션에 접근할 수 있도록 할 것인가 하는 문제입니다. 바로 이 ‘연결성’의 문제를 해결하는 것이 쿠버네티스 네트워킹의 핵심이며, 이번 8장에서는 이 주제를 깊이 있게 다룰 것입니다.

쿠버네티스 환경에서 파드들은 동적으로 생성되고 삭제될 수 있으며, 재시작될 때마다 새로운 IP 주소를 할당받을 수 있습니다. 이러한 동적인 특성은 애플리케이션의 확장성과 회복탄력성을 높여주지만, 동시에 서비스 간 통신이나 외부 접근에 있어 예측 불가능성을 야기합니다. 만약 우리가 특정 기능을 제공하는 파드 그룹에 요청을 보내고 싶은데, 그 파드들의 IP 주소가 계속 바뀐다면 어떻게 안정적으로 연결할 수 있을까요? 또한, 클러스터 외부의 사용자가 우리 애플리케이션에 안전하고 효율적으로 접근하려면 어떤 방법이 필요할까요? 더 나아가, 보안을 위해 특정 파드들 간의 통신을 어떻게 제어할 수 있을까요?

이번 8장에서는 이러한 질문들에 대한 답을 찾아가는 여정을 떠날 것입니다. 쿠버네티스가 제공하는 강력한 네트워킹 모델과 다양한 리소스들을 통해, 우리는 복잡한 마이크로서비스 아키텍처에서도 서비스들이 서로를 쉽게 발견하고(서비스 디스커버리), 안정적으로 통신하며, 외부 트래픽을 효율적으로 관리하고, 보안 정책을 적용하는 방법을 배우게 될 것입니다.

  • 먼저 8.1 쿠버네티스 네트워킹 기초에서는 쿠버네티스가 추구하는 근본적인 네트워킹 모델과 그 기본 요구사항들을 이해하고, 파드 IP, 노드 IP, 클러스터 IP, 외부 IP 등 쿠버네티스 환경에서 사용되는 다양한 IP 주소들의 의미와 역할을 명확히 구분할 것입니다. 또한, 이러한 네트워크 환경을 실제로 구현하는 핵심 요소인 CNI(Container Network Interface)에 대해서도 간략히 소개하여 쿠버네티스 네트워킹의 밑바탕을 다질 것입니다.
  • 다음으로 8.2 서비스 (Service): 파드 집합에 대한 안정적인 엔드포인트 제공에서는 동적으로 변하는 파드 IP 주소 문제를 해결하고, 특정 기능을 수행하는 파드 그룹에 대한 고정적인 접근 지점(엔드포인트)을 제공하는 ‘서비스’ 오브젝트에 대해 집중적으로 알아볼 것입니다. 서비스가 왜 필요한지, 어떤 종류의 서비스 타입(ClusterIP, NodePort, LoadBalancer, ExternalName)들이 있으며 각각 어떤 상황에 사용되는지, 그리고 서비스가 어떻게 레이블 셀렉터를 사용하여 대상 파드들을 찾아내는지 등을 배우고, 직접 다양한 서비스 타입을 생성하고 테스트하는 실습도 진행합니다.
  • 이어서 8.3 인그레스 (Ingress): HTTP/S 트래픽 외부 노출 및 라우팅에서는 클러스터 외부에서 들어오는 HTTP 및 HTTPS 트래픽을 클러스터 내부의 서비스들로 지능적으로 라우팅하는 ‘인그레스’에 대해 탐구합니다. 인그레스가 왜 필요하며, 로드밸런서 타입의 서비스와 비교하여 어떤 장점을 가지는지, 그리고 인그레스 리소스를 실제로 동작시키기 위한 ‘인그레스 컨트롤러’의 역할은 무엇인지 살펴볼 것입니다. 또한, 인그레스 규칙을 정의하여 경로 기반 라우팅, 호스트 기반 라우팅, TLS 종료 등을 설정하는 방법을 배우고, 이를 실습을 통해 직접 구성해 볼 것입니다.
  • 마지막으로 8.4 네트워크 폴리시 (Network Policy): 파드 간 통신 제어에서는 쿠버네티스 클러스터 내의 보안을 강화하기 위해 파드 간의 네트워크 통신을 세밀하게 제어하는 ‘네트워크 폴리시’에 대해 알아볼 것입니다. 기본적으로 쿠버네티스는 모든 파드가 서로 자유롭게 통신할 수 있도록 허용하지만, 보안 요구사항에 따라 특정 네임스페이스나 레이블을 가진 파드들 간의 통신만 허용하거나 차단해야 할 필요가 있습니다. 네트워크 폴리시가 어떻게 동작하는지, 어떤 CNI 플러그인이 이를 지원하는지, 그리고 인그레스(Ingress, 들어오는 트래픽) 및 이그레스(Egress, 나가는 트래픽) 규칙을 어떻게 정의하여 원하는 통신 흐름을 만들 수 있는지 배우고, 실습을 통해 특정 파드 간의 통신을 제한하는 정책을 적용해 볼 것입니다.

이 장을 마치고 나면, 여러분은 쿠버네티스 환경에서 애플리케이션들이 어떻게 서로 연결되고 외부 세계와 소통하는지에 대한 깊이 있는 이해를 갖게 될 것입니다. 이는 클라우드 네이티브 애플리케이션을 설계하고 운영하는 데 있어 매우 중요한 지식이며, 더 복잡하고 규모 있는 시스템을 구축하는 데 튼튼한 기반이 될 것입니다.