2026. 6. 13. 14:08ㆍKubernetes
Ⅰ. Service (서비스)
| Service (서비스) |
구분 | 설명 | ||
| 개념 | Pod는 Controller에 의해 동적으로 생성되기 때문에 Pod의 IP가 바뀌어도 항상 동일한 방식으로 접근할 수 있게 해주는 네트워크 추상화 리소스 |
|||
| 역할 | 클러스터 내부 및 외부에서 Pod로의 안정적인 접근 가능 | |||
| 필요성 | Pod의 IP는 변경될 수 있어 직접 접근이 어렵기 때문에 Service가 고정 IP (ClusterIP)와 가상 포트를 제공하여 안정적인 통신 지원 |
|||
| 구성 원리 | 동일한 Label을 가진 Pod 그룹을 묶어 하나의 단일 엔드포인트로 접근 가능 | |||
| 내부적으로 kube-proxy가 Pod IP와 Service IP를 매핑하여 트래픽 라우팅 | ||||
| 특징 | 클러스터 내부 및 외부 연결 모두 가능 | |||
| Service 생성 시 고정 IP 할당 | ||||
| Service는 Pod가 재시작되어도 동일한 이름과 주소 유지 | ||||
| Service 타입 | 타입 | 설명 | 접근 가능 범위 | |
| ClusterIP (기본값) | 클러스터 내부 전용 IP로 Pod에 접근 가능 | 내부 전용 | ||
| NodePort | 각 노드의 포트를 통해 외부 접근 허용 (30000 ~ 32767 범위) |
외부 접근 가능 | ||
| LoadBalancer | 클라우드 환경에서 외부 로드밸런서를 생성하여 외부 트래픽 분산 |
외부 접근 가능 | ||
| ExternalName | 외부 DNS 이름으로 트래픽 전달 (CNAME 역할) | 외부 서비스 연동 | ||
| 추천 구성 | Deployment와 Service를 하나의 YAML 파일 (--- 구분)로 작성하여 함께 배포하는 것이 일반적 | |||
| 동작 예시 | 클러스터 내부에서 ClusterIP를 통해 통신 | |||
| 외부 접근 시 NodePort, LoadBalancer 사용 | ||||
| 명령어 예시 | ex) bash kubectl expose deployment webserver --type=NodePort --port=80 | |||
Ⅰ - Ⅰ. Service Type별 구조도 및 동작 방식
| 타입 | 내부 구조 및 동작 | 주요 특징 | 사용 예시 |
| ClusterIP (기본값) |
클러스터 내부 전용 IP를 생성하여 Pod 그룹에 트래픽 라우팅 |
기본 Service 타입 | 마이크로서비스 간 내부 API 통신 |
| 외부 접근 불가 (클러스터 내부 통신 전용) |
|||
| Pod IP 변경에도 동일한 Service IP로 접근 가능 |
내부 DB 접근 | ||
NodePort |
각 노드의 고정 포트 (3000 ~ 32767)를 개방하여 외부에서 노드 IP + 포트로 접근 가능 |
ClusterIP 기반 위에 동작 | 로컬 환경 테스트용 외부 접근 |
| 모든 노드의 동일한 포트로 접근 가능 | |||
| 방화벽, 보안 그룹 설정 필요 | 온프레미스 서비스 노출 | ||
LoadBalancer |
클라우드 공급자 (GCP, AWS 등)의 외부 로드밸런서를 자동으로 생성하여 NodePort로 트래픽 전달 |
NodePort + ClustserIP 구조 포함 | 클라우드 기반 웹 서비스 배포 |
| 클라우드 기반 서비스에 적합 | 외부 유저 접근 서비스 | ||
| 공인 IP 자동 할당 | |||
| ExternalName | CNAME 형태로 외부 DNS 주소로 트래픽 전달 |
외부 DNS로 요청 리다이렉트 | 외부 API 또는 외부 DB 연동 (ex. mysql.example.com) |
| 실제 프록시 없이 DNS 레벨에서 동작 |

# testpod 리소스 생성 (Pod)
kubectl run testpod —image=nginx 명령을 통해 Nginx 이미지 사용하여 testpod 리소스 생성 및 실행
--port=80 옵션을 통해 testpod 리소스를 80번 포트에 매핑
kubectl get pod –o wide 명령을 통해 리소스가 잘 생성되었는지 확인
# testpod 리소스 삭제
kubectl delete pod testpod 명령을 통해 testpod 삭제

