Study/K8S

Services

monitor 2023. 4. 1. 23:35

1. Services

역할

-  포드끼리 묶어 놓음 그리고, 다른 서비스와의 연결을 도와줌

 

예제로 외부 사용자가 어떻게 내부 POD에 접근 할 수 있을까?

 

SSH로 쿠버네티스 서버에 연결하면 되겠죠. 하지만, SSH를 연결하지 않고 노트북에서 노드 IP로 바로 접속하는 방법이 없을까?

 

- Service가 바로 연결을 도와줌.

 

- NodePort : 서비스가 노드 포트를 열어서 외부에서 서비스에 지정한 노드 포트로 연결 할 수 있게 해서 들어 가게 함

- ClusterIP : 클러스터 내부에 가상 IP를 만들어서 APP끼리 연결을 가능하게 한다.

- LoadBalancer : 

 

Service - NodePort

- 서비스는 노드 포트끼리 매핑 시켜줘서 접속을 할 수 있게 한다.

TargetPort : Pod의 포트

Port : 서비스의 포트

NodePort : 노드의 포트 번호

 

Service-definition.yaml

apiVersion: v1
kind: Service
metadata: 
  name: myapp-service
spec:
  type: NodePort
  ports:
  - targetPort: 80 #Target Pod의 포트 번호 -> 정확히 어떤 Pod인지 정의가 필요하다
    port: 80 #서비스의 포트 번호
    nodePort: 30008 # Node Port 번호
  selector: # Pod의 label로 정해진 이름이나 타입을 가져와서 어떤 POD인지 정의한다.
    app: myapp
    type: front-end

 

다중 노드든 다중 포드이든 서비스가 가로질러서 포드 또는 노드를 연결 시킬 수 있기 때문에 추가적인 적용이 필요가 없다.

 

Service - Cluster IP

포드는 기본적으로 IP들이 적용 되어져 있습니다. 그래서, 앱 간에 일일이 내부 IP 주소로 연결하기는 어렵습니다.

 

- 이것을 K8S 서비스가 해결 해줄 수 있습니다.

 

백앤드 Pod를 서비스 하나로 묶으면 프론트 앤드 Pod도 일일이 내부 IP 주소로 연결 할 필요가 없겠죠.

 

아래의 yaml은 back-end를 가로지르는 서비스가 될 것이다.

apiVersion: v1
kind: Service
metadata: 
  name: back-end
spec:
  type: ClusterIP
  ports:
  - targetPort: 80 #Target Pod의 포트 번호 -> 정확히 어떤 Pod인지 정의가 필요하다
    port: 80 #서비스의 포트 번호
  selector: # Pod의 label로 정해진 이름이나 타입을 가져와서 어떤 POD인지 정의한다.
    app: myapp
    type: back-end