서비스는 쿠버네티스 클러스터 내의 여러 파드를 하나의 엔드포인트로 묶어주는 역할을 한다. 파드들은 클러스터 내에서 동적으로 생성되고 제거되기 때문에 IP 주소가 변할 수 있지만, 서비스는 일관된 IP 주소와 DNS 이름을 제공하여 파드들의 변경에도 불구하고 안정적인 네트워크 접속을 보장한다.
서비스의 유형
ClusterIP
- 기본 서비스 유형으로, 클러스터 내부에서만 접근 가능한 IP 주소를 제공한다.
- 클러스터 외부에서는 접근할 수 없으며, 내부 통신에 주로 사용된다.
- 마이크로서비스 간의 내부 통신, 데이터베이스 접근 등 내부 네트워크에서의 통신.
NodePort
- 외부에서 노드 IP의 특정 포트(<NodeIP>:<NodePort>)로 들어오는 요청을 감지하여, 해당 포트와 연결된 파드로 트래픽을 전달하는 유형의 서비스다.
- NodePort 서비스를 생성하면 모든 클러스터 노드의 IP 주소와 지정된 포트를 통해 서비스에 접근할 수 있다. 일반적으로 30000에서 32767 사이의 포트를 사용한다.
- 클러스터 내부로 들어온 트래픽을 특정 파드로 연결하기 위한 ClusterIP 역시 자동으로 생성된다.
- 클러스터 외부에서 직접 노드에 접근하여 애플리케이션에 연결해야 할 때 사용.
LoadBalancer
- 클라우드 서비스 제공자의 로드 밸런서를 이용하여 외부 트래픽을 서비스로 라우팅 하는 유형이다.
- 주로 클라우드 환경에서 사용되며, 외부 IP를 할당받아 외부 트래픽을 자동으로 분산 처리할 수 있다. 이에 필요한 NodePort와 ClusterIP 역시 자동 생성된다.
- 이때 프로비저닝된 로드 밸런서의 정보는 서비스의 status.loadBalancer 필드에 게재된다.
- 클라우드 환경에서 인터넷 트래픽을 받아야 하는 웹 서비스나 API 서버.
ExternalName
- 클러스터 내부에서 정의된 서비스가 클러스터 selector 대신 외부의 DNS 이름으로 트래픽을 리디렉션 하는 유형이다.
- spec.externalName 항목에 필요한 DNS 주소를 기입하면, 클러스터의 DNS 서비스가 해당 주소에 대한 CNAME 레코드를 반환하게 된다.
- 이 유형은 서비스 이름을 외부 도메인으로 매핑하고, 내부 요청을 외부 서비스로 전달한다.
- 외부의 특정 서비스나 API와 통신해야 하는 경우에 유용하다.
서비스의 구성 요소 및 필드
- selector
- 서비스가 트래픽을 라우팅할 대상 파드를 선택하기 위해 사용하는 레이블이다.
- 여러 레이블을 조합하여 특정 파드들을 선택할 수 있다.
- ports
- 서비스에서 사용하는 포트를 정의한다. 여러 포트를 정의할 수 있다.
- name: 서비스에서 사용될 포트 이름.
- port: 서비스가 노출하는 포트.
- targetPort: 트래픽이 전달될 파드의 포트. 숫자 또는 컨테이너 내의 포트 이름이 될 수 있다.
- nodePort: NodePort 서비스에서 노드의 특정 포트를 지정할 때 사용.
- protocol: 사용하는 프로토콜. 기본값은 TCP이며, UDP도 지원한다.
- type
- 서비스의 유형을 정의한다.
ClusterIP
,NodePort
,LoadBalancer
,ExternalName
중 하나를 선택할 수 있다.
- 서비스의 유형을 정의한다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
tier: frontend
ports:
- name: http
protocol: TCP
port: 80 # 클러스터 내부 포트
targetPort: 8080 # 파드가 수신할 포트 (숫자 또는 이름)
nodePort: 30036 # NodePort 서비스일 경우 노출할 포트
clusterIP: 10.0.0.10 # 클러스터 내부 IP (자동 할당 가능)
type: NodePort # NodePort 유형의 서비스
이 설정은 app: MyApp
과 tier: frontend
레이블을 가진 파드에 대해, 클러스터 외부의 노드 포트 30036
을 통해 접근 가능하게 하고, 그 트래픽을 파드의 8080
포트로 전달하는 서비스이다. targetPort
는 숫자 8080
또는 컨테이너 내의 포트 이름 http
으로 지정될 수 있다.
728x90
'DevOps > K8S' 카테고리의 다른 글
[k8s] Pod (0) | 2024.08.29 |
---|---|
[k8s] NodePort (0) | 2024.08.29 |
[k8s] Namespace (0) | 2024.08.28 |
[k8s] 배포 흐름 (0) | 2024.08.28 |
[K8s] 설치 시 스왑 비활성화의 필요성 (0) | 2024.08.26 |