written by yechoi

[쿠버네티스] 네트워킹 - 레이블 셀렉터 / 서비스 / ClusterIP, NodePort, LoadBalancer 본문

Born 2 Code/Docker, Kubernetes

[쿠버네티스] 네트워킹 - 레이블 셀렉터 / 서비스 / ClusterIP, NodePort, LoadBalancer

yechoi 2021. 6. 29. 10:54
반응형

kubernetes networking

pods' name and IP

  • 각각의 파드의 서비스에는 이름과 IP가 부여됨
  • 이 이름과 IP는 바뀌지 않음. 파드가 죽어서 새로 만들어진다고 하더라도.
  • 이름과 IP는 클러스터 빌트인 DNS에 기록됨
  • 이 DNS를 이용해 이름으로 IP를 찾아갈 수 있음
  • 파드끼리는 통신할 수 있음

 

label selector

  • 외부의 트래픽을 어떻게 각각의 파드에 나눠줄까?
  • svc(service object)가 label selector를 활용한다.
  • label selector에 일치하는 파드가 살아있는지는 어떻게 알까?
  • Ep(end point object)를 만들어서 헬스체크. 사라지거나 새로 생긴 파드를 svc는 ep에 추가한다.

레이블 셀렉터를 통해 클라이언트와 사용자는 오브젝트를 식별할 수 있다.

🔗 label selector(ko/docs)

엔드포인트 API는 쿠버네티스에서 네트워크 엔드포인트를 추적하는 간단하고 직접적인 방법을 제공한다. 불행하게도 쿠버네티스 클러스터와 서비스가 더 많은 수의 백엔드 파드로 더 많은 트래픽을 처리하고 전송하는 방향으로 성장함에 따라, 이 API의 한계가 더욱 눈에 띄게 되었다. 특히나, 많은 수의 네트워크 엔드포인트로 확장하는 것에 어려움이 있었다.

이후로 서비스에 대한 모든 네트워크 엔드포인트가 단일 엔드포인트 리소스에 저장되기 때문에 엔드포인트 리소스가 상당히 커질 수 있다. 이것은 쿠버네티스 구성요소 (특히 마스터 컨트롤 플레인)의 성능에 영향을 미쳤고 엔드포인트가 변경될 때 상당한 양의 네트워크 트래픽과 처리를 초래했다. 엔드포인트슬라이스는 이러한 문제를 완화하고 토폴로지 라우팅과 같은 추가 기능을 위한 확장 가능한 플랫폼을 제공한다.

🔗 엔드포인트슬라이스(ko/docs)

 

service

서비스는 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법. 쿠버네티스는 파드에게 고유한 IP 주소와 파드 집합에 대한 단일 DNS 명을 부여하고, 그것들 간에 로드-밸런스를 수행할 수 있다.

서비스 정의를 API 서버에 POST하여 새 인스턴스를 생성할 수 있다. 서비스 오브젝트의 이름은 유효한 DNS 서브도메인 이름이어야 한다.

예를 들어, 각각 TCP 포트 9376에서 수신하고 app=MyApp 레이블을 가지고 있는 파드 세트가 있다고 가정해 보자.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

이 명세는 "my-service"라는 새로운 서비스 오브젝트를 생성하고, app=MyApp 레이블을 가진 파드의 TCP 9376 포트를 대상으로 한다.

쿠버네티스는 이 서비스에 서비스 프록시가 사용하는 IP 주소 ("cluster IP"라고도 함) 를 할당한다. (이하 가상 IP와 서비스 프록시 참고)

서비스 셀렉터의 컨트롤러는 셀렉터와 일치하는 파드를 지속적으로 검색하고, "my-service"라는 엔드포인트 오브젝트에 대한 모든 업데이트를 POST한다.

🔗 서비스(ko/docs)

 

service type

  • ClusterIP: 클러스터 내부에서만 접근 가능, 자신의 IP를 소유. ServiceTypes의 기본값이다.
  • NodePort: cluster-wide 포트로 클러스터 바깥에서의 접근 허용. 다음과 같은 방식으로 설정. TCP/UDP 가능하며, 디폴트는 TCP. <NodeIP>:<NodePort>를 요청하여, 클러스터 외부에서 NodePort 서비스에 접속할 수 있다.
  • //service.yaml ... ports: - port: 80 // 파드가 듣고 있는 포트 nodePort: 30080 // 서비스가 듣고 있는 cluster-wide 포트
  • LoadBalacer: 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킨다. 외부 로드 밸런서가 라우팅되는 NodePortClusterIP 서비스가 자동으로 생성된다.

🔗 서비스 퍼블리싱(ko/docs)

 

kube-proxy

쿠버네티스 네트워크 프록시는 각 노드에서 실행된다. 이는 각 노드의 쿠버네티스 API에 정의된 서비스를 반영하며 단순한 TCP, UDP 및 SCTP 스트림 포워딩 또는 라운드 로빈 TCP, UDP 및 SCTP 포워딩을 백엔드 셋에서 수행 할 수 있다.

IPVS/IPTABLES 규칙을 작성해 들어온 서비스를 각각의 파드로 분배한다.

 

참고: Udemy - Google Certified Associate Cloud Engineer Certification

반응형