서비스 개념
- 외부에서 파드에 접근하는 방법이 필요함
- 파드는 노드를 옮기면서 생성 되기도 하고 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) > 부하 분산기 만들기 선택
- TCP 부하 분산 선택
- 인터넷 연결 여부 및 리전 옵션 설정
- 백 엔드 속성 설정
- 참고로 백 엔드 속성 중 상태 확인 속성은 아래 항목에서 생성 가능 함
- 상태 확인 설정 내용은 아래 GKS 탬플릿을 참고하여 작성하거나 HTTP로 호출 가능한 포트 정보를 설정하여 로드 밸런서에서 주기적으로 호출 및 alive로 판단 가능하도록 함
- 프런트 엔드 속성 설정
- 로드밸런서 생성 확인
- 생성된 로드밸런서의 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 호출시 정상적으로 호출되는 것을 확인 할 수 있음
댓글남기기