kok202
쿠버네티스 입문 - 03 - 서비스

2020. 4. 4. 03:50[정리] 기능별 개념 정리/Kubernetes

서비스

서비스는 여기저기 옮겨 다니는 여러개의 파드에 접근할 수 있는 하나의 IP를 제공한다.

본질적으로는 로드밸런서 역할이다.

인그레스와 비교되기도하는데 서비스는 L4 영역이라면 인그레스는 L7영역에서 통신할 때 사용된다.

서비스는 `서비스이름.default.svc.cluster.local` 과같은 FQDN  을 가진다.

 

 

 

서비스 타입

ClusterIP : 기본 서비스 타입이며 클러스터 내부에서만 사용할 수 있다.

NodePort : 모든 노드의 지정된 포트는 이 서비스로 연결되게 한다. 클러스터 외부와 파드를 연결하는 가장 간단한 방법이다.

LoadBalancer : 로드밸런서 장비를 사용하는 경우 로드밸런서와 파드를 연결하여 클러스터 외부에서 파드에 접근할 수 있게한다.

ExternalName : 클러스터안에서 외부에 접근할 때 사용한다.

 

+ 헤드리스 서비스 : ClusterIP 타입의 서비스이지만 .spec.clusterIP: None 을 해준 경우

클러스터 IP 가 없는 서비스를 만들 수 있다. 로드 밸런싱이 필요없거나 단일 서비스 IP가 필요 없을 때 사용한다.

 

 

 

ClusterIP 서비스 샘플

apiVersion: v1
kind: Service
metadata:
  name: clusterip-service
spec:
  type: ClusterIP
  selector:
    app: nginx-for-svc
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

 

 

NodePort 서비스 샘플

apiVersion: v1
kind: Service
metadata:
  name: nodeport-service
spec:
  type: NodePort
  selector:
    app: nginx-for-svc
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080

 

 

 

LoadBalancer 서비스 샘플

apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: nginx-for-svc
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

 

 

ExternalName 서비스 샘플

apiVersion: v1
kind: Service
metadata:
  name: externalname-service
spec:
  type: ExternalName
  externalName: google.com

 

 

 

Headless 서비스 샘플

apiVersion: v1
kind: Service
metadata:
  name: headless-service
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app: nginx-for-svc
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

 

 

kube-proxy

쿠버네티스에서 서비스를 만들때 kube-proxy 가 동작한다.

kube-proxy 는 클러스터 IP나 노드 포트로 접근하기 위한 정보를 iptables 에 새로운 서비스를 등록하는 등의 동작을 한다.

kube-proxy 의 네트워크 관리 방법은 다음과 같은 모드가 있다.

  • userspace 모드 : (서비스의 clusterIP 요청 -> iptables -> kube-proxy -> pod) 프로세스를 탄다.
  • iptables 모드 : (서비스의 clusterIP 요청 -> iptables -> pod) 프로세스를 탄다.
    - 이 경우 kube-proxy는 iptables를 관리하는 역할만 한다.
  • IPVS 모드 : (서비스의 clusterIP 요청 -> 가상 서버의 커널 -> pod) 프로세스를 탄다.
    - 데이터 구조를 해시 테이블로 저장해서 iptables 모드보다 빠르고 좋은 성능을 낸다.
    - 로드밸런싱 알고리즘도 더 다양하다.