##Service란?

Network service로 pod를 노출 시키는것.

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


selector 없는 service

  • 제품에는 외부 database cluster를 사용하고 테스트 환경에서는 자체 database를 쓰는 경우
  • 다른 namespace나 다른 cluster에 service를 할당하고 싶은 경우
  • workload를 kubernetes에 migrating할 때 , 백앤드의 일부만 실행하는 경우


Multiport Service

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


ServiceTypes

  • ClusterIP : default 값. 서비스를 클러스터 - 내부 IP에 노출. 클러스터 내에서만 서비스에 도달 가능
  • NodePort : 각 노드의 IP에 서비스를 노출시킨다. :를 요청하여, 클러스터 외부에서 NodePort 서비스에 접속
  • LoadBalancer : 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출
  • ExternalName : 값과 함께 CNAME 레코드를 리턴하여, 서비스를 externalName 필드의 콘텐츠(예: foo.bar.example.com)에 매핑한다. - kube-dns 또는 coredns version 1.7 이상


externalIPs

클러스터 노드로 라우팅되는 외부 IP가 잇는 경우, externalIPs에 노출될 수 있다. 서비스 포트에서 외부 IP를 사용하여 클러스터로 들어오는 트래픽은 서비스 엔드포인트 중 하나로 라우팅


kube-proxy 프록시 모드

  • userspace : 백엔드 서비스가 생성되면, 마스터는 가상IP 주소를 할당. 서비스는 클러스터의 모든 kube-proxy 인스턴스에서 관찰되고 새 서비스를 발견하면 새로운 임의의 포트를 열고, 가상 IP 주소에서 새로운 포트로 iptables 리다이렉션을 설정한 후, 연결을 수락 서비스 프록시는 백엔드를 선택하고, 클라이언트에서 백엔드로의 트래픽을 프록시한다.
  • iptables : 유저스페이스 프록시와 달리, 패킷은 유저스페이스로 복사되지 않으며, 노드는 변경되지 않은 클라이언트 IP 주소에서 오는 트래픽을 본다.
  • IPVS : iptables 작업은 대규모 클러스터에서 크게 느려진다. IPVS는 로드 밸런싱을 위해 설계되었고 커널-내부 해시 테이블을 기반으로 한다.


출처

https://kubernetes.io/docs/concepts/services-networking/service/