cd kubespray/inventory/mycluster/group_vars/k8s_cluster/ 명령을 통해
홈 디렉터리에서 k8s_cluster 디렉터리로 이동
ls –l 명령을 통해 해당 디렉터리 내 파일 목록 상세히 확인

ip address show kube-ipvs0 명령을 통해 Kubernetes 클러스터가 kube-proxy IPVS 모드로 작동 중일 때,
내부 가상 인터페이스인 kube-ipvs0의 IP 정보 확인
kubectl get svc –A 명령을 통해 클러스터 내 모든 네임스페이스의 Service 목록 조회
Ⅱ. ClusterIP
| ClusterIP | 구분 | 설명 |
| 개념 | 동일한 Label을 갖는 Pod 그룹에 대해 단일 진입점 (가상 IP 주소, Virtual IP)을 제공하는 기본 Service 타입 |
|
| 역할 | 클러스터 내부에서 Pod 간 통신을 안정적으로 수행할 수 있도록 고정된 내부 IP 주소 부여 | |
| 특징 | Service의 기본 동작 방식 (별도 설정이 없을 경우, ClusterIP로 생성됨) | |
| 클러스터 외부에서는 접근 불가 (내부 전용 통신용) | ||
| IP 주소는 10.233.0.0 ~ 10.233.63.255 대역 내에서 자동 할당 | ||
| 구조 | kube-proxy가 IPVS 또는 iptables 규칙을 사용해 요청을 해당 Pod의 Endpoints로 라우팅 | |
| 장점 | Pod IP 변경에도 안정적인 통신 유지 | |
| 서비스 디스커버리 (DNS 기반)와 함께 사용 시 효율적 | ||
| 단점 | 외부 접근이 불가능하므로 외부 서비스 노출 시 NodePort나 LoadBalancer 필요 | |
| 명령어 예시 | ex) bash kubectl expose deployment web --type=ClusterIP --port=80 | |
| 사용 예시 | 내부 마이크로서비스 간 통신 (ex. frontend가 backend API 호출 시) |

cd kube/08/ 명령을 통해 홈 디렉터리에서 kube/08 디렉터리로 이동
ls 명령을 통해 해당 디렉터리 내 파일 목록 확인
cd clusterip/ 명령을 통해 kube/08 디렉터리에서 clusterip 디렉터리로 이동
kubectl api-resources 명령을 통해 쿠버네티스 클러스터 내에서 사용 가능한 리소스 타입 목록 확인

vi cluster-id.yml 명령을 통해 vi 편집기 사용하여 cluster-id.yml 파일 생성 및 내용 입력
cat cluster-id.yml 명령을 통해 cluster-id.yml 파일의 내용 확인
[ cluster-id.yml 파일의 내용 ]
apiVersion: v1 명령을 통해 리소스 API 버전을 v1로 설정
kind: Service 명령을 통해 리소스의 종류를 Service로 지정
metadata.name; nginx-clusterip 명령을 통해 리소스 이름을 nginx-clusterip로 설정
spec.selector.app: webui 명령을 통해 클러스터 내부 DNS로
nginx-clusterip.default.svc.cluster.local처럼 접근하도록 설정
spec.ports.protocol: TCP 명령을 통해 전송 프로토콜을 TCP로 지정
spec.ports.port: 80 명령을 통해 클러스터 내부에서 서비스가 노출되는 포드로 80번 포트 지정
spec.ports.targetPort: 80 명령을 통해 Service가 트래픽을 전달하는 대상 포트를 80번 포트로 지정

# nginx-clusterip 리소스 생성 (Service)
kubectl create –f cluster-id.yml 명령을 통해 cluster-id.yml 파일 사용하여 nginx-clusterip 리소스 생성
kubectl get svc –o wide 명령을 통해 현재 클러스터에 존재하는 Service 목록 확인
# cluster-id.yml 파일과 그와 관련된 리소스 등 모두 삭제
kubectl delete –f cluster-id.yml 명령을 통해 cluster-id.yml 파일과 그와 관련된 리소스 등 모두 삭제

# nginx-clusterip 리소스 생성 (Service)
kubectl create –f cluster-id.yml 명령을 통해 cluster-id.yml 파일 이용하여 nginx-clusterip 리소스 생성
kubectl get svc –o wide 명령을 통해 nginx-clusterip 리소스가 잘 생성되었는지 확인
kubectl describe svc nginx-clusterip 명령을 통해 nginx-clusterip 리소스 상세 정보 확인

