서비스 개념

  • 외부에서 파드에 접근하는 방법이 필요함
  • 파드는 노드를 옮기면서 생성 되기도 하고 IP가 변경 되기 때문에 이러한 동적으로 변하는 파드에 고정적으로 접근하는 방법이 서비스 임
  • 참고로 서비스는 L4 영역에서 통신할 때 사용하고 나중에 학습할 인그레스는 L7 영역에서 통신할 때 사용함

서비스 타입

타입 설명
ClusterIP 기본 서비스 타입
  외부에서 접속 불가능
NordPort 서비스 하나에 모든 노드의 지정된 포트를 할당
  지정된 포트만 사용하면 파드에 접근 가능
  외부에서 클러스터 안으로 접근 가능
LoadBalancer 퍼블릭 클라우드, OpenStack 등에서 지원하는 로드밸런서 장비 사용
  로드밸런서와 파드를 연결한 후 해당 로드밸런서 IP를 이용하여 파드 접근
ExternalName 서비스를 .spec.externalName 필드에 설정한 값과 연결
  클러스터 안에서 외부에 접근할 때 주로 사용

서비스 템플릿

apiVersion: v1
kind: Service
metadata:
  name: whms-service
spec:
  type: ClusterIP #--> 서비스 타입을 설정, 기본타입은 ClusterIP
  clusterIP: 10.96.0.100 #--> 클러스터 IP를 직접 설정 
  selector:
    app: whms-deployment #-->서비스에 연결할 파드 또는 디플로이먼트의 labels 필드 값 설정 
  ports:
  - protocol: TCP
    port: 80 #--> 서비스의 포트 
    targetPort: 8080 #--> 서비스와 연결된 파드가 사용하는 포트 

ClusterIP 서비스 생성

템플릿을 통해 서비스 생성 및 테스트 컨테이너에서 서비스 IP 호출 테스트

테스트 파드 생성 스크립트

kubectl run -it --image nicolaka/netshoot testnet bash

NodePort 서비스 생성

  • ClusterIP 유형은 파드 내부에서만 호출 가능하지만 NodePort는 30000번 대 포트를 통해 파드 외부에서도 호출 가능한 서비스를 제공함
  • NodePort 서비스를 외부에 호출할 경우, Worker 노드의 IP가 호출 IP가 되고 포트는 NortPort 서비스 yaml에 명시한 30000번 대의 nodePort 또는 yaml에 명시하지 않았을 경우 자동으로 생성되는 30000번대 포트를 사용

NodePort 유형 탬플릿

apiVersion: v1
kind: Service
metadata:
  name: whms-nodeport
spec:
  type: NodePort
  selector:
    app: whms-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30080 #-->외부에서 호출시 사용할 포트 번호

LoadBalancer 서비스 생성

  • NodePort 유형의 경우 외부에서 접속 가능하지만 클러스터링된 worker 노드의 IP를 임의적으로 사용해야 한다는 점과 30000번대 포트를 사용해야 한다는 점 때문에 한계를 가짐
  • LoadBalancer 서비스 유형은 물리적 또는 퍼블릭 클라우드 서비스처럼 SW적인 로드밸런서를 활용가능한 환경에서 NodePort 타입에 External IP 를 설정하여 외부에서 접근 가능하도록 서비스를 제공해주는 유형임

LoadBalancer 서비스 탬플릿

apiVersion: v1
kind: Service
metadata:
  name: whms-loadbalancer
spec:
  type: LoadBalancer #--> LoadBalancer 서비스 유형 지정 
  selector:
    app: whms-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30080

자체 생성한 kubeadm 환경에서 LaadBalancer 유형 설정

  • EKS, GKS 등 퍼블릭 클리우드에서 제공하는 쿠버네티스 클러스터링 환경을 이용하면 LoadBalancer 유형 서비스를 생성시, 자동으로 로드밸런서 생성 및 external IP를 매핑함
  • kubeadm을 이용하여 자체적으로 쿠버네티스 클러스터링 환경을 만든 경우에는 서비스를 LoadBalancer 유형으로 지정하여도 external IP가 생성되지 않고 상태가 지속됨
  • kubectl 조회시 pending 상태가 지속되고 있음을 확인 가능
    summit@master:~$ kubectl get svc
    NAME                TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
    whms-loadbalancer   LoadBalancer   10.111.205.225   <pendgin>     80:30081/TCP   4h58m
    
  • 아래 제시된 내용은 kubeadm으로 구성된 환경에서 수동으로 loadbalancer 생성 및 매핑하는 방법을 가이드 함

GCP 환경에서 로드밸런서 생성하기

  • GCP 부하분산(LoadBalander) > 부하 분산기 만들기 선택

k8s-svc-lb

  • TCP 부하 분산 선택

k8s-svc-lb

  • 인터넷 연결 여부 및 리전 옵션 설정

k8s-svc-lb

  • 백 엔드 속성 설정

k8s-svc-lb

  • 참고로 백 엔드 속성 중 상태 확인 속성은 아래 항목에서 생성 가능 함

k8s-svc-lb

  • 상태 확인 설정 내용은 아래 GKS 탬플릿을 참고하여 작성하거나 HTTP로 호출 가능한 포트 정보를 설정하여 로드 밸런서에서 주기적으로 호출 및 alive로 판단 가능하도록 함

k8s-svc-lb

  • 프런트 엔드 속성 설정

k8s-svc-lb

  • 로드밸런서 생성 확인

k8s-svc-lb

  • 생성된 로드밸런서의 IP를 아래 명령어를 통해 LoadBalancer 유형의 서비스를 업데이트 함.
summit@master:~$ kubectl patch svc whms-loadbalancer \
 -p '{"spec": {"type": "LoadBalancer", "externalIPs":["35.222.XXX.XX"]}}'
  • kubectl 명령어로 서비스에 external-IP가 매핑된 것을 확인 함
summit@master:~$ kubectl get svc
NAME                TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
whms-loadbalancer   LoadBalancer   10.111.205.225   35.222.XXX.XXX   80:30081/TCP   4h58m
  • 브라우저를 통해 서비스에 매핑된 external ip 호출시 정상적으로 호출되는 것을 확인 할 수 있음

k8s-svc-lb

댓글남기기