Kubernetes는 애플리케이션을 컨테이너화하고 관리하는 강력한 도구입니다. 그 중에서도 Service는 클러스터 내의 애플리케이션을 네트워킹하는 데 중요한 역할을 합니다. Kubernetes 서비스는 ClusterIP, NodePort, LoadBalancer, ExternalName 네 가지 유형이 있습니다. 이번 글에서는 Kubernetes Service의 한 종류인 ClusterIP에 대해 자세히 알아보겠습니다.

ClusterIP란?

ClusterIP는 Kubernetes Service의 기본 유형입니다. 이 유형은 클러스터 내부에서만 접근 가능한 가상 IP 주소를 할당하여, Pod 간의 통신을 용이하게 합니다. ClusterIP는 외부에서 접근할 수 없기 때문에 클러스터 내부에서의 서비스 디스커버리와 서버 간 통신 목적으로 사용됩니다.

주요 특징

  1. ClusterIP는 클러스터 외부에서 접근할 수 없으며, 오직 클러스터 내부의 Pod들 간에 통신을 허용합니다.
  2. ClusterIP는 서비스가 생성될 때 자동으로 가상 IP를 할당합니다.
  3. 동일한 서비스에 속하는 여러 Pod들 간의 트래픽을 자동으로 로드 밸런싱합니다.
  4. Kubernetes는 ClusterIP 서비스에 대해 DNS 엔트리를 자동으로 생성하여, 서비스 이름을 통해 접근할 수 있도록 합니다.

ClusterIP 서비스 생성하기

ClusterIP 서비스를 생성하는 방법은 매우 간단합니다. 아래는 Nginx 애플리케이션을 대상으로 ClusterIP 서비스를 생성하는 예제입니다.

Deployment 정의

먼저 Nginx Pod를 배포하는 Deployment를 정의합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
  labels:
    app.kubernetes.io/name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Service 정의

ClusterIP 서비스를 정의하려면 type을 ClusterIP로 지정해야 합니다.

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: default
spec:
  type: ClusterIP
  selector:
    app.kubernetes.io/name: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80

위의 정의 파일을 통해 nginx-service라는 이름의 ClusterIP 서비스를 생성할 수 있습니다. 이 서비스는 app.kubernetes.io/name: nginx 레이블을 가진 모든 Pod의 80번 포트로 트래픽을 전달합니다. kubectl 명령어로 생성된 서비스를 확인할 수 있습니다.

$ kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx-service   ClusterIP   10.100.53.125   <none>        80/TCP    1d

FQDN(Fully Qualified Domain Name)

Kubernetes에서는 각 서비스마다 DNS 엔트리를 자동으로 생성합니다. 이 DNS 엔트리를 통해 서비스는 FQDN으로 접근할 수 있습니다. FQDN은 특정 리소스의 전체 경로를 나타내는 도메인 이름입니다.

FQDN 형식

Kubernetes에서 ClusterIP 서비스의 FQDN은 일반적으로 다음과 같은 형식을 가집니다.

<서비스 이름>.<네임스페이스 이름>.svc.cluster.local
  • <서비스 이름>: 생성한 서비스의 이름
  • <네임스페이스 이름>: 서비스가 속한 네임스페이스의 이름
  • svc: 서비스의 약어로, 고정된 부분
  • cluster.local: 클러스터 도메인 이름, 기본적으로 cluster.local이 사용되지만, 클러스터 설정에 따라 다를 수 있음

위의 예제에서 만든 nginx-service의 경우 nginx-service.default.svc.cluster.local 도메인을 사용하여 nginx pod와 통신할 수 있습니다.

활용 사례

  • 내부 마이크로서비스 통신: ClusterIP는 마이크로서비스 아키텍처에서 서비스 간의 내부 통신을 지원하는 데 유용합니다.
  • 비공개 API: 외부에 노출되지 않아야 하는 비공개 API를 제공하는 서비스에 적합합니다.

결론

ClusterIP 서비스는 Kubernetes에서 가장 기본적인 서비스 유형으로, 클러스터 내부에서 Pod 간의 안정적인 통신을 지원합니다. 이를 통해 개발자는 클러스터 내부의 서비스 디스커버리와 로드 밸런싱을 쉽게 구현할 수 있습니다. ClusterIP를 잘 활용하면 클러스터 내부 네트워킹을 효율적으로 관리할 수 있습니다.

References

Kubernets Service - ClusterIP