Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.10] 🚀 Service 편 #1 | ClusterIP & NodePort 서비스

ygtoken 2025. 3. 16. 14:17
728x90

 

쿠버네티스에서 Pod 간 통신 및 외부에서 접근할 수 있도록 하는 방법은 매우 중요합니다.

이번 글에서는 ClusterIP와 NodePort 서비스를 활용하여 내부 및 외부 트래픽을 관리하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ ClusterIP 서비스를 활용한 내부 통신

2️⃣ NodePort 서비스를 이용한 외부 접근

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ ClusterIP 서비스를 활용한 내부 통신

 

❓ 문제 상황

 

운영팀에서 Pod 간 내부 통신을 안전하게 관리하기 위해 서비스(ClusterIP)를 설정해야 합니다.

서비스를 통해 고정된 IP 또는 DNS 이름을 제공하여 내부 애플리케이션이 안정적으로 통신할 수 있어야 합니다.

Deployment의 이름은 web-clusterip이어야 합니다.

서비스 이름은 web-service이어야 하며, ClusterIP를 사용하여 내부에서만 접근 가능해야 합니다.

내부에서 web-service.default.svc.cluster.local 도메인으로 접속할 수 있어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. ClusterIP 타입의 Service를 생성하여 내부 Pod 간 통신을 지원해야 합니다.

type: ClusterIP를 설정하여 내부 네트워크에서만 접근 가능하도록 구성

2. Service의 selector를 사용하여 특정 레이블을 가진 Pod을 대상으로 트래픽을 전달해야 합니다.

app: web 레이블을 가진 Pod만 서비스에서 관리

 


✅ 정답 Manifest (ClusterIP 서비스 적용된 Deployment & Service)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-clusterip  # Deployment의 이름
spec:
  replicas: 2  # 실행할 Pod 개수
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:latest  # 웹 애플리케이션 컨테이너
        ports:
        - containerPort: 80  # 컨테이너 내부 포트

---

apiVersion: v1
kind: Service
metadata:
  name: web-service  # ClusterIP 서비스 이름
spec:
  selector:
    app: web  # 레이블이 일치하는 Pod 대상으로 트래픽 전달
  ports:
  - protocol: TCP
    port: 80  # 서비스가 제공하는 포트
    targetPort: 80  # Pod 내부 컨테이너 포트
  type: ClusterIP  # 내부 네트워크에서만 접근 가능

 

 


📌 적용 후 예상 결과 값

 

1. Service 생성 확인

kubectl get svc

 

💡 예상 출력 값

NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
web-service   ClusterIP   10.100.200.1    <none>        80/TCP    5s

 

2. 내부에서 서비스 접근 테스트

kubectl exec -it  -- curl http://web-service.default.svc.cluster.local

 

💡 예상 출력 값

<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title></head>
<body>
<h1>Welcome to nginx!</h1>
</body>
</html>

 

 


2️⃣ NodePort 서비스를 이용한 외부 접근

 

❓ 문제 상황

 

운영팀에서 쿠버네티스 클러스터 외부에서 직접 웹 애플리케이션에 접근할 수 있도록 구성해야 합니다.

이를 위해 NodePort 서비스를 활용하여 외부에서 특정 포트를 통해 애플리케이션에 접속할 수 있도록 설정해야 합니다.

Deployment의 이름은 web-nodeport이어야 합니다.

서비스 이름은 web-nodeport-service이어야 하며, NodePort를 사용하여 외부에서 접근 가능해야 합니다.

외부에서 <노드 IP>:30080으로 접근할 수 있어야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. NodePort 타입의 Service를 생성하여 외부 접근을 허용해야 합니다.

type: NodePort를 설정하여 노드의 특정 포트를 통해 접근 가능하도록 설정

2. Service의 nodePort 값을 지정하여 외부에서 특정 포트로 접속할 수 있도록 구성해야 합니다.

30000~32767 범위의 포트를 사용하여 외부 노드에서 접근 가능

 


✅ 정답 Manifest (NodePort 서비스 적용된 Deployment & Service)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-nodeport  # Deployment의 이름
spec:
  replicas: 2  # 실행할 Pod 개수
  selector:
    matchLabels:
      app: web-nodeport
  template:
    metadata:
      labels:
        app: web-nodeport
    spec:
      containers:
      - name: nginx
        image: nginx:latest  # 웹 애플리케이션 컨테이너
        ports:
        - containerPort: 80  # 컨테이너 내부 포트

---

apiVersion: v1
kind: Service
metadata:
  name: web-nodeport-service  # NodePort 서비스 이름
spec:
  selector:
    app: web-nodeport  # 레이블이 일치하는 Pod 대상으로 트래픽 전달
  ports:
  - protocol: TCP
    port: 80  # 클러스터 내부 서비스 포트
    targetPort: 80  # Pod 내부 컨테이너 포트
    nodePort: 30080  # 외부에서 접근 가능한 포트
  type: NodePort  # 외부에서 접근 가능하도록 설정

 

 


📌 적용 후 예상 결과 값

1. Service 생성 확인

kubectl get svc

 

💡 예상 출력 값

NAME                  TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
web-nodeport-service  NodePort   10.100.200.2     <none>        80:30080/TCP     5s

 

2. 외부에서 서비스 접근 테스트

curl http://<노드 IP>:30080

 

💡 예상 출력 값

<!DOCTYPE html>
<html>
<head><title>Welcome to nginx!</title></head>
<body>
<h1>Welcome to nginx!</h1>
</body>
</html>

 

728x90