# nginx-clusterip 리소스와 그와 관련된 것 모두 삭제
kubectl delete svc nginx-clusterip 명령을 통해 nginx-clusterip와 그와 관련된 것 모두 삭제
kubectl get svc –o wide 명령을 통해 잘 삭제되었는지 확인

vi nginx-deploy.yml 명령을 통해 vi 편집기 사용하여 nginx-deploy.yml 파일 생성 및 내용 입력
cat nginx-deploy.yml 명령을 통해 입력한 파일 내용 확인
[ nginx-deploy.yml 파일의 내용 ]
apiVersion: apps/v1 명령을 통해 API apps/v1 버전 사용하도록 지정
kind: Deployment 명령을 통해 리소스 종류를 Deployment로 설정
metadata.name: nginx-deploy 명령을 통해 Deployment의 이름을 nginx-deploy로 설정
spec.replicas: 3 명령을 통해 Pod를 3개 복제해서 실행하도록 지정
spec.selector.matchLabels.app: webui 명령을 통해 app=webui 라벨을 가진 Pod를 관리하도록 설정
spec.template.metadata.name: nginx-pod 명령을 통해 Pod의 이름을 nginx-pod로 설정
spec.template.metadata.labels.app: webui 명령을 통해 Pod에 app=webui 라벨 부여
spec.spec.containers.name: nginx-container 명령을 통해 컨테이너 이름을 nginx-container로 지정
spec.spec.containers.image: nginx:1.14 명령을 통해 사용할 Docker 이미지를 Nginx 1.14로 지정

kubectl get pod –o wide 명령을 통해 현재 네임스페이스의 모든 파드를 자세히 확인
curl http://172.16.135.45 명령을 통해 master 노드에서
각 Pod 내부 IP에 직접 HTTP 요청을 보내 Nginx 페이지 확인

vi nginx-clusterip.yml 명령을 통해 vi 편집기 사용하여 nginx-clusterip.yml 파일 생성 및 내용 입력
cat nginx-clusterip.yml 명령을 통해 nginx-clusterip.yml 파일의 내용 확인
[ nginx-clusterip.yml 파일의 내용 ]
apiVersion: v1 명령을 통해 리소스 API 버전을 v1로 설정
kind: Service 명령을 통해 리소스의 종류를 Service로 지정
metadata.name; nginx-clusterip 명령을 통해 리소스 이름을 nginx-clusterip로 설정
spec.type: ClusterIP 명령을 통해 type을 ClusterIP로 설정
spec.clusterIP: 10.233.10.10 명령을 통해 ClusterIP를 10.233.10.10로 설정
spec.selector.app: webui 명령을 통해 클러스터 내부 DNS로
nginx-clusterip.default.svc.cluster.local처럼 접근하도록 설정
spec.ports.protocol: TCP 명령을 통해 전송 프로토콜을 TCP로 지정
spec.ports.port: 80 명령을 통해 클러스터 내부에서 서비스가 노출되는 포드로 80번 포트 지정
spec.ports.targetPort: 80 명령을 통해 Service가 트래픽을 전달하는 대상 포트를 80번 포트로 지정

kubectl get pod —show-labels 명령을 통해 파드 목록을 라벨까지 출력하여
Deployment와 Service의 Selector 매칭 관계 확인
kubectl get svc,pod,ep –o wide 명령을 통해 Service, Pod, Endpoint의 상세 정보 확인

kubectl describe svc nginx-clusterip 명령을 통해 nginx-clusterip 리소스의 상세 정보 확인

# nginx-deploy 리소스 개수 확장
kubectl scale deployment nginx-deploy —replicas 5 명령을 통해 리소스의 개수를 3개에서 5개로 확장
kubectl get svc,pod,ep –o wide 명령을 통해 잘 확장되었는지 확인

# nginx-deploy 리소스 개수 축소
kubectl scale deployment nginx-deploy —replicas 3 명령을 통해 리소스의 개수를 5개에서 3개로 축소
kubectl get svc,pod,ep –o wide 명령을 통해 잘 축소되었는지 확인

