🛠️ 쿠버네티스 서비스 실습용 YAML 템플릿
📋 메타데이터
- 용도: 서비스 타입별 실습용 리소스 정의
- 테스트 완료: ✅ minikube v1.37.0, k8s v1.34.0
- 관련 문서: 04_01_쿠버네티스_서비스_실습_결과_보고서
🌐 ExternalName 서비스
1. MySQL 외부 서비스 (예시용)
# external-mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-external
namespace: default
spec:
type: ExternalName
externalName: db.example.com
ports:
- port: 3306
targetPort: 3306
protocol: TCP2. GitHub API 외부 서비스 (실제 도메인)
# external-github-service.yaml
apiVersion: v1
kind: Service
metadata:
name: github-api-external
namespace: default
spec:
type: ExternalName
externalName: api.github.com
ports:
- port: 443
targetPort: 443
protocol: TCP🏠 ClusterIP 서비스
1. 백엔드 애플리케이션 배포
# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-app
labels:
app: backend
spec:
replicas: 3
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: nginx:alpine
ports:
- containerPort: 80
env:
- name: SERVER_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name2. ClusterIP 서비스
# backend-clusterip-service.yaml
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
type: ClusterIP # 기본값이므로 생략 가능
selector:
app: backend
ports:
- name: http
port: 8080 # 서비스 포트
targetPort: 80 # 컨테이너 포트
protocol: TCP👻 Headless 서비스
1. Headless 서비스 정의
# mongodb-headless-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mongodb-headless
labels:
app: mongodb
spec:
clusterIP: None # Headless 서비스의 핵심
selector:
app: mongodb
ports:
- name: mongodb
port: 27017
targetPort: 270172. StatefulSet 배포
# mongodb-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb
spec:
serviceName: mongodb-headless # Headless 서비스와 연결
replicas: 3
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo:5.0
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: "admin"
- name: MONGO_INITDB_ROOT_PASSWORD
value: "password"3. 비교용 ClusterIP 서비스
# mongodb-clusterip-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mongodb-clusterip
spec:
type: ClusterIP
selector:
app: mongodb
ports:
- name: mongodb
port: 27017
targetPort: 27017🧪 테스트용 파드
1. 기본 테스트 파드 (busybox)
kubectl run test-pod --image=busybox --restart=Never -- sleep 36002. curl 테스트 파드 (일회성)
kubectl run test-client --image=curlimages/curl --restart=Never -it --rm -- sh3. DNS 테스트 전용 파드
kubectl run dns-test --image=busybox --restart=Never -- sleep 3600📋 실습 명령어 모음
기본 확인 명령어
# 클러스터 정보
kubectl cluster-info
kubectl get nodes
# 서비스 목록
kubectl get svc
kubectl get svc -o wide
# 파드 상태
kubectl get pods -l app=<label>
kubectl get pods -o wide
# 엔드포인트 확인
kubectl get endpoints <service-name>
# 서비스 상세 정보
kubectl describe svc <service-name>DNS 테스트 명령어
# 기본 DNS 조회
kubectl exec <pod> -- nslookup <service-name>
# FQDN DNS 조회
kubectl exec <pod> -- nslookup <service>.default.svc.cluster.local
# 개별 파드 DNS 조회 (Headless)
kubectl exec <pod> -- nslookup <pod-name>.<service>.default.svc.cluster.local연결 테스트 명령어
# HTTP 테스트
kubectl exec <pod> -- curl <service>:<port>
# 포트 연결 테스트
kubectl exec <pod> -- telnet <service> <port>
# ping 테스트
kubectl exec <pod> -- ping <service>포트 포워딩
# 서비스 포트 포워딩
kubectl port-forward svc/<service-name> <local-port>:<service-port>
# 파드 포트 포워딩
kubectl port-forward pod/<pod-name> <local-port>:<pod-port>🔧 트러블슈팅 명령어
DNS 관련 이슈
# CoreDNS 상태 확인
kubectl get pods -n kube-system -l k8s-app=kube-dns
# DNS 설정 확인
kubectl get configmap coredns -n kube-system -o yaml
# 파드 내 DNS 설정 확인
kubectl exec <pod> -- cat /etc/resolv.conf서비스 연결 이슈
# 엔드포인트 확인
kubectl get endpoints <service-name>
# 라벨 셀렉터 확인
kubectl describe svc <service-name>
kubectl get pods --show-labels
# 네트워크 정책 확인
kubectl get networkpoliciesStatefulSet 이슈
# StatefulSet 상태
kubectl get statefulset
kubectl describe statefulset <name>
# PVC 상태 확인
kubectl get pvc
# 파드 이벤트 확인
kubectl describe pod <pod-name>🧹 환경 정리 스크립트
개별 리소스 정리
# 테스트 파드 정리
kubectl delete pod test-pod dns-test test-client --ignore-not-found=true
# 서비스 정리
kubectl delete svc mysql-external github-api-external backend-service mongodb-headless mongodb-clusterip
# 배포 정리
kubectl delete deployment backend-app
kubectl delete statefulset mongodb
# PVC 정리 (주의: 데이터 손실)
kubectl delete pvc -l app=mongodb전체 정리 (네임스페이스 기준)
# 현재 네임스페이스 모든 리소스 정리 (주의!)
kubectl delete all --all
# 특정 라벨의 리소스만 정리
kubectl delete all -l app=<label>💡 실습 팁
1. 파드 상태 대기
# 파드 준비 상태 대기
kubectl wait --for=condition=ready pod/<pod-name> --timeout=60s
kubectl wait --for=condition=ready pod -l app=<label> --timeout=60s2. 리소스 감시
# 실시간 상태 감시
kubectl get pods --watch
kubectl get svc --watch
# 이벤트 확인
kubectl get events --sort-by='.lastTimestamp'3. 로그 확인
# 파드 로그 확인
kubectl logs <pod-name>
kubectl logs -f <pod-name> # 실시간
# 이전 컨테이너 로그 (재시작된 경우)
kubectl logs <pod-name> --previous📚 추가 학습 리소스
YAML 템플릿 확장
고급 설정
🏷️ 태그: kubernetes yaml template service 실습
🔗 관련: K8s_Deep_Dive > k8s실습
📅 작성일: 2025.11.13