DevOps/Kubernetes

쿠버네티스 네트워킹: 서비스, 서비스디스커버리, CoreDNS

techrybbit 2025. 3. 6. 21:56

왜 서비스를 만들어서 통신할까?

쿠버네티스의 파드에는 이미 IP가 부여돼서, 통신이 가능합니다. 그러면 파드에 직접 통신하지 왜 굳이 서비스라는 것을 하나 더 만들어서 이걸로 통신하는 걸까요?
 
그 이유는 파드의 특징 때문입니다.
파드는 일회용품처럼 쓰다 버리는 리소스입니다. 따라서 해당 IP를 등록했더라도 언제 파드가 삭제후 다시 생성될지 모르기 때문에 파드의 IP는 수시로 바뀔수있어 안정적인 통신이 어렵습니다.
 
그와 반대로 서비스는 안정적인 통신이 가능합니다.
파드가 죽더라도 새로운 파드가 기존에 있던 서비스에 붙어있으니 동일한 서비스 IP로 접근이 가능합니다.
 
이외에도 서비스는 아래와 같은 기능도 제공해 줍니다.
 
1. 로드밸런서처럼 서버의 부하분산
2. DNS처럼 서비스이름을 통해서 통신(서비스 디스커버리)
 

서비스 디스커버리

서비스는 안정적인 IP 서비스를 제공해 줄 뿐만 아니라, DNS처럼 서비스 이름을 통해 IP를 참조하도록 해줍니다.
 
예를 들어, myservice이름의 서비스를 생성하면 myservice로 접근 시 연결돼있는 IP로 접근이 가능합니다.
 

Service의 yaml 구성요소

서비스의 yaml에는 크게 service와 selector가 있습니다.

 

sercive

1. port: 클러스터 내부에서 서비스로 들어갈때 허용되는 포트

2. protocal: 사용할 프로토콜

3. targetPort: port로 들어온 트래픽을 어떤 포트로 전달할지 작성

selector

selector는 파드의에 달려있는 label값과 매칭됩니다.


예를들어 탕수육 찍먹파 label을 가진 파드와 부먹파 label을 가진 파드가 있다면, selector부분에 탕수육 찍먹파를 등록해두면 찍먹파 파드만 골라 서비스와 연결합니다.
 
(참고) selector&label 기준으로 파드를 연결하면 이름, IP처럼 자주 바뀌는 부분과 다르게 느슨하게 연결되어 파드등록을 덜해도 됩니다.
 

CoreDNS

서비스 이름을 적으면, 알아서 IP로 바뀐다고 하는데, 내부적으로 CoreDNS가 존재하기 때문입니다.
CoreDNS는 클러스터 DNS 서버로 kube-dns라는 서비스가 붙어있는 파드입니다.
 

동작방식

1. service이름으로 요청
2. 리눅스의 DNS 설정 파일(/etc/resolv.conf)에 설정된 nameserver를 사용하여 kube-dns 서비스로 질의
3. kube-dns는 CoreDNS 파드로 트래픽을 넘겨줍니다.
4. CoreDNS가 실행 중인 파드에서 DNS 쿼리를 처리하고, 해당 서비스의 IP를 반환.
 

728x90