mingming

Kubernetes Serive ( ClusterIP ) 본문

kubernetes

Kubernetes Serive ( ClusterIP )

mingming_96 2023. 9. 26. 15:42

Kubernetes Service

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

  Pod의 Label을 통해서 여러개의 Pod를 하나의 그룹으로 묶어 관리할 수 있습니다. 

  단일 진입점을 제공해 로드밸런싱의 기능을 할 수 있습니다. 

 

Deploymet와 Service 연결

다음과 같이 Lables를 통해 deployment와 service를 연결시켜줄 수 있습니다. service에서 지정한 ip를 통해 접근하면 해당 deployment의 세개의 파드에 균등하게 로드밸런싱되어 접근할 수 있습니다.

Deployment-definition

apiVersion: v1
kind: Deployment
metadata:
  name: webui
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      name: nginx-pod
    labels:
      app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx

 

Service-definition

apiVersion: v1
kind: Service
metadata:
  name: webui-svc
spec:
  clusterIP: 10.100.0.1
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

Service Type

1. ClusterIP( default )

  Pod 그룹의 단일 진입점 생성 ,클러스터 내부에서만 접근할 수 잇는 서비스를 생성합니다.

  type 생략 시 default 값으로 10.96.0.0/12 범위에서 할당됩니다.

 

2. NodePort

  모든 Worker Node에 외부에서 접속가능 한 포트가 예약되어 서비스를 외부로 노출 시킬 수 있습니다.

  ClusterIP가 만들어진 후에 NodePort 할당 

  Default NodePort 범위 : 30000 ~ 32767 

 

3.  LoadBalancer

  클라우드 인프라 혹은 오픈스택 클라우드에 적용

  LoadBalancer를 자동으로 프로비전 하는 기능을 지원합니다.

 

4. ExternalName

  클러스터 안에서 외부에 접속 시 사용할 도메인을 등록해서 사용

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

 

Service Type 실습

clusterip-nginx.yaml

apiVersion: v1
kind: Service
metadata:
  name: clusterip-service
spec:
  type: ClusterIP
  clusterIP: 10.100.100.100
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

deploy-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  nmae: webui
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui
  template:
    meatadata:
      name: nginx-pod
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14
kubectl apply -f clusterip-service.yaml
kubectl apply -f delployment-nginx.yaml

 

배포한 서비스와 파드가 실행중인지 확인해 줍니다.

kubectl get pods 
kubectl get svc
webui-bd76d5967-6kgzp                               1/1     Running   0             100s   10.44.0.5        worker    <none>           <none>
webui-bd76d5967-btqfq                               1/1     Running   0             100s   10.44.0.7        worker    <none>           <none>
webui-bd76d5967-zh9xz                               1/1     Running   0             100s   10.44.0.6        worker    <none>           <none>
root@master:~/sample_test# kubectl get svc
NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
clusterip-service                     ClusterIP      10.100.100.100   <none>           80/TCP           6m34s

 

3개의 엔드포인트 즉 각각 Pod의 ip 주소를 엔드포인트로 갖고있는 것을 확인할 수 있습니다.

kubectl describe svc clusterip-service
root@master:~/sample_test# kubectl describe svc clusterip-service
Name:              clusterip-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=webui
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.100.100.100
IPs:               10.100.100.100
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.44.0.5:80,10.44.0.6:80,10.44.0.7:80
Session Affinity:  None
Events:            <none>

 

현재는 각 파드에서 호스팅하는 웹페이지가 모두 같기 때문에 식별하기 어렵습니다. 따라서 각 파드 내부로 진입해 html을 수정 후 로드밸런싱이 되는지 확인해보도록 하겠습니다.

kubectl exec -it webui-bd76d5967-6kgzp -- bash -c 'echo "webui #1" > /usr/share/nginx/html/index.html'

kubectl exec -it webui-bd76d5967-btqfq -- bash -c 'echo "webui #2" > /usr/share/nginx/html/index.html'

kubectl exec -it webui-bd76d5967-zh9xz -- bash -c 'echo "webui #3" > /usr/share/nginx/html/index.html'

 

아래의 명령어로 100번 해당 url로 요청했을 때 각 파드에서 몇번 응답이 오는지 확인할 수 있습니다.

 

-s 옵션은 curl 명령의 출력 결과를 보여주지 않도록 하는 것이며, -q옵션은 진행 상황을 보여주지 않도록 하는 것입니다.

sort 명령어는 결과를 정렬하고, "uniq -c" 명령어는 중복된 결과를 제거하고 요청 횟수를 출력합니다. sort -nr 명령어는 요청 횟수를 내림차순으로 정렬합니다.

for i in {1..100}; do curl -s -q 10.100.100.100; done | sort | uniq -c | sort -nr
root@master:~/sample_test# for i in {1..100}; do curl -s -q 10.100.100.100; done | sort | uniq -c | sort -nr
     35 webui #3
     34 webui #1
     31 webui #2

완벽하게 똑같은 횟수로 부하분산 되지는 않지만 어느정도 비슷하게 부하분산 되는 것을 확인할 수 있습니다. 랜덤으로 분산시키기 때문에 그런 것 같습니다.

 

deployment 의 replica수가 증가하게 되면, Service의 Endpoint 역시 증가하게 됩니다.

kubectl scale deployment webui --replicas=5
kubectl describe svc clusterip-service
root@master:~/sample_test# kubectl describe svc clusterip-service
Name:              clusterip-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=webui
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.100.100.100
IPs:               10.100.100.100
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.44.0.5:80,10.44.0.6:80,10.44.0.7:80 + 2 more...
Session Affinity:  None
Events:            <none>

 

다음 글에선 NodePort 타입과 LoadBalancer 타입에 대해 알아보도록 하겠습니다.