[따배쿠] 11. Service

( 참고 : 따배쿠 https://www.youtube.com/watch?v=6n5obRKsCRQ&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c )


Contents

  1. Service 개념
  2. Service의 4가지 타입
  3. Headless Service
  4. kube-proxy

Service = 쿠버네티스 네트워크

figure2

1. Service 개념

  • 동일한 서비스를 제공하는 “Pod 그룹의 단일 진입점”을 제공


step 1) deployment 생성요청

step 2) controller & scheduler의 도움으로, 3개의 웹서버 실행

  • ( 같은 일을 하는 pod가 3개 있음. but IP는 다 다름 )


Q. 3개의 pod 중 누구에게 일을 시킬까?

A. 상황 봐서~ 균등하게 잘 분산시켜주자!

\(\rightarrow\) 그래서 Service가 필요함

Service는 같은 역할을 하는 pod를 하나의 IP로 묶어서 관리해줌 ( with virtual IP = Load Balancer IP = 단일 진입점 . 이 정보 또한 etcd에 저장된다 )

figure2


같은 label(key:value)를 가진 pod가 추가로 생성되면, 해당 pod의 ip또한 자동으로 virtual IP에 추가/할당된다.


Service YAML 파일

figure2


kubectl get svc


2. Service의 4가지 타입

(1) Cluster IP

Pod그룹의 “단일 진입점(Virtual IP)” 생성

  • selector의 label이 동일한 pod를 묶는다
  • cluster 내부에서만 사용 가능
  • type 생략 시, default 값으로 10.96.0.0/12 범위에서 할당


figure2


YAML

figure2

  • clusterIP : 단일 진입점 IP


( nginx 웹서버를 3개 실행하는 Deployment가 작동 중인 상황 )

1) kubectl create -f clusterip-nginx.yaml

  • YAML파일을 사용하여, clusterIP 서비스를 하나 생성


2) kubectl get svc

  • 모든 service 확인
  • 방금 생성한 service의 cluster IP가 10.100.100.200임을 확인 가능


3) curl 10.100.100.100

  • clusterIP로 접속하면, 3개 중 아무런 거 하나에 배정받아서 접속된다

    ( 유저는 당연히 자각 X )


4) kubectl describe svc clusterip-service

  • clusterIP와, 이에 포함되는 pod의 IP들도 확인 가능


5) kubectl scale deployment webui --replicas=5

  • pod의 개수를 3개에서 5개로 늘리면, 새로 생성되는 2개의 pod는 자동으로 clusterIP에 속하게 된다


5) kubectl delete svc clusterip-service

  • 삭제하기


(2) Node Port

ClusterIP가 생성된 후, 모든 worker node에 “외부에서 접속 가능한 포트”가 예약

  • 안에 cluster IP가 들어있음

    ( NodePort 생성 시, 자동으로 Cluster IP는 생성됨 )

  • 즉, Node Port = Cluster IP +외부 접속가능한 포트

  • (외부에서 들어올 수 있는) default NodePort의 범위 : 30000-32767

figure2


YAML

figure2


1) kubectl create -f nodeport-nginx.yaml

2) kubectl get svc

3) curl 10.100.100.200

( 1) ~ 3)은 ClusterIP와 동일 )


4) curl node1.example.com:30200

  • 3개의 pod 중 하나로 배정 받게 될 것


5) kubectl describe svc nodeport-service

6) kubectl delete svc nodeport-service

( 5) ~ 6)은 ClusterIP와 동일 )


(3) LoadBalancer

Cloud 인프라 ( ex. AWS, GCP, Azure ) 에서 적용

  • public cloud에서 운영 가능
  • LoadBalancer를 자동으로 구성 요청
  • NodePort를 예약 후, 해당 nodeport로 외부 접근 허용

figure2


(4) ExternalName

Cluster “안”에서, 외부에 접속 시 사용할 도메인을 등록해서 사용

( 클러스터 도메인이 실제 외부 도메인으로 치환되어 동작 )

  • naming 서비스 지원 ( like DNS )
  • ex) External Name을 “goooogle.com”으로 등록

figure2


YAML

figure2


1) kubectl create -f externalname.yaml

2) kubectl get svc

3) kubectl run testpod -it --image=centos:7 : pod 내부로 접속

  • curl externalname-svc.default.svc.cluster.local ( = google로 접속 )
  • exit

4) kubectl delete svc externalname-svc


3. headless Service

  • cluster IP가 없는 서비스로, 단일 진입점이 필요 X 때!

  • Service와 연결된 pod의 endpointdns 레코드가 생성됨

    ( DNS resolving Service )

  • pod의 DNS 주소 : pod-ip-addr.namespace.pod.cluster.local

figure2


YAML

  • clusterIP를 None으로 설정하면, 자동으로 headless!

figure2


1) kubectl create -f headless-nginx.yaml

  • headless 서비스 생성


2) kubectl get svc

  • Cluster IP가 none임을 확인 가능


3) kubectl describe svc headless-service

  • 묶여 있는 3개의 pod를 확인 가능 ( 3개의 endpoint )


4) pod endpoint DNS 서비스 조회

  • kubectl run testpod -it --image=centos:7 --command /bin/bash
    • cat /etc/resolv.conf : core DNS 서버 확인 가능 ( 10.96.0.10 )
    • curl ip-addr.default.pod.cluster.local
      • exx) ` curl 10-36-0-1.default.pod.cluster.local`
    • exit


5. kube-proxy

  • k8s Service의 backend 구현
  • endpoint 연결을 위한 iptables (규칙) 구성
  • nodePort로의 접근과 pod 연결을 구현 (iptables 구성)


kubectl get pods --all-namespaces

  • 총 4개의 kube-proxy가 kube-system 네임스페이스에서 작동 중

    ( 각각 master, node 1,2,3에서 동작 중 )


iptables -t nat -S | grep 80

  • 어디로 접속하면 xxxxxxx:80으로 연결되는지 알 수 있음

figure2


3가지 방식으로 운영됨

figure2