쿠버네티스 내부의 네트워크 트래픽 라우팅파드와 파드 간 통신외부 트래픽을 파드로 전달하기Service, LoadBalancer분산 환경에 따라 구현 방식(도커 데스크톱, K3s, AKS, EKS )에 발생하는 차이Service, NodePort쿠버네티스 클러스터 외부로 트래픽 전달하기 (ExternalName)사용 예시헤드리스 서비스쿠버네티스 서비스의 해소 과정Controller네임스페이스
파드는 IP 주소를 가지며, 이 IP 주소를 통해 TCP/UDP 프로토콜로 통신함
우리는 항상 서비스를 통해 파드를 다룸.
그리고 서비스가 DNS로 제공하는 디스커버리 기능 덕분에 파드의 IP 주소를 우리가 직접 참조할 일은 거의 없다.
서비스는 유형이 다양하며 아래와 같음
- 파드 간 통신(ClusterIP)
- 외부 트래픽을 파드로 전달하기(LoadBalancer, NodePort)
- 내부에서 클러스터 외부로 트래픽 전달하기(ExternalName, 헤드리스 서비스)
또한 서비스는 파드나 디플로이먼트와는 별개의 생애 주기를 가짐
파드끼리 통신을 위해 쿠버네티스는 표준 네트워크 프로토콜인 TCP와 UDP를 지원하고 이 두 프로토콜은 IP 주소로 트래픽을 제어하는데, IP 주소는 파드를 대체할 때 주소가 변경된다는 문제가 있음
쿠버네티스는 서비스(
service
)에 어드레스 디스커버리(address discovery
) 기능을 제공하여 이 문제를 해결함서비스는 파드에서 들고나는 통신 트래픽의 라우팅을 맡는 유연한 리소스다.
- 통신 트래픽은 클러스터 외부에서 파드로 전달되는 것과
- 파드에서 클러스터 외부로 전달되는 것 모두를 포함
쿠버네티스 내부의 네트워크 트래픽 라우팅
언제든지 다른 것으로 바뀔 수 있는 리소스(pod의 ip 주소)에 접근하기 위한 고정된 주소는 새로운 문제가 아니다.
인터넷에서는 IP 주소에 기억하기 쉬운 이름을 붙이는 도메인 네임을 도입하여 이 문제를 해결하였고, 쿠버네티스에서도 같은 해결책을 도입함. 쿠버네티스 클러스터에는
전용 DNS 서버
가 있음
- 서비스가 생성되면 서비스의 IP 주소가 클러스터 내 DNS 서버에 등록됨. 이 IP 주소는 정적 주소로 서비스가 삭제될 때까지 변경되지 않음
디플로이먼트
가 그랬듯이,서비스
역시레이블 셀렉터
를 이용한 방식으로파드
와 느슨한 연결을 가짐.
- 서비스는 복수의 파드가 공유할 수 있는 가상 주소. sleep-1 파드는 서비스를 갖지 않기 때문에 도메인 네임으로 접근할 수 없다.
- 이런 유형의 서비스는 파드와 파드가 가진 네트워크 주소를 추상화한 것임
- 서비스는 자신만의 IP 주소를 가지고, 이 주소 역시 서비스가 삭제될 때까지 바뀌지 않음. 컨슈머 컴포넌트가 이 주소로 요청을 보내면 쿠버네티스가 서비스와 연결된 파드의 실제 IP 주소로 요청을 전달해줌
서비스를 배포하면 쿠버네티스 내부 DNS 서버에 고정 IP 주소에 대한 도메인 네임이 등록된다.
파드와 파드 간 통신
Service type: ClusterIP
서비스의 유형 중 가장 기본이 되는 것을
클러스터 IP
라고 함클러스터 IP
는 클러스터 전체에서 통용되는 IP 주소를 생성하는데, 이 IP 주소는 파드가 어느 노드에 있더라도 접근이 가능하다
- 하지만 이 IP 주소는 클러스터 내에서만 유효하기에 파드와 파드 간 통신에서만 쓰인다. 내부에서는 접근이 가능하되 외부의 접근은 차단해야 하는 분산 시스템의 컴포넌트에 적합함
- 서비스의 label selector와 pod의 label이 매칭되면 쿠버네티스는 자동으로 endpoint 오브젝트를 별도로 생성합니다
그 후 numbers-web 에서 http://numbers-api/sixeyed/kiamol/master/ch03/numbers/rng 이 uRL로 api 를 요청하게 됨. 이때 numbers-web 에서 numbers-api 로 요청하기 위해서는 해당 도메인이 내부적으로 찾아져야 하는데 그러기 위해서는 서비스가 생성되어 있어야 함
이 서비스가 생성이 되면 numbers-web 에서 http://numbers-api/sixeyed/kiamol/master/ch03/numbers/rng 이 url 로 요청 시 DNS resolve 가 진행되어 요청이 가능해짐
numbers-api 호스트 → Service 를 참조 → Service 에서 selector를 통해 찾은 pod 로 연결
외부 트래픽을 파드로 전달하기
Service, LoadBalancer
Service type: LoadBalancer
지금까지는 포트 포워딩으로 외부 트래픽을 파드로 전달하는 것을 대신했지만 이 방법은 디버깅을 위한 임시변통에 지나지 않음 → 원래대로라면 numbers-web 를 위한 서비스도 배포되어야 함
쿠버네티스에는 클러스터 외부에서 들어오는 트래픽을 파드에 전달하는 여러 가지 방법이 있음. 그 중
로드밸런서
유형의 서비스는 아래와 같이 동작함 
로드밸런서
서비스는 클러스터로 트래픽을 전달해 주는외부 로드밸런서
와 함께 동작하며, 레이블 셀렉터와 일치하는 파드로 트래픽을 전달함- 로드밸런서를 동적으로 생성하는 기능을 제공하는 환경에서만(AWS, GCP 등) 사용할 수 있음
로드밸런서
서비스의 커버 범위는 클러스터 전체. 따라서 어느 노드에 있는 파드라도 트래픽을 전달받을 수 있음- 대상 파드가 요청받은 노드에 있지 않더라도 쿠버네티스가 올바른 노드까지 이 트래픽을 전달함
- 위 서비스는 8080번 포트를 주시하다가 해당 포트로 들어오는 트래픽을 app:numbers-web 라벨을 가진 파드의 80번 포트로 전달함
- 만약에 그러한 조건을 만족하는 파드가 여러 노드에 걸쳐 있더라도 어디로 배분할지는 쿠버네티스가 알아서 할당해줌
- 로드밸런서는 외부 IP 주소를 주시하다가 해당 주소로 들어오는 트래픽을 클러스터에 전달함
- 이 주소는 클러스터에서 제공되는 주소로, 위 예시에서는 도커 데스크톱을 이용하였어서, localhost가 제공됨
- 로드밸런서 서비스에는 클러스터 IP 가 함께 부여되고, 클러스터 안에 있는 다른 파드는 서비스 이름(
numbers-web
)으로 서비스에 접근 가능함 - 예:
http://numbers-web:8080
으로 numbers-web 파드의 80 포트로 접근이 가능함
분산 환경에 따라 구현 방식(도커 데스크톱, K3s, AKS, EKS )에 발생하는 차이
도커 데스크톱
의 쿠버네티스는 로컬 환경으로, 이 클러스터는 단일 컴퓨터에서 동작하며, 로컬 컴퓨터의 네트워크 스택과 통합되어 로드밸런서 서비스가 로컬 호스트 주소를 사용할 수 있다. 모든 로드밸런서 서비스가 localhost로 외부에 공개되고, 따라서 여러 개의 로드밸런서 서비스를 사용하려면 이들의 포트를 각각 다르게 설정해야 함
K3s
환경의 쿠버네티스에서는 별도의 라우팅 테이블을 설정하는 방식으로 로드밸런서 서비스를 구현함- 각각의 로드밸런서 서비스는 호스트 컴퓨터(여기서는 가상 머신)의 IP 주소로 외부에 공개된다. 따라서 localhost 또는 IP 주소(로컬 네트워크에서 접근도 가능)로 로드밸런서 서비스에 접근할 수 있다.
- 역시 도커 데스크톱과 마찬가지로 여러 개의 로드밸런서 서비스를 사용하려면 이들의 포트를 각각 다르게 설정해야 한다.
AKS나 EKS
같은 클라우드 환경의 쿠버네티스는 고가용성을 확보한 다중 노드 클러스터임. 이들 클러스터에서 로드밸런서 서비스를 배포하면 클라우드에 실제 로드밸런서가 만들어진다.- 이 로드밸런서가 외부에서 들어오는 트래픽을 노드로 전달하고, 그다음 쿠버네티스가 이를 다시 파드로 전달한다.
- 따라서 로드밸런서 서비스의 IP 주소도 각기 다르다. 또한 이들 IP 주소는 공인 IP 주소이며 인터넷에서 접근할 수 있다.
YAML 로 작성된 매니페스트가 동일하면 결과도 동일하지만 쿠버네티스가 분산을 구현하는 방식에는 차이가 있을 수 있음
Service, NodePort
외부에서 클러스터로 들어오는 트래픽을 파드로 전달하는 역할을 하는 서비스 리소스의 유형이 한가지 더 있는데, 바로
노드포트
(NodePort
) 임
- 노드포트 서비스는 외부 로드밸런서가 필요 없고, 클러스터를 구성하는 모든 노드가 이 서비스에 지정된 포트를 주시하며 들어온 트래픽을 대상 파드의 대상 포트로 전달함
- 외부 로드밸런서가 없으므로 트래픽이 곧바로 클러스터 노드로 인입됨
- 트래픽이 클러스터에 인입된 후에는 로드밸런서 서비스와 비슷하게 동작. 어느 노드가 요청을 받더라도 대상 파드가 있는 노드 3으로 트래픽이 전달됨
단점
- 노드포트 서비스는 서비스에서 설정된 포트가 모든 노드에서 개방되어 있어야 하기 때문에 로드밸런서 서비스만큼 유연하지 x
- 또한 다중 노드 클러스터에서 로드밸런싱 효과를 얻을 수 없음
클러스터 환경에 따라 동일하게 동작하지 않고 실제로도 사용할일이 별로 없음
로드밸런서 서비스를 사용하면 개발 환경부터 운영환경까지 애플리케이션 정의를 동일하게 유지할 수 있다. 그만큼 관리해야 할 YAML 파일 개수도 줄어든다.
쿠버네티스 클러스터 외부로 트래픽 전달하기 (ExternalName)
익스터널네임 서비스의 중요한 특징이 있다.
익스터널네임 서비스는 애플리케이션이 사용하는 주소가 가리키는 대상을 치환해줄 뿐 요청의 내용 자체를 바꾸어 주지는 못한다는 점이다.
데이터베이스처럼 TCP 프로토콜을 쓰는 컴포넌트라면 문제없지만, HTTP 서비스라면 이야기가 달라진다. HTTP 요청의 헤더에는 대상 호스트명이 들어간다. 그리고 이 헤더의 호스트명이 익스터널네임 서비스의 응답과 다르다면 HTTP 요청이 실패함
위 문제를 피해가려면 헤더의 호스트명을 직접 수정해주어야 함
데이터베이스 같은 스토리지 컴포넌트 등이 대표적으로 쿠버네티스 외부에서 동작하는 소프트웨어의 예로, 이런 경우 쿠버네티스 클러스터에서 외부로 트래픽이 전달되어야 한다.
애플리케이션 아키텍처와 무관하게 클러스터 외부를 가리키는 도메인 네임 해소에도 쿠버네티스 서비스 리소스를 활용할 수 있다.
첫 번째 선택지는 익스터널네임(
External Name
)서비스를 사용하는 방법- 익스터널네임 서비스는 어떤 도메인 네임에 대한 별명이라고 생각하면 됨
- 애플리케이션 파드에서 로컬 네임을 사용하고, 쿠버네티스 DNS 서버에 이 로컬 네임을 조회하면 외부 도메인으로 해소해 주는 방식

