Kubernetes/Udemy - CKAD with Tests

Services

비번변경 2021. 8. 10. 19:23

Services

k8s Services

Pod 집합에서 실행 중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법

쿠버네티스 개체 중 하나로 애플리케이션 내부와 외부의 구성 요소 간의 통신을 가능하게 하며, 애플리케이션을 다른 애플리케이션 또는 사용자와 연결하는 데 사용한다. 포드 그룹 간의 연결을 가능하게 하며, 애플리케이션에서 마이크로서비스 간의 느슨한 연결을 생성한다.

 

타입

  • NodePort
    노드의 특정 포트에 들어온 요청을 수신하여, 노드의 포드로 전달한다.
    노드의 포트에서 노드 내의 포드에 접근할 수 있도록 노드의 포트를 포드의 포트에 매핑한다.
    - targetPort : 요청을 전달할 포드의 포트
    - port : 서비스 자체의 포트
    - nodePort : 노드 자체에서 외부와 통신하는 데 사용하는 포트로, 30000번부터 32767번까지의 포트를 사용한다.
    nodeport service
  • ClusterIP
    클러스터 내에 가상 IP를 할당하여 다른 서비스 간의 커뮤니케이션을 가능하게 한다. 클러스터 내에서는 서비스에 접근할 수 있지만, 외부 IP를 할당한 서비스가 아니므로 클러스터 외부에서는 접근이 불가능하다.
  • LoadBalancer
    클라우드 공급자에서 제공하는 설정 방식으로, 로드밸런서를 할당한다.
    loadbalancer service

생성 방법

yaml 형식의 정의 파일을 이용해 생성할 수 있다.

apiVersion: v1
kind: Service
metadata:
	name: myapp-service
spec: 
	type: NodePort
	ports: # array
		- targetPort: 80
		port: 80 # 얘만 필수
		nodePort: 30008
	selector:
		app: myapp
		type: front-end

type에는 NodePort, ClusterIP, LoadBalancer 값을 지정할 수 있다.

ports 항목에서 port만 필수 항목이며, targetPort를 지정하지 않으면 port 값과 동일한 것으로 간주한다. nodePort를 지정하지 않으면 nodePort 범위(30000 - 32767) 내의 포트가 무작위로 지정된다.

selector는 서비스와 연결할 포트를 지정한다.

 

확인

kubectl get services

NodePort 서비스가 생성되면 지정된 nodePort를 이용해 포드의 애플리케이션에 접근할 수 있게 된다.

 

만약 고가용성 확보를 위해 노드 내에 같은 애플리케이션의 포드가 여러 개 동작하고 있다면, 서비스는 생성 시 selector로 지정된 모든 포드를 요청을 전달할 엔드포인트로 선택한다. 또한 랜덤 알고리즘을 이용해 부하를 분산하기 때문에, 로드밸런서 역할을 수행하기도 한다.

 

만약 포드가 여러 노드에 분산되어 동작하고 있는 경우, 쿠버네티스는 서비스를 생성할 때 자동으로 모든 노드에 걸쳐 노드 포트와 대상 포트를 연결한다.

즉, 단일 노드에 단일 포드가 동작하든, 단일 노드에 여러 포드가 동작하든, 여러 노드에 여러 포드가 동작하든 yaml 파일의 구성을 변경할 필요가 없다. 또한 포드를 추가/제거하면 서비스가 자동으로 업데이트되기 때문에 유연하다.

 

 

 

참고 문서

https://www.waytoeasylearn.com/learn/kubernetes-services/

https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-ingress-guide-nginx-example.html

728x90