Kubernetes

K8S Service Network

uuuhhh 2022. 11. 8. 09:52

▪︎ Service(서비스)란?


  • 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법

 

 

▪ ServiceTypes(서비스 퍼블리싱)


  • ClusterIP : 서비스를 클러스터-내부 IP에 노출시킨다. (ServiceTypes → default value)
  • NodePort : 고정 포트(NodePort)로 각 노드의 IP에 서비스를 노출시킨다.
  • LoadBalancer : 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킨다.
  • ExternalName : 해당 DNS Name에 대한 CNAME 레코드 반환

 

 

▪ ClusterIP


  • 클러스터 내부의 파드가 클러스터 내부의 다른 파드에 통신할 수 있는 서비스 제공
  • 외부에서의 접근 불가능
  • 모든 노드에 iptables rule 설정
  • 파드에서 접속 시 해당 노드에 존재하는 iptables rule에 의해서 분산 접속

 

  • Rule 생성
    • 서비스(Type : ClusterIP) 생성→ API server → kube-proxy → iptables

 

  • Traffic (내부→내부)

  • Source : Source Resource 보존
  • Destination : DNAT

 

• sessionAffinity: ClientIP (Option)


  • 클라이언트가 접속하고자 하는 목적지(파드)에 고정적인 접속

 

• ClusterIP 결론


  • 헬스 체크 기능 x
  • 외부에서 접속 x
    → →
  • 서비스 디버깅 용도
  • 내부 트래픽 허용, 내부 대시보드 표시 등에 대한 목적

 

 

▪ NodePort


  • 외부 트래픽을 직접 서비스로 가져오는 원시적인 방법
  • 모든 노드에서 특정 포트를 열고 있으며 특정 포트로 전송되는 모든 트래픽이 서비스로 전달

 

💡 특정 포트(nodePort) : 외부 사용자가 애플리케이션에 접근하기 위한 포트번호

 

  • 모든 노드에 iptables rule 설정
  • 파드에서 접속 시 해당 노드에 존재하는 iptables rule에 의해서 분산 접속

 

  • Traffic (외부→내부)

  • Source : (Node-IP 로) SNAT
  • Destination : DNAT

 

• externalTrafficPolicy: Local (Option)


  • NodePort로 접속 시 해당 노드에 배치된 파드로만 고정적인 접속
  • SNAT 되지 않아 Source IP(External Client IP) 보존

 

• NodePort 결론


  • 헬스 체크 기능 x
  • 내부 노드 자원 노출로 보안 취약
  • 하나의 포트에 하나의 서비스만 지원
  • 노드/VM IP 주소 변경시 고려
    → →
  • 일시적인 서비스 / 적은 비용이 필요한 서비스 목적
  • 데모 앱 / 임시 앱 서비스 목적

 

 

▪ LoadBalancer


  • 클러스터의 서비스를 클라우드 제공자 측(AWS, Azure, Openstack..)의 로드밸런서로 노출
  • 외부의 로드 밸런서를 통해 들어온 트래픽이 서비스의 설정값을 따라 해당되는 파드들로 연결
  • 로드밸런서가 부하분산하여 파드가 존재하는 노드들에게 전달
  • 로드밸런서의 헬스 체크 기능으로 문제가 있는 노드에 외부 요청 트래픽을 전달하지 않는다.

 

  • Traffic (외부→로드밸런서→내부)

  • Source : Source Resource 보존 (externalTrafficPolicy: local이므로..)
  • Destination : DNAT + DNAT

 

• LoadBalancer 결론


  • 제일 권장하는 서비스 노출 타입
  • HTTP, TCP, UDP 등과 같은 거의 모든 종류의 트래픽을 전송 가능
  • 외부에 노출되는 것은 로드밸런서 자원 뿐이라 보안성 향상
  • 노출되는 서비스당 LoadBalancer에 대한 비용에 대한 부담

 

 

Ref.


CloudNet@ Blog

Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?

서비스