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

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
1️⃣ ClusterIP를 통한 직접 접근 테스트
kubectl run test-pod --image=busybox --restart=Never -- sleep 3600
kubectl exec -it test-pod -- wget -qO- http://10.97.67.52
✅ 정상 동작 시:
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 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