kubectl expose 명령어 상세 가이드

1. 기본 개념

kubectl expose는 Pod, Deployment, ReplicaSet, Service 등의 쿠버네티스 리소스를 외부에 노출시키는 명령어입니다.

2. 기본 문법

kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]

3. 주요 옵션

  • --port: 서비스가 노출할 포트
  • --target-port: 실제 애플리케이션이 실행되는 컨테이너 포트
  • --type: 서비스 타입 (ClusterIP, NodePort, LoadBalancer)
  • --name: 생성될 서비스의 이름
  • --protocol: 사용할 프로토콜 (TCP, UDP, SCTP)
  • --external-ip: 외부 IP 지정

4. 서비스 타입별 예제

4.1 ClusterIP 서비스 생성

# nginx 디플로이먼트 생성
kubectl create deployment nginx --image=nginx

# ClusterIP 서비스로 노출
kubectl expose deployment nginx --port=80 --target-port=80 --type=ClusterIP

# 생성된 서비스 확인
kubectl get svc nginx

4.2 NodePort 서비스 생성

# NodePort로 노출
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

# 생성된 서비스 확인 (30000-32767 범위의 포트가 자동 할당됨)
kubectl get svc nginx

4.3 LoadBalancer 서비스 생성

# LoadBalancer로 노출
kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer

# 생성된 서비스 확인
kubectl get svc nginx

5. 실제 사용 예제

5.1 여러 포트 노출

# multi-port-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:latest
        ports:
        - containerPort: 8080
        - containerPort: 8443
# 여러 포트를 가진 서비스 생성
kubectl expose deployment my-app --name=my-app-svc \
  --port=80,443 \
  --target-port=8080,8443 \
  --type=LoadBalancer

5.2 특정 레이블을 가진 Pod 노출

# 레이블을 지정하여 서비스 생성
kubectl expose pod my-pod --selector="app=my-app" --port=8080 --target-port=80

5.3 외부 IP를 지정한 서비스 생성

kubectl expose deployment nginx \
  --port=80 \
  --target-port=80 \
  --external-ip=203.0.113.10 \
  --type=LoadBalancer

6. 고급 사용 예제

6.1 세션 어피니티 설정

kubectl expose deployment nginx \
  --port=80 \
  --session-affinity=ClientIP \
  --type=LoadBalancer

6.2 커스텀 셀렉터 사용

kubectl expose deployment nginx \
  --port=80 \
  --selector='app=nginx,environment=prod' \
  --type=LoadBalancer

6.3 다중 프로토콜 서비스

# multi-protocol-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    port: 80
    targetPort: 8080
    protocol: TCP
  - name: udp
    port: 161
    targetPort: 161
    protocol: UDP
  type: LoadBalancer

7. 서비스 확인 및 디버깅

# 서비스 상세 정보 확인
kubectl describe service nginx

# 엔드포인트 확인
kubectl get endpoints nginx

# 서비스 연결 테스트
kubectl run test-pod --image=busybox -it --rm -- wget -qO- http://nginx

# 서비스 로그 확인
kubectl logs -l app=nginx

8. 주의사항

  1. LoadBalancer 타입은 클라우드 프로바이더가 지원하는 환경에서만 사용 가능
  2. NodePort는 보안상 프로덕션 환경에서는 권장되지 않음
  3. 외부 IP 지정은 클러스터 네트워크 정책에 따라 제한될 수 있음
  4. 포트 충돌에 주의 필요

'IT > kubernetes[k8s]' 카테고리의 다른 글

POD 실습 50 문제  (2) 2024.11.17
Kubernetes emptyDir 가이드  (1) 2024.11.16
Kubernetes PV와 PVC 개요  (0) 2024.11.16
Kubernetes Pod 개요  (2) 2024.11.16
쿠버네티스(Kubernetes)란?  (2) 2024.11.15

+ Recent posts