# nginx-clusterip 리소스와 그와 관련된 것 모두 삭제
kubectl delete svc nginx-clusterip 명령을 통해 nginx-clusterip 리소스와 그와 관련된 것 함께 삭제
kubectl get svc,pod,ep –o wide 명령을 통해 잘 삭제되었는지 확인
Ⅲ. NodePort
| NodePort | 구분 | 설명 |
| 개념 | Kubernetes Service의 한 종류 | |
| 모든 노드에 동일한 외부 접근 포트 (NodePort)를 예약하여 클러스터 외부에서 접근할 수 있게 해주는 서비스 |
||
| 역할 | 클러스터 외부 클라이언트가 노드의 IP와 NodePort 번호를 이용해 Pod에 직접 접근할 수 있도록 연결 경로 제공 |
|
| 특징 | ClusterIP 기반으로 동작 | |
| 내부 통신은 ClusterIP를 통해 유지 | ||
| 외부에서는 노드 IP : NodePort 형식으로 접근 가능 | ||
| 모든 노드에서 동일한 포트를 개방하여 트래픽 분산 처리 | ||
| 외부 요청은 kube-proxy가 적절한 Pod로 라우팅 | ||
| 기본 포트 범위 | 30000 ~ 32767 (kube-apiserver 설정에서 변경 가능) | |
| 포트 할당 시점 | ClustserIP가 생성된 이후 자동으로 NodePort가 할당됨 | |
| 장점 | 별도 로드밸런서 없이 외부 접근 가능 | |
| 개발 및 테스트 환경에서 유용 | ||
| 클라우드 외 환경 (On-premise)에서도 사용 가능 | ||
| 단점 | 포트 중복 방지 필요 | |
| 고정 포트 범위로 인해 보안상 노출 가능성 | ||
| 대규모 트래픽 분산에는 부적합 | ||
| 사용 예시 | 내부 테스트용 웹서버 노출 | |
| 개발 환경에서의 Pod 직접 접근 확인 | ||
| 명령어 예시 | ex) bash kubectl expose deployment webserver --type=NodePort --port=80 | |
| 접근 예시 | ex) bash curl http://<Node_IP> : <할당된_NodePort> |

cd ../nodeport/ 명령을 통해 clusterip 디렉터리에서 nodeport 디렉터리로 이동
vi nginx-nodeport.yml 명령을 통해 vi 편집기 사용하여 nginx-nodeport.yml 파일 생성 및 내용 입력
cat nginx-nodeport.yml 명령을 통해 nginx-nodeport.yml 파일의 내용 확인
[ nginx-nodeport.yml 파일의 내용 ]
apiVersion: v1 명령을 통해 리소스 API 버전을 v1로 설정
kind: Service 명령을 통해 리소스의 종류를 Service로 지정
metadata.name; nginx-nodeport 명령을 통해 리소스 이름을 nginx-nodeport로 설정
spec.type: NodePort 명령을 통해 type을 NodePort로 설정
spec.clusterIP: 10.96.13.200 명령을 통해 ClusterIP를 10.96.13.200으로 설정
spec.selector.app: webui 명령을 통해 클러스터 내부 DNS로
nginx-clusterip.default.svc.cluster.local처럼 접근하도록 설정
spec.ports.protocol: TCP 명령을 통해 전송 프로토콜을 TCP로 지정
spec.ports.port: 80 명령을 통해 클러스터 내부에서 서비스가 노출되는 포드로 80번 포트 지정
spec.ports.targetPort: 80 명령을 통해 Service가 트래픽을 전달하는 대상 포트를 80번 포트로 지정
spec.ports.nodePort: 32080 명령을 통해 클러스터 외부에서도 접근 가능한 nodeport를 32080번으로 지정

# nginx-nodeport 리소스 생성 (Service)
kubectl create –f nginx-nodeport.yml 명령을 통해
nginx-nodeport.yml 파일 이용하여 nginx-nodeport 리소스 생성
kubectl get svc,pod,ep –o wide 명령을 통해 잘 생성되었는지 확인

nmap –p 30200 IP address 명령을 통해 NodePort 포트가 실제로 열려 있는지 확인

