본문 바로가기

Infra/Kubernetes

[cka] Kubernetes - Service

1. Service가 필요한 이유?

(문제점)

- pod는 언제든 재시작되거나 다른 노드로 이동 가능

-> 이럴때마다 IP가 바뀜

-> 다른 pod나 외부 클라이언트가 해당 pod에 직접 접근이 어려워짐

(해결책)

- service를 사용

-> pod 집합에 대한 고정된 endpoint를 제공

-> service는 label.selector를 이용해 특정 Pod들을 자동으로 찾아 연결함

2. Service의 주요역할

1) 고정된 IP 제공: pod의 IP가 변해도 service의 고정된 IP로 접근가능 

2) 로드밸런싱: 여러 pod에 트래픽 분산

3) 서비스 디스커버리(DNS): service-name.namespace.svc.cluster.local 형태로 다른 Pod에서 접근가능

4) 외부노출: 클러스터 밖에서도 접근할 수 있도록 구성 가능

 

4. Service의 종류 (type)

-> yaml 파일의 spec.type 부분에 들어감

apiVersion: v1
kind: Service
metadata:
   name: myapp-service
spec:
   type: NodePort
   ports:
      - targetPort: 80  // 지정안해주면, port와 동일하다고 봄
      port: 80          // 필수
      nodePort: 30008

 

1) ClusterIP : 클러스터 내부에서만 접근 가능

ex) 백엔드 pod간 통신

2) NodePort : 각 노드의 특정포트를 열어 외부에서 접근 가능

ex) 테스트용, 단순 서비스 노출등

3) LoadBalancer : 클라우드 로드밸런서를 통해 외부에 서비스 노출

ex) AWS, GCP, Azure 등

4) ExternalName : DNS 이름을 외부 도메인으로 매핑

ex) 외부서비스와의 통합

 

5. Service 예시

apiVersion: v1
kind: Service
metadata:
   name: my-app
spec:
   selector:
      app: my-app
   ports:
      - port: 80          // 서비스 내부 포드
      targetPort: 8080    // pod가 실제 듣는 포트
   type: ClusterIP

6. service의 흐름

클라이언트 -> service  -> pod1
                    -> pod2
                    -> pod3

 

- service는 트래픽을 받아서 연결된 여러 pod중 하나로 로드밸런싱을 해준다

- 우리는 targetPort가 어떤 pod와 연결되는지 아는법? -> labels와 selector를 통해 연결하고자 함

 

- service 각 type 별로 흐름