[쿠버네티스 네트워크] 서비스와 ClusterIP 소개

hi·2023년 9월 10일
0

쿠버네티스

목록 보기
32/60

포드의 문제점

  • 포드는 일시적으로 생성한 컨테이너의 집합
  • 따라서 포드가 지속적으로 생겨났을 때 서비스를 하기에는 적합하지 않음
  • IP 주소의 지속적인 변동, 로드 밸런싱을 관리해줄 또 다른 개체가 필요
  • 이 문제를 해결하기 위해 서비스라는 리소스가 존재함



서비스의 요구사항

  • 외부 클라이언트가 몇 개이든지 프론트엔드 포드로 연결
  • 프론트엔드는 다시 백엔드 데이터페이스로 연결
  • 포드의 IP가 변경될 때마다 재설정 하지 않도록 해야 함



서비스의 생성방법

  • kubectl의 expose가 가장 쉬운 방법
  • YAML을 통해 버전 관리 가능

my-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp # 선택할 label
  ports:
    - protocol: TCP
      port: 80         # Cluster-Ip 포트
      targetPort: 9376 # 포드의 포트

kubectl create -f my-service.yaml

kubectl get svc



포드 간의 통신을 위한 ClusterIp

  • 다수의 포드를 하나의 서비스로 묶어서 관리
  • 서비스의 Default는 ClusterIp
  • kubectl expose..



서비스의 세션 고정하기

  • 서비스가 다수의 포드로 구성하면 웹서비스의 세션이 유지되지 않음
  • 따라서 처음 들어왔던 클라이언트 IP를 그대로 유지해주는 방법이 필요
  • SessionAffinity: ClientIP라는 옵션을 주면 해결 가능
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  sessionAffinity: ClientIP
  selector:
    app.kubernetes.io/name: MyApp 
  ports:
    - protocol: TCP
      port: 80         
      targetPort: 9376 


다중 포트 서비스 방법

  • 포트에 그대로 나열해서 사용
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  sessionAffinity: ClientIP
  selector:
    app: myApp 
  ports:
    - name: http
      port: 80
      targetPort: 8080
    - name: https
      port: 443
      targetPort: 8443
imkunyoung@cloudshell:~ (kubernetes-397511)$ kubectl get svc
NAME                  TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)          AGE
kubernetes            ClusterIP      10.44.0.1      <none>           443/TCP          3d7h
my-service            ClusterIP      10.44.6.22     <none>           80/TCP,443/TCP   5s
imkunyoung@cloudshell:~ (kubernetes-397511)$ kubectl describe svc my-service
Name:              my-service
Namespace:         default
Labels:            <none>
Annotations:       cloud.google.com/neg: {"ingress":true}
Selector:          app=myApp
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.44.14.7
IPs:               10.44.14.7
Port:              http  80/TCP
TargetPort:        8080/TCP
Endpoints:         10.40.0.20:8080
Port:              https  443/TCP
TargetPort:        8443/TCP
Endpoints:         10.40.0.20:8443
Session Affinity:  ClientIP
Events:            <none>
imkunyoung@cloudshell:~ (kubernetes-397511)$ kubectl get pod -o wide
NAME                                            READY   STATUS    RESTARTS   AGE     IP           NODE                                       NOMINATED NODE   READINESS GATES
admin-page                                      1/1     Running   0          3d5h    10.40.0.5    gke-artbridge-default-pool-65403ed8-7zvx   <none>           <none>
front-end                                       1/1     Running   0          3d5h    10.40.1.5    gke-artbridge-default-pool-65403ed8-fz5f   <none>           <none>
jenkins-deployment-58f88d9746-gmvkc             1/1     Running   0          2d10h   10.40.0.6    gke-artbridge-default-pool-65403ed8-7zvx   <none>           <none>
jhipster-prometheus-operator-77c8f847cb-sr7sx   1/1     Running   0          45h     10.40.0.14   gke-artbridge-default-pool-65403ed8-7zvx   <none>           <none>
mariadb-5bfcbc8dd5-vm69q                        1/1     Running   0          8h      10.40.1.15   gke-artbridge-default-pool-65403ed8-fz5f   <none>           <none>
nginx                                           1/1     Running   0          90s     10.40.0.20   gke-artbridge-default-pool-65403ed8-7zvx   <none>           <none>


외부 IP 연결 설정 YAML

  • 내부에서 로드밸런싱해서 외부로 나가고자 하는 경우
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 49152
  externalIPs:
    - 198.51.100.32

0개의 댓글