# nginx-nodeport 리소스와 그와 관련된 것 모두 삭제
kubectl delete svc nginx-nodeport 명령을 통해 nginx-nodeport 리소스와 그와 관련된 것 모두 삭제
kubectl get svc,pod,ep –o wide 명령을 통해 잘 삭제되었는지 확인
Ⅳ. LoadBalancer
| LoadBalancer | 구분 | 설명 |
| 개념 | 클라우드 환경 (AWS, Azure, GCP 등)에서 외부 로드 밸런서를 자동 생성하여 트래픽을 분산 처리하고, 서비스를 외부에 노출시키는 Kubernetes 서비스 타입 |
|
| 역할 | 클러스터 외부에서 접근 가능한 공인 IP (Public IP)를 자동 할당 | |
| 외부 요청을 LoadBalancer -> NodePort -> ClusterIP -> Pod 순으로 전달 | ||
| 사용자는 클라우드 로드밸런서를 통해 외부 트래픽을 안정적으로 수신 | ||
| 특징 | NodePort, ClusterIP 서비스를 자동으로 함께 생성 | |
| 클라우드 공급자의 인프라와 연동되어 로드밸런서를 자동 프로비저닝 ( 프로비저닝 = 사용자가 요청한 IT 자원을 사용할 수 있는 상태로 준비하는 것) |
||
| 온프레미스 환경에서는 직접 설정 (ex. MetalLB 등) 필요 | ||
| 외부 트래픽을 내부 Pod로 안전하게 분산 | ||
| 지원 환경 | 퍼블릭 클라우드 (AWS ELB, Azure Load Balancer, GCP Load Balancing 등) 온프레미스 환경에서는 MetalLB, OpenELB 등 별도 구성 필요 |
|
| 접근 방식 | 클라우드가 할당한 외부 IP 주소로 접근 가능 | |
| ex) http://<External-IP> : <Port> | ||
| 장점 | 외부에서 직접 접근 가능한 공인 IP 제공 | |
| 트래픽 부하 분산 및 자동 Failover 지원 | ||
| 서비스 안정성, 확장성 우수 | ||
| 단점 | 클라우드 의존적 (온프레미스 환경에서는 기본 미지원) | |
| 사용 시 비용 발생 (클라우드 로드밸런서 과금) | ||
| 명령어 예시 | ex)bash kubectl expose deployment webapp -type=LoadBalancer --port=80 --target-port=8080 | |
| 사용 예시 | 클라우드 환경에서 외부 사용자에게 공개되는 웹 서비스 배포 (ex. 프론트엔드 서비스) |

cd ../loadbalancer/ 명령을 통해 nodeport 디렉터리에서 loadbalancer 디렉터리로 이동
vi nginx-loadbalancer.yml 명령을 통해 vi 편집기 사용하여 nginx-loadbalancer.yml 파일 생성 및 내용 입력
cat nginx-loadbalancer.yml 명령을 통해 nginx-loadbalancer.yml 파일의 내용 확인
[ nginx-loadbalancer.yml 파일의 내용 ]
apiVersion: v1 명령을 통해 리소스 API 버전을 v1로 설정
kind: Service 명령을 통해 리소스의 종류를 Service로 지정
metadata.name: nginx-loadbalancer 명령을 통해 리소스 이름을 nginx-loadbalancer로 설정
spec.type: LoadBalancer 명령을 통해 type을 LoadBalancer로 설정
spec.clusterIP: 10.96.13.200 명령을 통해 ClusterIP를 10.96.13.200으로 설정
spec.selector.app: webui 명령을 통해 클러스터 내부 DNS로
nginx-clusterip.default.svc.cluster.local처럼 접근하도록 설정
spec.ports.protocol: TCP 명령을 통해 전송 프로토콜을 TCP로 지정
spec.ports.port: 80 명령을 통해 클러스터 내부에서 서비스가 노출되는 포드로 80번 포트 지정
spec.ports.targetPort: 80 명령을 통해 Service가 트래픽을 전달하는 대상 포트를 80번 포트로 지정
spec.ports.nodePort: 30000 명령을 통해 클러스터 외부에서도 접근 가능한 nodeport를 30000번으로 지정

# nginx-loadbalancer 리소스 생성 (Service)
kubectl create –f nginx-loadbalancer.yml 명령을 통해
nginx-loadbalancer.yml 파일 이용하여 nginx-loadbalancer 리소스 생성
kubectl get svc,pod,ep –o wide 명령을 통해 리소스가 잘 생성되었는지 확인

