Service

Monday·2024년 6월 12일
post-thumbnail

Service

Pod은 자체 IP를 가지지만 계속 생성/제거 되기 때문에 IP가 변동된다.
그래서 이러한 Pod과 직접 통신하는 것은 권장되지 않는다.
그래서 Pod들과 연결된 Service라는 별도의 개체를 만들어서 IP를 할당하고
Service를 통해서 Pod 들과 통신한다.

Service (ClusterIP)

외부에서 Pod으로 접속하는게 아닌,
Cluster에 있는 Pod이 다른 Pod에 접속하기 위해 만드는 서비스다.

내부적으로 도메인을 등록하여 같은 클러스터에서 도메인으로 접근할 수 있다.

yaml 파일

apiVersion: v1
kind: Deployment
metadata:
  name: deploymentName
spec:
  selector:
    matchLabels:
      app: appName
      tier: tierName
  template:
    metadata:
      labels:
        app: appName
        tier: tierName
    spec:
      containers:
        - name: containerNAme
          image: imagePath
          ports:
            - containerPort: port
              protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  name: serviceName
spec:
  ports:
    - port: port
      protocol: TCP
  selector:
    app: appName
    tier: tierName

Service의 spec.ports.port와Deployment의spec.template.spec.containers.ports.containerPort 값이 동일한 경우 spec.ports.port로 접근하면 spec.template.spec.containers.ports.containerPort로 붙는다.

두 값이 다른 경우
spec.ports.targetPort로 서비스가 접근할 Pod의 port를 지정하면 된다.

Service의 동작 방식

Endpoint Contoller

  • 서비스를 계속 감시한다
  • 새로운 서비스가 등장하면, 서비스의 label과 Pod을 보고 endpoint를 생성한다

kube Proxy

  • 각 노드에 설치되어 있는 것이다
  • endpoint를 감시한다
  • 새로운 endpoint가 설정되면 ip 테이블에 설정한다
  • endpoint의 대표 ip로 접속하면 그 안에 있는 Pod 중 하나로 접속할 수 있도록 한다

CoreDNS

  • Service를 감시하다, Service가 생성되면 Service 이름으로 도메인을 추가한다.

Service(NodePort)

ClusterIP는 내부에서만 접근이 가능하다.
NodePort의 경우 Clutser 외부에서 접근하기 위함이다

yaml 파일

apiVersion: v1
kind: Service
metadata:
  name: serviceName
spec:
  type: NodePort
  ports:
    - port: 3000
      protocol: TCP
      nodePort: 31000
  selector:
    app: appName
    tier: tierName
  • spec.type을 따로 지정 안해주면 ClusterIP가 된다.
  • 외부에서 31000번 port로 접속하면 Pod의 3000번 port로 접속이 되는 것이다

구조

  • 외부에 30000 ~ 32767 port 중 하나를 노출한다. (지정 안할 경우에)

Node가 여러개인 경우 한 Service로 접속할 수 있도록 한다.

Service(LoadBalance)

Node가 사라진 경우 다른 Node를 통해 접속하도록 해야한다.
LoadBalancer는 더 앞에서 NodePort 여러개를 관리해준다.
살아있는 Node를 통해서 접속할 수 있도록 해준다.

  • LoadBalance로 요청 -> NodePort로 요청 -> ClusterIP -> Pod로 요청이 전달되는 흐름이다
  • 실제로는 Node 자체도 사라졌다 추가될 수 있으므로 LoadBalancer를 많이 사용한다
  • LoadBalancer는 하나의 Service 밖에 바라보지 못한다.
    그러면 2개의 Service를 위해서는 LoadBalancer가 2개 필요하다.
    그래서 Ingress를 주로 사용한다.

yaml 파일


apiVersion: v1
kind: Service
metadata:
  name: serviceName
spec:
  type: LoadBalancer
  ports:
    - port: 30000
      targetPort: 3000
      protocol: TCP
  selector:
    app: appName
    tier: tierName
profile
차근차근 꾸준히

0개의 댓글