- 익스터널 네임 서비스는 도메인 네임의 별명을 만듬
- 파드가 로컬 클러스터 네임
db-service
를 사용하면, 쿠버네티스 DNS 서버에서 이 도메인 네임을 외부 도메인app.mydatabase.io
로 resolve 해줌 - 파드는 사실적으로는 클러스터 외부의 컴포넌트와 통신을 하지만, 이를 알지 못함. 파드에서 사용하는 도메인 네임이 로컬 도메인 네임이기 때문에
사용 예시
- 익스터널네임 서비스는 애플리케이션 설정에 포함하기 어려운 환경 간 차이를 반영할 때 유용함
- 데이터베이스 서버 대신 하드코딩된 문자열을 사용한다거나, 개발 환경에서는 로컬 도메인 네임을 파드에서 동작하는 테스트용 데이터베이스 서버에 연결하고 운영환경에서는 실제 도메인에 연결된 운영 데이터베이스 서버에 연결하도록 할 수 있음
- 쿠버네티스는 DNS의 표준 기능 중 하나인 캐노니컬 네임(Canonical NAME, CNAME)을 사용하여 익스터널네임 서비스를 구현함
- 웹 애플리케이션 파드가 도메인 네임 numbers-api를 조회하면 쿠버네티스 DNS 서버가 이 CNAME(raw.githubusercontent.com)을 반환함
헤드리스 서비스
익스터널네임서비스 와 비슷하게 도메인 네임 대신 IP 주소를 대체해 주는 방법
ClusterIP 를 없앤 Service 의 경우 DNS Server 가 모든 Pod 들의 A 레코드를 직접 알려준다. 요청을 수신받을 ClientIP 가 없으니, 머리가 없는 Service 라고 부를 수 있다.
쿠버네티스 서비스의 해소 과정

