개요
쿠버네티스 클러스터에서 컨트롤러를 이용해 포드를 실행한 경우, 포드는 한 장소에서 고정되어 실행되지 않고 클러스터 내부를 옮겨 다니며 실행됩니다. 노드가 옮겨지는 과정에서 포드 IP가 변경되기도 합니다.
동적으로 변하는 포드에 접근하기 위해서 사용되는 방법이 바로 쿠버네티스 서비스입니다. 서비스를 사용하면 고정 주소를 이용해 포드에 접근할 수 있습니다.
인그레스로도 포드에 접근할 수 있는데 서비스는 주로 L4 영역에서 통신을 할 때 사용하고, 인그레스는 주로 L7 영역에서 통신할 때 사용한다는 차이점이 있습니다.
타입
서비스 타입은 크게 네 가지가 있습니다.
- ClusterIP: 기본 서비스이며 쿠버네티스 클러스터 내부에서만 사용 가능. 클러스터 IP를 이용해 포드에 접근
- NodePort: 서비스 하나에 모든 노드에 지정된 포트를 할당. 노드의 포트를 사용함으로 클러스터 외부에서도 접근 가능.
- LoadBalancer: 쿠버네티스를 지원하는 로드밸런서 장비에서 사용. CSP에서 제공하는 로드밸런서와 포드를 연결 후, 해당 로드밸런서 IP를 이용해 클러스터 외부에서 포드에 접근
- ExternalName: 서비스를 .spec.externalName 필드에 설정한 값과 연결. 클러스터 내부에서 외부에 접근할 때 주로 사용. CNAME 값을 이용해 클러스터 외부에 접근 가능
ClusterIP
기본 서비스 타입으로, 클러스터 내에서만 사용 가능합니다. 클러스터 내 노드 또는 포드에서는 클러스터 IP를 이용해 서비스에 연결된 포드에 접근합니다. 클러스터 외부에서는 이용할 수 없습니다.
아래 clusterip.yaml은 기본적인 ClusterIP 설정 예를 보여줍니다.
- .spec.type 필드에서 서비스 타입을 설정 가능. .spec.type 필드 값을 설정하지 않으면 기본 타입은 ClusterIP
- .spec.ClusterIP 필드에서 클러스터 IP 설정 가능. 설정 안하면 자동으로 IP 값이 할당됨
- .spec.selector 필드에는 서비스와 연결할 포드에 설정한 .labels 필드 값을 설정
- .spec.ports[] 필드는 배열 형태로 포트 여러 개를 외부에 제공할 때는 .spec.ports[] 하위에 필드 값을 설정
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
clusterIP: 10.0.10.10
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 30080
아래 명령으로 ClusterIP를 적용할 수 있습니다.
kubectl apply -f clusterip.yaml
아래 명령으로 Service를 확인할 수 있습니다.
kubectl get svc
NodePort
하나의 서비스에 모든 노드의 지정된 포트를 할당합니다. node1:8080, node2:8080 처럼 노드에 상관없이 서비스에 지정된 포트 번호만 사용하면 포트에 접근할 수 있습니다. 클러스터 내부 및 외부에서 접근 가능합니다. 클러스터 외부에서 내부로 접근하는 가장 간단한 방법입니다. 특이한 점은 node1에만 실행되어 있고 node2에는 실행되지 않았더라도 node2:8080으로 접근했을 때 node1에 실행된 포드로 연결합니다.
아래 nodeport.yaml은 기본적인 NodePort 설정 예를 보여줍니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: MyApp
ports:
- protocol: TCP
port: 80 #서비스를 노출하는 포트
targetPort: 80 #외부 사용자가 어플리케이션에 접근하기 위한 포트
nodePort: 30080 #외부에서 사용자가 접근하는 포트
아래 명령으로 NodePort를 적용할 수 있습니다.
kubectl apply -f nodeport.yaml
아래 명령으로 Service를 확인할 수 있습니다.
kubectl get svc
LoadBalancer
AWS, GCP, Azure 등의 클라우드 서비스에서 제공하는 로드밸런서와 포드를 연결한 후 해당 로드밸런서의 IP를 이용해 외부에서 포드에 접근하도록 합니다.
아래 loadbalancer.yaml은 기본적인 LoadBalancer 설정 예를 보여줍니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 80
아래 명령으로 LoadBalancer를 적용할 수 있습니다.
kubectl apply -f loadbalancer.yaml
ExternalName
클러스터 내에서 외부에 접근할 때 주로 사용합니다.
아래 externalname.yaml은 기본적인 ExternalName 설정 예를 보여줍니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: google.com
아래 명령으로 ExternalName를 적용할 수 있습니다.
kubectl apply -f externalname.yaml
'K8s' 카테고리의 다른 글
K8s 소개 (2) | 2025.04.20 |
---|---|
kube-proxy (0) | 2025.04.20 |
컨트롤러 (Controller) (0) | 2025.03.31 |
포드 (Pod) (0) | 2025.03.31 |
K8s Cluster 구조 (0) | 2025.03.29 |