# nginx-loadbalancer 리소스와 그와 관련된 것 모두 삭제
kubectl delete svc nginx-loadbalancer 명령을 통해 nginx-loadbalancer 리소스와 그와 관련된 것 모두 삭제
# nginx-deploy 리소스와 그와 관련된 것 모두 삭제
kubectl delete deployments.apps nginx-deploy 명령을 통해 nginx-deploy 리소스와 그와 관련된 것 모두 삭제
kubectl get svc,pod,ep –o wide 명령을 통해 잘 삭제되었는지 확인
Ⅴ. ExternalName
| ExternalName | 구분 | 설명 |
| 개념 | 클러스터 내부 Pod가 외부 도메인으로 접근할 수 있도록 내부 DNS를 CNAME 레코드로 매핑해주는 Kubernetes 서비스 타입 |
|
| 역할 | 내부 DNS 질의 시 외부 도메인으로 직접 리다이렉트 | |
| 외부 API, 외부 DB, 외부 SaaS와의 연동 시 유용 | ||
| 특징 | spec.externalName 필드에 외부 FQDN (Fully Qualified Domain Name) 지정 | |
| ClusterIP 생성하지 않음 (네트워크 프록시 없이 DNS 수준에서만 동작) | ||
| 내부 DNS 서버 (CoreDNS)가 CNAME 레코드로 변환하여 반환 | ||
| 작동 방식 | 내부 Pod에서 ExternalName 서비스 이름으로 접근 | |
| DNS 조회 시 CoreDNS가 CNAME 응답 반환 | ||
| 외부 도메인으로 요청 전달 | ||
| 접근 방식 | Pod 내부에서 nslookup external-google.default.svc.cluster.local 실행 시 www.google.com으로 CNAME 리턴 |
|
| 장점 | 외부 서비스를 Kubernetes 내부 DNS 체계에 통합 가능 | |
| 네트워크 프록시나 LoadBalancer 불필요 | ||
| 간단한 설정으로 외부 자원 연결 가능 | ||
| 단점 | 트래픽 제어 및 로드밸런싱 불가능 (단순 DNS 매핑 기능) | |
| 보안 제어나 TLS 인증 처리 불가 | ||
| 외부 서비스의 가용성에 직접 의존 | ||
| 사용 예시 | 클러스터 내부 애플리케이션이 외부 DB (rds.amazonaws.com)나 API (api.naver.com)에 접근할 때 사용 |

cd ../externalname/ 명령을 통해 loadbalancer 디렉터리에서 externalname 디렉터리로 이동
vi externalname-svc.yml 명령을 통해 vi 편집기 사용하여 externalname-svc.yml 파일 생성 및 내용 입력
cat externalname-svc.yml 명령을 통해 externalname-svc.yml 파일의 내용 확인
[ externalname-svc.yml 파일의 내용 ]
apiVersion: v1 명령을 통해 리소스 API 버전을 v1로 설정
kind: Service 명령을 통해 리소스의 종류를 Service로 지정
metadata.name: externalname-svc 명령을 통해 리소스 이름을 externalname-svc로 설정
spec.type: ExternalName 명령을 통해 type을 ExternalName으로 설정
spec.externalName: www.google.com 명령을 통해 externalName을 www.google.com으로 설정

# externalname-svc 리소스 생성 (Service)
kubectl create –f externalname-svc.yml 명령을 통해
externalname-svc.yml 파일 사용하여 externalname-svc 리소스 생성
kubectl get svc –o wide 명령을 통해 리소스가 잘 생성되었는지 확인
# externalname-svc.yml 파일과 그와 관련된 것 모두 삭제
kubectl delete –f externalname-svc.yml 명령을 통해 externalname-svc.yml 파일과 그와 관련된 것 모두 삭제
# externalname-svc 리소스와 그와 관련된 것 모두 삭제
rm –rf externalname-svc 명령을 통해 externalname-svc 리소스와 그와 관련된 것 모두 삭제

# externalname-svc 리소스 생성 (Service)
kubectl create -f externalname-svc.yml 명령을 통해
externalname-svc.yml 파일 사용하여 externalname-svc 리소스 생성
# testspod 리소스 생성 및 실행하여 컨테이너 내부 동작 (Pod)
kubectl run testpod --image=ubuntu 명령을 통해 Ubuntu 이미지 사용하여 testpod Pod 리소스 생성
-it 옵션을 통해 생성된 testpod 리소스 내부 내부 컨테이너의 터미널에 바로 접속하도록 설정
apt update 명령을 통해 패키지 목록 최신 상태로 갱신

apt –y install bind9-dnsutils iputils-ping 명령을 통해
컨테이너 안에서 네트워크와 DNS 모두 테스트할 수 있도록 도구 추가
nslookup externalname-svc.default.svc.cluster.local 명령을 통해 externalname-svc의 IP 주소 확인

