Kubernetes - Service

우야·2021년 5월 25일
0

Service

외부에서 서비스로 통신하기

  • NAT : 네트워크 주소 변환
  • Source NAT : 패킷 상의 소스 IP 주소를 변경함, 보통 노드의 IP 주소
  • Target NAT : 패킷 상의 대상 IP 주소를 변경함, 보통 파드의 IP 주소
  • VIP : 가상 IP 주소, 모든 쿠버네티스 서비스에 할당된 것 같은
  • Kube-proxy : 네트워크 데몬으로 모든 노드에서 서비스 VIP 관리를 관리한다

ClusterIP

  • 클러스터 내부에서 사용되는 IP다.
  • 클러스터 외부에서는 클러스터IP로 접근을 하지 못함
    • 이유? iptables 모드 (기본값)
      • kube-proxy를 운영하는 경우 클러스터 내에서 클러스터IP로 패킷을 보내면 소스 NAT를 통과하지 않는다.

NodePort

  • 서비스로 보내진 패킷은 소스 NAT가 기본으로 적용된다.
  • 클러스터 외부에서는 Node의 IP와 NodePort로 접근 할 수 있다.
    1. 클라이언트는 node2:nodePort로 패킷을 보낸다.
    2. node2는 소스 IP 주소(SNAT)를 패킷 상에서 자신의 IP 주소로 교체한다.
    3. node2는 대상 IP를 패킷 상에서 파드의 IP로 교체한다.
    4. 패킷은 node1(파드가 있는 Node중 1개)로 라우팅 된 다음 엔드포인트로 라우팅 된다.
    5. 파드의 응답은 node2로 다시 라우팅된다.
    6. 파드의 응답은 클라이언트로 다시 전송된다.
  • 해당 Node에 있는 Pod로만 패킷을 보낼수도 있음
    • kubectl patch svc nodeport -p '{"spec":{"externalTrafficPolicy":"Local"}}'
    1. 클라이언트는 패킷을 엔드포인트가 없는 node2:nodePort 보낸다.
      • 패킷은 버려진다.(실패)
    2. 클라이언트는 패킷을 엔드포인트를 가진 node1:nodePort 보낸다.
      • node1은 패킷을 올바른 소스 IP 주소로 엔드포인트로 라우팅 한다.

LoadBalancer

  • 서비스로 보낸 패킷은 소스 NAT를 기본으로 적용된다.

  • Ready 상태인 모든 노드들은 클러스터 외부에서 요청할수 있는 로드 밸런싱 트래픽에 대상이다.

  • Loadbalance의 IP를 External IP에 지정하고, 해당 IP로 요청을 하면,

  • Nodeport에서 수행한것 절차처럼 패킷 상에서 소스 IP 주소를 자신의 IP주소로 교체하고, 대상 IP를 패킷상의 pod IP 주소로 변경하여 요청된다

    • 엔드포인트가 없는 노드에 패킷이 도착하면 시스템은 엔드포인트를 포함한 노드에 프록시를 수행하여, 노드의 IP주소로 소스 IP 주소를 변경한다.
  • GCE(구글 클라우드 엔진) 참고 : service.spec.externalTrafficPolicy 필드를 Local로 설정하면 로드발란서 대상에서 자신 노드를 제외할수 있음

Cross-Platform 지원

  • 클라우드 공급자만 Type=LoadBalancer 를 사용하는 서비스를 통해 소스 IP 보존을 지원함
  • 다른방법으로 로드발란서 요청 가능
    방법 1
    - 클라이언트 연결을 종료하고, 클라우드 로드밸런서의 IP 주소로 새 프록시 연결을 열어 를 이용한다.
    - 이 로드 밸런서 IP로 들어온 요청을 클라이언트 IP로 포워딩한다.
    - HTTP 포워드, TTP Forwarded 또는 X-FORWARDED-FOR 프록시 프로토콜같은 것들로 백엔드와 로드밸런서가 합의된 프로토콜을 사용한다.
    방법 2
    - 클라이언트가 보낸 요청이 로드밸런서의 VIP에 전달되면,
    - 중간 프록시가 아닌 클라이언트 소스 IP 주소가 있는 노드 패킷 전달자를 이용
    - service.spec.healthCheckNodePort 필드에 저장된 포트 사용
profile
Fullstack developer

0개의 댓글