ClusterIP는 쿠버네티스에서 기본적으로 제공하는 서비스 유형으로, 클러스터 내부에서만 접근 가능한 고정된 IP를 제공한다. 이 실습을 통해 ClusterIP의 동작 방식을 확인하고, 서비스 생성 및 네트워크 접근 방법을 테스트해볼 것이다.


1. ClusterIP의 개념

✅ ClusterIP란?

  • 클러스터 내부에서만 접근 가능한 서비스 유형
  • 고정된 가상 IP를 제공하여 Pod의 동적 IP 변경 문제 해결
  • 같은 Label을 가진 여러 Pod에 트래픽을 분산하여 로드밸런싱 수행

🛠 실습 목표

  1. ClusterIP 서비스가 생성되면 고정된 내부 IP가 부여되는지 확인
  2. ClusterIP를 통해 Pod 간 통신이 가능한지 테스트
  3. ClusterIP가 DNS를 통해 서비스 이름으로 접근할 수 있도록 지원하는지 검증
  4. Pod이 삭제 및 재배포되어도 ClusterIP가 유지되는지 확인
  5. Nginx의 응답을 변경하여 어떤 Pod이 응답하는지 확인

2. ClusterIP 서비스 생성

📌 Deployment 및 Service 파일 생성

1️⃣ Nginx Deployment 생성
먼저 nginx를 실행하는 Deployment를 생성한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

적용 후 확인:

kubectl apply -f deployment.yaml
kubectl get pods -l app=nginx -o wide

2️⃣ ClusterIP 서비스 생성

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

적용 후 서비스 확인:

kubectl apply -f service.yaml
kubectl get svc nginx-service -o wide

예상 출력:

NAME            TYPE        CLUSTER-IP      PORT(S)        AGE
nginx-service   ClusterIP   10.97.67.52    80/TCP         1m

3. 서비스 접근 테스트

1️⃣ ClusterIP를 통한 직접 접근 테스트

kubectl run test-pod --image=busybox --restart=Never -- sleep 3600
kubectl exec -it test-pod -- wget -qO- http://10.97.67.52

정상 동작 시:

  • 기본 Nginx 페이지가 출력되면 서비스가 정상 동작함을 의미.

2️⃣ 응답하는 Pod을 식별하기 위한 설정 변경
각 Nginx Pod에 직접 접속하여 index.html을 수정한다.

POD_NAME=$(kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it $POD_NAME -- sh -c "echo '<html><body><h1>Pod: '$(hostname)'</h1></body></html>' > /usr/share/nginx/html/index.html"

이제 다시 test-pod에서 요청을 보내면 응답하는 Pod을 확인할 수 있다.

kubectl exec -it test-pod -- wget -qO- http://10.97.67.52

예상 결과:

<html><body><h1>Pod: nginx-deployment-xxxxx</h1></body></html>

3️⃣ 여러 번 요청하여 로드밸런싱 테스트

kubectl exec -it test-pod -- sh -c "for i in {1..5}; do wget -qO- http://10.97.67.52; sleep 1; done"

예상 결과:

<h1>Pod: nginx-deployment-xxxxx</h1>
<h1>Pod: nginx-deployment-yyyyy</h1>
<h1>Pod: nginx-deployment-zzzzz</h1>
  • 여러 번 요청을 보냈을 때 서로 다른 Pod이 응답하는지 확인.

4. Pod 삭제 후 서비스 유지 확인

기존 Pod IP 확인

kubectl get pods -o wide

특정 Pod 삭제

kubectl delete pod <POD_NAME>

새로운 Pod 생성 후 서비스 확인

kubectl get pods -o wide
kubectl get endpoints nginx-service
kubectl exec -it test-pod -- wget -qO- http://10.97.67.52
  • Pod이 삭제 및 재배포되어도 ClusterIP가 유지되며, 서비스가 지속적으로 동작한다.

0개의 댓글