dig externalname-svc.default.svc.cluster.local 명령을 통해
externalname-svc.default.svc.cluster.local의 실제 IP 주소 확인
ping -c 3 externalname-svc.default.svc.cluster.local 명령을 통해 외부 인터넷과 연결되었는지 확인
cat /etc/resolv.conf 명령을 통해 Pod 내부의 DNS 설정 파일의 내용 확인
exit 명령을 통해 testpod 리소스 내부 컨테이너의 터미널에서 나옴

kubectl get pod -n kube-system –o wide 명령을 통해 쿠버네티스의 모든 내부 시스템 Pod들을 자세히 확인

# externalname-svc 리소스와 그와 관련된 것 모두 삭제
kubectl delete svc externalname-svc 명령을 통해 externalname-svc 리소스와 그와 관련된 것 모두 삭제
kubectl get svc –o wide 명령을 통해 잘 삭제되었는지 확인
Ⅵ. Headless
| Headless | 구분 | 설명 |
| 개념 | clusterIP : None으로 생성하는 Headless 서비스 | |
| Service 자체의 가상 IP (ClusterIP)를 만들지 않고, Pod들의 Endpoint를 DNS로 직접 노출 | ||
| 동작 | kube-proxy의 L4 로드 밸런싱 거치지 않음 | |
| CoreDNS가 Pod 개별 IP (A 레코드) 또는 SRV 레코드를 그대로 응답 | ||
| 용도 | 단일 진입점이 필요 없고, 클라이언트 측 로드밸런싱 / 서비스 디스커버리가 필요한 경우 사용 (ex. StatefulSet DB, Kafka, Cassandra) |
|
| 장점 | Pod의 실제 IP를 직접 해석하므로 Peer-to-Peer, 리더 선출, 샤딩 등에 유리 | |
| 주의 | Service VIP가 없으므로 NetworkPolicy와 LB 규칙은 Pod / Endpoint 기준으로 설계 | |
| 포트 이름을 지정하면 SRV 레코드 생성 | ||
| 설정 요약 | Service 스펙에 spec.clusterIP : None 지정 |
Ⅵ - Ⅰ. headless-svc.default.svc.cluster.local 도메인
| headless-svc.default. svc.cluster.local 도메인 |
구분 | 설명 |
| 개념 | 네임스페이스 default의 headless-svc 이름 질의 | |
| DNS 응답 | 여러 개의 A 레코드 (연결된 각 Pod의 IP 목록) 또는 SRV 레코드 (포트 이름 사용 시) 반환 | |
| 특징 | 단일 진입점 없이 클라이언트가 받은 IP 리스트로 직접 선택, 헬스 체크, 리트라이 수행 | |
| 사용 예시 | 애플리케이션 라운드로빈 탐색 | |
| gRPC 클라이언트 LB 탐색 | ||
| 데이터베이스 클러스터 멤버 탐색 |
Ⅵ - Ⅱ. pod-ip-addr.namespace.pod.cluster.local 도메인
| pod-ip-addr.namespace. pod.cluster.local 도메인 |
구분 | 설명 |
| 개념 | 특정 Pod 한 개에 대한 정규화된 DNS 이름 (ex. a-b-c-d.default.pod.cluster.local (IP a.b.c.d)) |
|
| DNS 응답 | 해당 Pod 1개의 A 레코드 (단일 IP) 반환 | |
| 특징 | StatefulSet처럼 고정 호스트명, 순서가 있는 워크로드에서 개별 Pod에 직접 연결할 때 사용 | |
| 사용 예시 | mysql-0.mysql.default.svc.cluster.local처럼 멤버별 접속, 리더 / 팔로워 직접 지정 |

