Service

  • 동일한 서비스를 제공하는 여러 개의 Pod에 접근할 수 있는 하나의 IP를 제공
    (Service 자신이 갖고 있는 Selector 값과 Cluster에서 운영중인 Pod의 Label 값이 동일한 Pod으로 연결된다. Service는 자신의 EndPoint에 Pod를 추가시켜 관리한다.)

추가) kubectl run으로 pod 생성 후, Service도 생성했는데 오류가 나는 경우

→ pod의 labels 값과 service의 selector 값을 비교해볼 필요가 있다.

 

※ Pod의 Labels 값 확인

-  kubectl get pod -o wide --show-labels

※  Service 내부 설정 정보 확인

-  kubectl edit service 서비스명

 

  • Service는 Pod에 연결시켜주는 Network
  • 어느 Service 유형이든 결국 Cluster IP를 통해 Pod에 접근
    (Pod기본적으로 Node에서만 실행되지 않고 상황에 따라 Cluster내에 속한 여러 Node옮겨다닌다. 그러므로 PodIP접속하는 데는 한계가 있고 동일한 서비스의 대표 IPServiceIP접근하는 것이 편리하다.)

Service 종류 

 

1. ClusterIP

:  Default Service로서 Pod들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상의 클러스터 전용 IP

(IP는 Container에는 없고 Pod 에만 있다. Pod IP는 변경이 가능하므로 변경되지 않는 Virtual IP를 갖는 Service를 사용해야 한다)

:  Cluster 내에서 Pod에 접속할 때는 Cluster IP를 이용한다.(Pod는 언제든지 죽고 다시 생성되어 IP가 변경되기 때문)

:  Cluster IP로는 Cluster 내부에서만 접속할 수 있다.

:  ClusterIP → Pod

 

2. NodePort

: 외부에서 노드 IP의 특정 포트(<NodeIP>:<NodePort>)로 들어오는 요청을 감지하여, 해당 포트와 연결된 파드로 트래픽을 전달하는 유형의 서비스다.

: 이때 클러스터 내부로 들어온 트래픽을 특정 파드로 연결하기 위한 ClusterIP 역시 자동으로 생성된다.

: Cluster 내의 아무 Node의 IP에 대한 Port 번호로 접속하도록 한다.

(30,000 ~ 32,767 포트 사용)

:  NodePort ClusterIP → Pod

 

3. LoadBalancer

:  Layer2 ~ Layer4를 지원하는 부하조정 장비 (domain은 Layer7의 Ingress Controller가 처리)

 클라우드 공급자(Public Cloud)의 로드 밸런서, 외부 장비, Metallb를 사용하여 서비스를 외부에 노출시킨다.

:  외부 로드 밸런서가 라우팅되는 NodePort ClusterIP 서비스가 자동으로 생성된다.

:  OnPoremises(사내)에서는 외부 LB 장비를 이용하거나 그것보다는 k8s의 Metallb라는 Load Balancer를 이용한다.

:  로드 밸런서의 (virtual) IP를 통해 접속한다.

:  LoadBalancer → NodePort  ClusterIP → Pod

그림 출처 Google Cloud

 

 

 


실습 1) ClusterIP

CLI로 ClusterIP 생성하기

-  k create deployment mygosmall --image=jesuswithme/gosmall
-  k create service clusterip mygosmall --tcp 80:80
-  k get pod --show-labels 

-  k scale deployment mygosmall --replicas=3 
-  k get svc →  clusterIP 확인
-  curl clusterIP  → 3개의 값이 랜덤으로 나옴을 알 수 있다.
ⓑ YAML로 ClusterIP 생성하기

-  wget http://down.cloudshell.kr/k8s/lab/service/nginx-deploy-clusterip-add-externalip.yaml
-  wget http://down.cloudshell.kr/k8s/lab/service/nginx-deploy-clusterip-add.yaml
-  kubectl apply-f nginx-deploy-clusterip-add-externalip.yaml  ## External IP 수동으로 지정
-  kubectl apply-f nginx-deploy-clusterip-add.yaml ## ClusterIP의 IP를 수동으로 지정
-  kubectl get pod--show-labels
-  kubectl get svc-o wide
-  curl로 clusterip에 접속해보기

Type이 ClusterIP이기 때문에 무조건 cluster 내부에서만 접속 가능하다.
외부에서는 접속 불가능

 

실습 2) NodePort

YAML로 NodePort 생성하기 

-  wget http://down.cloudshell.kr/k8s/lab/service/nginx-deploy-nodeport.yaml
-  kubectl apply -f nginx-deploy-nodeport.yaml (## type을NodePort로만 설정)

yaml 파일
service 확인
외부에서 접속

 

실습 3) Load Balancer - Metallb

※ 기초 작업
MetalLB를 위한 Namespace 생성
-  wget http://down.cloudshell.kr/k8s/namespace.yaml
-  kubectl apply -f namespace.yaml
-  kubectl get namespace : 확인

MetalLB Components 생성
-  wget http://down.cloudshell.kr/k8s/metallb.yaml
-  kubectl apply -f metallb.yaml

Metallb에 사용할 Secret 생성
- kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

** 외부에서 접속할 때 사용되는 IP생성을 위해 ConfigMap 생성 **
-  wget http://down.cloudshell.kr/k8s/ConfigMap-Metallb.yaml
vi ConfigMap-Metallb.yaml (## 원하는 대역으로 수정 (기본IP 구성은 10.0.2.200-10.0.2.250인데 사내에 맞게 수정))
-  kubectl apply -f ConfigMap-Metallb.yaml 
▷ 이제 Load Balancer에 이 IP를 할당한다

ⓐ CLI로 LoadBalancer 생성하기
yaml
Pod 노출하기
외부 접속

 

ⓑ YAML로 Load Balancer 생성하기

-  wget http://down.cloudshell.kr/k8s/metallb-nginx.yaml
yaml

kubectl create -f metallb-nginx.yaml

ClusterIP -> NodePort -> LoadBalancer 가 순서대로 생김
외부에서 접속

 

 

 

'Study > Cloud' 카테고리의 다른 글

Kubernetes - Controller-2  (0) 2022.07.23
Kubernetes - Controller  (0) 2022.07.22
Kubernetes - Pod  (0) 2022.07.21
Kubernetes - Namespace  (0) 2022.07.21
Kubernetes - yaml  (0) 2022.07.21

+ Recent posts