쿠버네티스(Kubernetes)는 컨테이너 오케스트레이션 도구로, 다양한 리소스와 객체를 통해 애플리케이션의 배포, 관리, 확장을 자동화합니다. 그 중에서도 서비스(Service)는 애플리케이션 컴포넌트 간 또는 외부와의 통신을 용이하게 만드는 핵심 리소스입니다. 이 글에서는 쿠버네티스 서비스의 개념, 종류 및 kubectl을 이용한 서비스 관리 방법에 대해 알아보겠습니다.
쿠버네티스 서비스는 파드 집합에 대해 지속적으로 접근할 수 있는 고정 IP 주소와 DNS 이름을 제공하는 추상화 레이어입니다. 서비스는 파드가 죽고 다른 파드로 교체되어 IP 주소가 변경되더라도, 해당 파드 집합에 지속적으로 트래픽을 라우팅할 수 있는 안정적인 방법을 제공합니다.
쿠버네티스는 다음과 같은 서비스 유형을 제공합니다:
kubectl을 사용한 서비스 관리kubectl은 쿠버네티스 클러스터를 제어하기 위한 커맨드라인 도구입니다.
ClusterIP 서비스 생성:
kubectl create service clusterip my-cip-service --tcp=5678:8080
이 명령은 my-cip-service라는 이름의 ClusterIP 서비스를 생성하고, TCP 포트 5678을 파드의 포트 8080에 매핑합니다. 이 유형의 서비스는 클러스터 내에서만 접근 가능합니다.
NodePort 서비스 생성:
kubectl create service nodeport my-np-service --tcp=5678:8080
my-np-service라는 이름의 NodePort 서비스를 생성합니다. 이 명령은 TCP 포트 5678을 파드의 포트 8080에 매핑하고, 클러스터 외부에서 접근 가능한 포트를 할당받습니다. 클러스터의 모든 노드에서 해당 NodePort를 통해 서비스에 접근할 수 있습니다.
LoadBalancer 서비스 생성:
kubectl create service loadbalancer my-lb-service --tcp=5678:8080
my-lb-service라는 이름의 LoadBalancer 서비스를 생성합니다. 클라우드 제공업체의 로드 밸런서를 통해 클러스터 외부에 노출되며, TCP 포트 5678을 파드의 포트 8080에 매핑합니다. 이 유형의 서비스는 외부 IP 주소를 제공받아 클러스터 외부에서 서비스에 접근할 수 있게 합니다.
Minikube 서비스 연결
minikube service my-lb-service
**minikube**에서 사용하게 될 경우 항상 Pending 상태를 유지하게 됩니다.
위 명령을 사용하여 **minikube**와 Kubernates Cluster 를 연결할 수 있습니다.
서비스 목록을 확인하고자 할 때는 다음 kubectl get services 명령을 사용합니다:
kubectl get services
이 명령은 클러스터 내의 모든 서비스 목록과 상태 정보를 출력합니다.
불필요한 서비스를 삭제하려면 kubectl delete service 명령을 사용합니다:
kubectl delete service my-service-name
my-service-name을 삭제하려는 서비스의 이름으로 대체합니다.
아래는 LoadBalancer 서비스를 선언적으로 생성하는 YAML 파일의 예시입니다:
apiVersion: v1
kind: Service
metadata:
name: my-lb-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer
이 파일을 my-lb-service.yaml로 저장한 후, 다음 명령을 실행하여 서비스를 클러스터에 적용합니다:
kubectl apply -f my-lb-service.yaml
apiVersion: 사용하는 쿠버네티스 API의 버전을 명시합니다.kind: 생성하고자 하는 리소스의 종류를 명시합니다. 이 경우 'Service'입니다.metadata: 리소스에 대한 메타데이터를 포함합니다. 여기에는 리소스의 이름, 네임스페이스, 레이블 등이 포함될 수 있습니다.name: 서비스의 이름을 지정합니다.spec: 서비스의 상세 사양을 기술합니다.selector: 서비스가 관리할 파드를 선택하는 데 사용되는 레이블 셀렉터입니다.ports: 서비스를 통해 노출되는 포트와 해당 포트로 트래픽이 전달될 파드의 포트를 명시합니다.protocol: 사용하는 프로토콜을 지정합니다 (기본값은 TCP).port: 클러스터 외부에서 서비스에 접근하기 위해 사용될 포트입니다.targetPort: 트래픽이 전달될 파드의 포트입니다.type: 서비스의 유형을 지정합니다. (예: ClusterIP, NodePort, LoadBalancer)