cd ../headless/ 명령을 통해 externalname 디렉터리에서 headless 디렉터리로 이동
vi headless-svc,yml 명령을 통해 vi 편집기 사용하여 headless-svc.yml 파일 생성 및 내용 입력
cat headless-svc.yml 명령을 통해 headless-svc.yml 파일의 내용 확인
[ headless-svc.yml 파일의 내용 ]
apiVersion: apps/v1 명령을 통해 API apps/v1 버전 사용하도록 설정
kind: Deployment 명령을 통해 리소스 종류를 Deployment로 설정
metadata.name: nginx-deploy 명령을 통해 Deployment의 이름을 nginx-deploy로 설정
spec.replicas: 3 명령을 통해 Pod를 3개 복제해서 실행하도록 지정
spec.selector.matchLabels.app: webui 명령을 통해 app=webui 라벨을 가진 Pod를 관리하도록 설정
spec.template.metadata.labels.app: webui 명령을 통해 Pod에 app=webui 라벨 부여
spec.spec.containers.name: nginx-container 명령을 통해 컨테이너 이름을 nginx-container로 지정
spec.spec.containers.image: nginx:1.14 명령을 통해 사용할 Docker 이미지를 Nginx 1.14로 지정
----
apiVersion: v1 명령을 통해 리소스 API 버전을 v1로 설정
kind: Service 명령을 통해 리소스의 종류를 Service로 지정
metadata.name: headless-svc 명령을 통해 리소스 이름을 headless-svc로 설정
spec.type: ClusterIP 명령을 통해 type을 ClusterIP로 설정
spec.clusterIP: None 명령을 통해 ClusterIP를 None으로 설정
spec.selector.app: webui 명령을 통해 클러스터 내부 DNS로
nginx-clusterip.default.svc.cluster.local처럼 접근하도록 설정
spec.ports.protocol: TCP – 전송 프로토콜을 TCP로 지정
spec.ports.port: 80 명령을 통해 클러스터 내부에서 서비스가 노출되는 포드로 80번 포트 지정
spec.ports.targetPort: 80 명령을 통해 Service가 트래픽을 전달하는 대상 포트를 80번 포트로 지정

# headless-svc 리소스 생성 (Service)
kubectl create –f headless-svc.yml 명령을 통해 headless-svc.yml 파일 사용하여 headless-svc 리소스 생성
kubectl get svc,pod,ep –o wide 명령을 통해 리소스가 잘 생성되었는지 확인
kubectl describe svc headless-svc 명령을 통해 headless-svc 리소스의 상세 정보 확인

kubectl get pod 명령을 통해 Pod의 상세 정보 확인
# testpod 리소스 내부 컨테이너 동작 (Pod)
kubectl exec testpod 명령을 통해 testpod 리소스 내부 진입
-it --/bin/bash 옵션을 통해 testpod 리소스 내부 컨테이너 bash 쉘 실행하도록 설정
cat /etc/resolv.conf 명령을 통해 /etc/resolv.conf 파일의 내용 확인
apt update 명령을 통해 패키지 목록 최신 상태로 갱신
exit 명령을 통해 testpod 리소스 내부 컨테이너 bash 쉘에서 나옴
# testpod 리소스와 그와 관련된 것 모두 삭제
kubectl delete pod testpod 명령을 통해 testpod 리소스와 그와 관련된 것 모두 삭제

# testpod 리소스 생성 및 실행하여 리소스 내부 컨테이너 동작 (Pod)
kubectl run testpod --image=ubuntu 명령을 통해 Ubuntu 이미지 사용하여 testpod 리소스 생성
-it 옵션을 통해 생성된 testpod 리소스 내부 컨테이너의 터미널에 바로 접속하도록 설정
-> 클러스터 내부 DNS가 정상 동작하는지 테스트
apt update 명령을 통해 패키지 목록 최신 상태로 갱신

apt –y install bind9-dnsutils iputils-ping 명령을 통해 컨테이너 안에서
네트워크와 DNS 모두 테스트할 수 있도록 도구 추가

cat /etc/resolv.conf 명령을 통해 Pod 내부의 DNS 설정 파일의 내용 확인
dig headless-svc.default.svc.cluster.local 명령을 통해
dig headless-svc.default.svc.cluster.local의 실제 IP 주소 확인
exit 명령을 통해 testpod 리소스 내부 컨테이너의 터미널에서 나옴
# testpod 리소스 삭제
kubectl delete pod testpod —force 명령을 통해 testpod 리소스 강제 삭제
# nginx-deploy 리소스와 그와 관련된 것 모두 삭제
kubectl delete deployments.apps nginx-deploy 명령을 통해 nginx-deploy 리소스와 그와 관련된 것 모두 삭제
# headless-svc 리소스와 그와 관련된 것 모두 삭제
kubectl delete svc headless-svc 명령을 통해 headless-svc 리소스와 그와 관련된 것 모두 삭제
kubectl get svc,pod,ep –o wide 명령을 통해 잘 삭제되었는지 확인
'Kubernetes' 카테고리의 다른 글
| Kubernetes Label과 Annotation (0) | 2026.06.13 |
|---|---|
| Kubernetes Ingress (0) | 2026.06.13 |
| kubernetes Controller (0) | 2026.06.13 |
| Minikube (0) | 2026.06.13 |
| Kubernetes 기본 개념 (0) | 2026.06.13 |