쿠버네티스 서비스에서는 파드 간 연결을 가리켜 파드를 노출(expose)한다. 라고 표현한다.
쿠버네티스 서비스는 동적으로 각 파드 간 연결을 제공한다. = 서비스 디스커버리한다.
쿠버네티스는 파드의 연결을 제공(Serve)한다는 의미로 서비스라는 용어를 쓴다.
클러스터 내부 혹은 외부 연결에 따라 서비스 타입을 다음과 같이 구분한다.
- 클러스터 내부에서 파드와 파드를 연결: 클러스터IP (Cluster IP), 헤드리스(Headless)
- 클러스터 외부에서 클러스터 내부의 파드를 연결: 노드포트 (NodePort), 로드밸런서(LoadBalancer)
서비스는 쿠버네티스 리소스의 한 종류
- 다이나믹하게 종료되고 생성되는 파드를 자동으로 발견(Service Discovery)한다.
- 변경이 잦은 IP 주소가 아닌 지속 가능한 도메인 레코드(DNS) 기반의 쿠버네티스 서비스 이름을 이용해 통신한다.
- 노드 내 실행 중인 여러 파드로 부하를 분산하는 로드밸런싱 기능을 자체적으로 지원한다.
1. 클러스터 내부 파드 간 통신
클러스터 내부 파드와 파드 간 연결을 이해하기 위해 클러스터IP 타입의 서비스를 생성한다. 서비스에서 기존 파드가 삭제되고 파드가 새로 생성될 때 자동으로 새로운 파드를 인식하는지 확인한다.
그리고 파드 수량을 증가시켜 서비스가 새로운 파드를 자동으로 등록하는지 확인한다.(서비스 디스커버리)
1.1. nginx 디플로이먼트를 생성한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-hello
namespace: default
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx #셀렉터가 연결할 레이블
template:
metadata:
labels:
app: nginx #파드의 레이블
spec:
containers:
- name: nginx
image: nginxdemos/hello
레이블이 필요한 이유는 서로 다른 리소스간에 선택을 해야 한다면 셀렉터(Selector, 선택자) 옵션을 사용한다.
내부적으로 레이블을 기준으로 리소스를 선택한다.
selector: nginx -> spec.template:metadata.labels: nginx
셀렉터가 레이블 기준으로 연결한다.
nginx-ClusterIP-svc.yml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector: # 선택해야 할 POD
app: nginx # 파드 Label과 동일
type: ClusterIP
ports:
- name: tcp
port: 80 #서비스로 연결하는 포트
targetPort: 80 #타깃 파드의 포트
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc ClusterIP 10.99.54.145 <none> 80/TCP 3m31s
클러스터IP 타입의 서비스가 정상적으로 생성되었다.
셀렉터를 이용해 서비스가 생성되면 자동으로 엔드포인트가 만들어진다.
엔드포인트란 쿠버네티스 서비스에서 관리하는 도착 종료 지점(endpoint)이다.
kubectl get endpoints
NAME ENDPOINTS AGE
nginx-svc 10.10.180.249:80 65s
외부 -> 노드포트, 로드밸런서 -> 클러스터 ip -> 파드
엔드포인트: 파드 접근 정보
'Kubernetes > 활용' 카테고리의 다른 글
kube-proxy 부하분산 설정의 이해 (0) | 2024.02.23 |
---|---|
쿠버네티스 DNS 기능 이해 (0) | 2024.02.22 |
Helm 헬름 활용(3) (0) | 2024.02.19 |
Helm 헬름 활용(2) (0) | 2024.02.19 |
Helm 헬름 활용(1) (0) | 2024.02.19 |