K8s

서비스 : 파드와 파드가 가진 IP주소를 추상화

elysia365 2024. 8. 26.
  • 쿠버네티스가 만든 가상 네트워크는 클러스터 전체를 커버한다.
  • 따라서 IP주소만 알면, 서로 다른 노드에서 실행 중인 파드와도 통신이 가능하다.
  • 하지만, 일반적으로 이렇게 통신하지는 않는다.
  • IP주소는 파드가 대체될 때마다 변경되기 때문이다.
  • 인터넷에서 IP주소에 기억하기 쉬운 이름을 붙이는 도메인 네임을 도입하여 문제를 해결하였듯이,
    쿠버네티스 클러스터에는 전용 DNS 서버가 있다.
  • 쿠버네티스 클러스터의 전용 DNS 서버가 서비스(service) 이름과 IP주소를 대응시켜준다.

 

  • 서비스는 파드와 파드가 가진 네트워크 주소를 추상화한 것이다.
  • 디플로이먼트가 파드와 파드가 포함하는 컨테이너를 추상화한 것과 같다.
  • 서비스는 자신만의 IP주소를 갖는다. 
  • 이 주소 역시 서비스가 삭제될 때까지 변경되지 않는다.
  • 컨슈머 컴포넌트가 이 주소로 요청을 보내면 쿠버네티스가 서비스와 연결된 파드의 실제 IP주소로 요청을 연결한다.
  • 서비스와 파드의 연결 관계는 디플로이먼트와 파드의 연결 관계와 마찬가지로 레이블 셀렉터를 사용한다.

간단한 서비스 정의 : sleep2-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: sleep-2
spec:
  selector:
    app: sleep-2
  ports:
    - port: 80
  • 서비스 이름이 도메인 네임으로 사용된다.
  • 서비스 정의에는 셀렉터와 포트의 목록이 포함된다.
  • 서비스를 클러스터에 배포하면 sleep-2라는 도메인 네임이 생성되고
  • 이 도메인 네임은 sleep-2 디플로이먼트에 포함된 파드로 트래픽을 연결한다.
  • 다른 파드에서도 이 도메인 네임을 사용해서 이 파드에 통신을 보낼 수 있다.

주의할 점

  • kubectl exec deploy/sleep-1 -- ping -c 1 sleep-2 와 같이 서비스에 ping 명령을 실행하면 응답을 안한다.
  • ping 명령은 서비스 리소스가 지원하지 않는 ICMP 프로토콜을 사용하기 때문이다.
  • 서비스 리소스는 표준 TCP 및 UDP 프로토콜을 지원한다.

 

댓글