- 파드 속 컨테이너가 요청한 도메인 네임 조회는
쿠버네티스 DNS 서버
가 응답한다 - 조회 대상이 서비스 리소스라면, DNS 서버는 클러스터 내 IP 주소 또는 외부 도메인 네임을 반환한다
- 파드에서 나온 모든 통신은 쿠버네티스의 또 다른 구성요소인
네트워크 프록시
가 라우팅을 담당함 - 이 프록시는 각각의 노드에서 동작하며 모든 서비스의 엔드포인트에 대한 최신 정보를 유지하고, 운영체제가 제공하는 네트워크 패킷 필터(리눅스의 경우 IVPS 또는 iptables)를 사용하여 트래픽을 라우팅함
- 클러스터 IP는 네트워크 상에 실재하지 않는 가상 IP 주소고, 파드는 각 노드마다 동작하는
네트워크 프록시
를 경유하여 네트워크에 접근한다. 그리고 이 프록시는 패킷 필터링을 적용하여 가상 IP 주소를 실제 엔드포인트로 연결함
Controller
- 서비스에도 컨트롤러가 있어 파드가 변경될 때마다 엔드포인트의 목록을 최신으로 업데이트한다.
- Controller 정의 : 클러스터의 상태를 관찰한 다음, 필요한 경우에 생성 또는 변경을 요청하는 컨트롤 루프
- 쿠버네티스 클러스터는 항상 2가지의 상태(desired state, current state)를 가지며 쿠버네티스에서 기본으로 제공되는 컨트롤러는 ControlPlane 에서 동작한다.
- 컨트롤러는 크게 쿠버네티스에서 자체적으로 제공되는 컨트롤러와 커스텀 컨트롤러로 구분됨
- 내장 컨트롤러는 control plane에서 작동한다고 함
- Controller에도 여러 종류가 있음 [ Kubernetes docs ] control plane components
- ReplicationController
- ReplicaSet, Deployment
- DaemonSet
- Stateful Sets
- Job, CronJob
- EndpointSlice controller : populates EndpointSlice objects (to provide a link between Services and Pods)
- …
네임스페이스
- 모든 쿠버네티스 리소스는 네임스페이스 안에 존재함
- 네임스페이스는 쉽게 말해 다른 리소스를 하나로 묶기 위한 리소스
- 따라서 쿠버네티스 클러스터를 논리적 파티션으로 나누는 역할을 함

- 클러스터는 여러 개의 네임스페이스로 나뉠 수 있다.
default
네임스페이스가 항상 존재하고, 여기에 다른 네임스페이스를 추가하여 여러 리소스를 하나로 묶을 수 있음
- 네임스페이스 안에서는 도메인 네임을 이용하여 서비스에 접근함.
numbers-web
파드가numbers-api
라는 이름으로 api 서비스에 접근할 수 있었던 것도 이때문임
- 네임스페이스를 포함하는 완전한 도메인 네임으로도 서비스에 접근할 수 있음. 예를 들어 다른 네임스페이스에 속하는 파드는 numbers-api.default.svc.cluster.local 이라는 도메인 네임으로 API 서비스에 접근할 수 있음
- 도메인 네임 :
<service_name>.<namespace>.<subdomain>.<domain name>
- db-service.dev.svc.cluster.local
kube-system
네임스페이스에 쿠버네티스의 핵심 기능인 DNS 서버가 쿠버네티스 애플리케이션 형태로 동작 중