🛠️ 쿠버네티스 서비스 실습용 YAML 템플릿

📋 메타데이터


🌐 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: TCP

2. 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.name

2. 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: 27017

2. 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 3600

2. curl 테스트 파드 (일회성)

kubectl run test-client --image=curlimages/curl --restart=Never -it --rm -- sh

3. 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 networkpolicies

StatefulSet 이슈

# 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=60s

2. 리소스 감시

# 실시간 상태 감시
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