서비스
YAML
## 서비스 apiVersion: v1 kind: Service metadata: name: web-service spec: # type을 생략하여 ClusterIP가 적용된다. selector: # service - 백엔드 pod와 연결 app: web ports: - protocol: TCP port: 80
서비스 API
항목 | 설명 |
---|---|
kind | Service 설정 |
apiVersion | v1 설정 |
metadata | name에 네임스페이스 내 유일한 이름을 설정. 여기서 설정한 이름은 내부 DNS에 등록되며, IP 주소 해결에 사용. 또한, 이후 기동된 파드의 환경 변수에 설정 |
spec |
서비스 사양
항목 | 설명 |
---|---|
type | 서비스 공개 방법을 설정 선택이 가능한 타입은 ClusterIP, NodePort, LoadBalancer, ExternalName 네 가지 |
ports | 서비스에 의해 공개되는 포트번호 |
selector | 여기서 설정한 라벨과 일치하는 파드에 요청을 전송. 서비스 타입이 ClusterIP, NodePort, LoadBalancer인 경우헤 해당되며 ExternalName인 경우는 무시 이 항목을 설정하지 않은 경우, 외부에서 관리하는 엔드포인트를 가진 것으로 간주 |
sessionAffinity | 설정이 가능한 세션 어피니티는 ClientIP. 생략 시 None으로 설정됨 |
clusterIP | 이 항목을 생락하면 대표 IP 주소가 자동으로 할당. 그리고 None을 설정하면 헤드리스로 동작 |
서비스 파드 사양
항목 | 설명 |
---|---|
port | 필수 항목. 이 서비스에 의해 공개되는 포트번호 |
name | port가 하나인 경우는 생략할 수 잇고 여러 개인 경우는 필수 설정 필요 각 포트의 이름은 서비스 스펙 내에서 유일해야 함 |
protocol | 생략 시에는 TCP가 설정됨. TCP 혹은 UDP 설정 가능 |
nodePort | 생략 시에는 시스템이 자동으로 할당 type이 NodePort나 LoadBalancer인 경우 모든 노드에서 포트를 공개 설정한 포트가 이미 사용 중인 경우에는 오브젝트 생성에 실패 |
targetPort | 생략 시에는 port와 동일한 값이 사용됨. selector에 의해 대응되는 파드가 공개하는 포트번호 또한 포트 이름을 설정함 |
Deployment
## 디플로이먼트 apiVersion: apps/v1 kind: Deployment metadata: name: web-deploy spec: replicas: 3 selector: # deployment - pod 대응용 matchLabels: app: web template: # 여기서부터 파드 템플릿 metadata: labels: app: web # 파드의 라벨 spec: containers: - name: nginx image: nginx:latest
서비스 타입 개요
서비스 타입 | 접근 가능 범위 |
---|---|
ClusterIP | 타입을 지정하지 않으면 기본으로 설정되며, 클러스터 내부의 파드에서 서비스의 이름으로 접근 할 수 있다 |
NodePort | ClusterIP의 접근 범위뿐만 아니라 k8s 클러스터 외부에서도 노드의 IP 주소와 포트번호로 접근 할 수 있다 |
LoadBalancer | NodePort 의 접근 범위 뿐만 아니라 k8s 클러스터 외부에서 대표 IP 주소로 접근 할 수 있다 |
ExternalName | k8s 클러스터 내의 파드에서 외부 IP 주소에 서비스의 이름으로 접근할 수 있다 |
NodePort는 쉽고 편리하게 설정할 수 있지만 정식 서비스에 사용하는 것은 추천하지 않는다.