쿠버네티스에서 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>