Kubernetes Ingress

2026. 6. 13. 14:53Kubernetes


Ⅰ. Ingress



Ingress

(인그레스)

항목 설명
개념 클러스터 외부에서 들어오는 HTTP / HTTPS 요청을

내부 서비스 (Pod)로 라우팅하는 Kubernetes 리소스
역할 하나의 IP 또는 도메인으로 여러 서비스에 접근 가능
엔드포인트 (API)와 Pod 매핑 정보를 기반으로 요청 전달
경로 기반 라우팅 (/ , /guest, /admin)이나

도메인 기반 (hostA.com, hostB.com) 규칙 설정 가능
특징 ClusterIP, NodePort, LoadBalancer 없이도 단일 진입점 제공
TLS (HTTPS) 인증서 설정 가능 (tls : 블록 사용)
Path, Host 기반의 라우팅 정책을 통한 유연한 트래픽 제어
기존 방식

(ClusterIP,

NodePort,

LoadBalancer)

차이점












항목 설명
Label 기반 접근 Label 서로 다른 Pod에 접근하기 위해 Pod별 Label 서비스 구성 필요
ClusterIP / NodePort 각각의 포트로 접근 -> 다수 서비스일 경우, 포트 관리 어려움
Ingress 장점 여러 서비스에 대한 접근을 하나의 도메인으로 통합 관리 가능
N개의 서비스를 하나의 진입점으로 연결

(ex. www.example.com/app1,  www.example.com/app2)
로드밸런싱, SSL 종료, 리다이렉트 등을 간단히 구성 가능
접근 흐름 클라이언트 -> 노드 (Node) -> Ingress Controller

-> Ingress Rule -> 내부 Service -> Pod
Ingress 라우팅 예시 예시 설명
www.example.com wed Pod (Label : websrv)
www.example.com/guest guest Pod (Label : guestsrv)
www.example.com/admin admin Pod (Label : adminsrv)

 


Ⅰ - Ⅰ. Ingress Controller

Ingress Controller 항목 설명
개념 Ingress 리소스에 정의된 Rule을 실제 트래픽 라우팅 규칙으로 변환하고 실행하는 컨트롤러
역할 Ingress 객체를 감시하면서 변경 사항을 감지하고, 자동으로 적용
요청의 Path, Host, Header, Method에 따라 적절한 Service로 트래픽 전달
HTTPS / TLS 설정 처리 (SSL termination)
종류 Nginx Ingress Controller (가장 널리 사용)
HAProxy, Traefik, Istio, Kon, GCE Ingress 등 다양한 구현체 존재
설치 및 설정 클라우드 환경 (GCP, AWS, Azure)에서 자동으로 Ingress Controller 배포 가능
온프레미스 환경에서는 수동 설치 필요
kubectl apply -f ingress-nginx.yaml 등으로 설치 가능
Ingress 설정

활성화 방법
ingress_nginx_enabled를 true로 변경하여 Nginx Ingress Controller 활성화
'kuberspray' 또는 addons.yaml 내 설정으로도 자동 구성 가능
설정 예시

(Nginx 기반)
ingress-nginx 네임스페이스에 배포된 Pod가

Ingress 객체를 감시하며 실제 트래픽 라우팅 수행
Tip 예시 설명
kubectl get pods -n ingress-nginx Ingress Controller 상태 확인
kubectl describe ingress <INGRESS_NAME> 라우팅 규칙 검증

 

 

wget 명령을 통해 ingress-nginx Controller 불러와서 다운로드

 

 

ls 명령을 통해 잘 다운로드 되었는지 확인

 

 

vi deploy.yaml 명령을 통해 vi 편집기 사용하여 deploy.yaml 파일 내용 수정

 

cat deploy.yaml 명령을 통해 deploy.yaml 파일의 내용이 잘 수정되었는지 확인

 

 

[ deploy.yaml 파일의 수정 내역 ]

 

nodePort: 30080 명령을 통해 쿠버네티스에서 NodePort 서비스 타입일 때 사용되는 포트 번호를 30080으로 지정

 

-> 클러스터 외부에서 워커 노드의 IP와 이 포트를 통해 서비스에 접근할 수 있도록 설정

 

nodePort: 30443 명령을 통해 쿠버네티스에서 NodePort 서비스 타입일 때 사용되는 포트 번호를 30443으로 지정

 

-> 클러스터 외부에서 워커 노드의 IP와 이 포트를 통해 서비스에 접근할 수 있도록 설정

 

clusterIP: 10.233.10.10 명령을 통해 해당 서비스가 클러스터 내에서 가질 IPv4 주소를 10.233.10.10로 지정

 

-> 클러스터 내부에서만 접근 가능한 IP로, 기본 서비스 타입인 ClusterIP 방식에서 주로 사용됨.

 

-> 외부에서는 접근 불가능하며, 클러스터 내부에서만 통신 용도로 활용

 

 

# ingress-nginx 리소스 생성 

 

kubectl create –f deploy.yaml 명령을 통해 deploy.yaml 파일 사용하여 ingress-nginx 리소스 생성

 

kubectl get namespaces 명령을 통해 Kubernetes 클러스터 내 존재하는 모든 네임스페이스 목록 확인

 

kubectl get pod –A 명령을 통해 모든 네임스페이스에 있는 파드 상태 확인

 

 

kubectl get deploy,rs,svc,pod,ep –n ingress-nginx –o wide 명령을 통해

 

ingress-nginx가 잘 생성되었는지, 리소스의 상세 정보 확인

 

 

vi svc1-pod.yml 명령을 통해 vi 편집기 사용하여 svc1-pod.yml 파일 생성 및 내용 입력

 

cat svc1-pod.yml 명령을 통해 svc1-pod.yml 파일의 내용 확인

 

[ svc1-pod.yml 파일의 내용 ]

 

< Deployment 생성 및 설정 부분 >

 

apiVersion: apps/v1 명령을 통해 API apps/v1 버전 사용하도록 설정

 

kind: Deployment 명령을 통해  리소스 종류를 Deployment로 설정

 

metadata.name: deploy1-websrv 명령을 통해  Deployment의 이름을 deploy1-websrv로 설정

 

spec.replicas: 1 명령을 통해  Pod를 1개 복제해서 실행하도록 지정

 

spec.selector.matchLabels.app: websrv 명령을 통해

 

app=websrv 라벨과 매칭되는 Pod만 Deployment가 관리하도록 설정

 

spec.template.metadata.labels.app: wesbrv 명령을 통해 생성되는 Pod에 app=websrv 라벨 부여

 

(Selector과 동일하게)

 

spec.template.spec.containers[0].name: pod-web 명령을 통해 컨테이너 이름을 pod-web으로 설정

 

spec.template.spec.containers[0].image: nginx 명령을 통해  컨테이너에서 사용할 이미지로 nginx 설정

 

spec.template.spec.containers[0].ports[0].containerPort: 80 명령을 통해 컨테이너 여는 포트를 80번으로 설정

 

----

 

< Service 생성 및 설정 부분 >

 

apiVersion: v1 명령을 통해 core/v1 API 버전 사용하도록 지정

 

kind: Service 명령을 통해  리소스의 종류를 Service로 지정

 

metadata.name: svc1-web 명령을 통해  Service 이름을 svc1-web으로 설정

 

spec.type: CluterIP 명령을 통해  클러스터 내부에서만 접근 가능한 내부용 가상 IP 제공

 

spec.clusterIP: 10.233.10.11 명령을 통해 수동으로 고정된 서비스 IP 설정

 

spec.selector.app: wesrv 명령을 통해  app=wesrv 라벨이 붙은 Pod들에게만 네트워크 트래픽 전달하도록 설정

 

spec.ports[0].name: web-port 명령을 통해 포트 이름을 web-port로 설정

 

spec.ports[0].port: 80 명령을 통해  클러스터 내부에서 서비스가 노출되는 포트로 80번 포트로 지정

 

spec.ports[0].targetPort: 80 명령을 통해 Service가 실제 트래픽을 전달한 컨테이너의 포트를  80번 포트로 지정

 

 

vi svc2-pod.yml 명령을 통해 vi 편집기 사용하여 svc2-pod.yml 파일 생성 및 내용 입력

 

cat svc2-pod.yml 명령을 통해 svc2-pod.yml 파일의 내용 확인

 

[ svc2-pod.yml 파일의 내용 ]

 

< Deployment 생성 및 설정 부분 >

 

apiVersion: apps/v1 명령을 통해 API 그룹이 apps/v1 버전을 사용하도록 설정

 

kind: Deployment 명령을 통해 리소스 종류를 Deployment로 설정

 

metadata.name: deploy2-guestsrv 명령을 통해  Deployment의 이름을 deploy2-guestsrv로 설정

 

spec.replicas: 2 명령을 통해  Pod를 2개 복제해서 실행하도록 지정

 

spec.selector.matchLabels.app: guestsrv 명령을 통해 app=guestsrv 라벨을 가진 Pod를 관리하도록 설정

 

spec.template.metadata.labels.app: guestsrv 명령을 통해 생성되는 Pod에 app=guestsrv 라벨 부여

 

(Selector와 동일하게)

 

spec.template.spec.containers[0].name: pod-guest 명령을 통해 컨테이너 이름을 pod-guest로 설정

 

spec.template.spec.containers[0].image: gcr.io/google-samples/kubernetes-bootcamp:v1 명령을 통해

 

컨테이너 이미지로 gcr.io/google-samples/kubernetes-bootcamp:v1 설정

 

spec.template.spec.containers[0].ports[0].containerPort: 8080 명령을 통해

 

컨테이너 내부에서 개방할 포트를 8080번으로 설정

 

----

 

< Service 생성 및 설정 부분 >

 

apiVersion: v1 명령을 통해  core/v1 API 버전 사용하도록 지정

 

kind: Service 명령을 통해 리소스의 종류를 Service로 지정

 

metadata.name: svc2-guest 명령을 통해 Service 이름을 svc2-guest로 설정

 

spec.type: CluterIP 명령을 통해  클러스터 내부에서만 접근 가능한 내부용 가상 IP 제공

 

spec.clusterIP: 10.233.10.12 명령을 통해 수동으로 고정된 서비스 IP 설정

 

spec.selector.app: guestsrv 명령을 통해  app=guestsrv 라벨이 붙은 Pod에게만 트래픽 전달하도록 설정

 

spec.ports[0].name: guest-port 명령을 통해 포트의 이름을 guest-port로 설정

 

spec.ports[0].port: 9002  명령을 통해  Service가 노출하는 포트를 9002번으로 설정

 

spec.ports[0].targetPort: 8080 명령을 통해 Service가 실제 트래픽을 전달한 컨테이너의 포트를 8080번으로 지정

 

 

vi svc3-pod.yml 명령을 통해 vi 편집기 사용하여 svc3-pod.yml 파일 생성 및 내용 입력

 

cat svc3-pod.yml 명령을 통해 svc3-pod.yml 파일의 내용 확인

 

[ svc3-pod.yml 파일의 내용 ]

 

< Deployment 생성 및 설정 부분 >

 

apiVersion: apps/v1 - API apps/v1 버전 사용하도록 설정

 

kind: Deployment 명령을 통해  리소스 종류를 Deployment로 설정

 

metadata.name: deploy3-adminsrv 명령을 통해  Deployment의 이름을 deploy3-adminsrv로 설정

 

spec.replicas: 3 명령을 통해  Pod를 3개 복제해서 실행하도록 지정

 

spec.selector.matchLabels.app: adminsrv 명령을 통해  app=adminsrv 라벨을 가진 Pod를 관리하도록 설정

 

spec.template.metadata.labels.app: adminsrv 명령을 통해 생성되는 Pod에 app=adminsrv 라벨 부여

 

(Selector와 동일하게)

 

spec.template.spec.containers[0].name: pod-admin 명령을 통해 컨테이너 이름을 pod-admin으로 설정

 

spec.template.spec.containers[0].image: k8s.gcr.io/echoserver:1.5 명령을 통해

 

컨테이너 이미지로 k8s.gcr.io/echoserver:1.5 설정

 

spec.template.spec.containers[0].ports[0].containerPort: 8080 명령을 통해

 

컨테이너 내부에서 개방할 포트 8080번으로 설정

 

----

 

< Service 생성 및 설정 부분 >

 

apiVersion: v1 명령을 통해 core/v1 API 버전 사용하도록 설정

 

kind: Service 명령을 통해  리소스의 종류를 Service로 지정

 

metadata.name: svc3-admin 명령을 통해 리소스 이름을 svc3-admin로 설정

 

spec.type: CluterIP 명령을 통해 클러스터 내부에서만 접근 가능한 내부용 가상 IP 제공

 

spec.clusterIP: 10.233.10.13 명령을 통해 수동으로 고정된 서비스 IP 설정

 

spec.selector.app: adminsrv 명령을 통해 app=adminsrv 라벨이 붙은

 

Pod들에게만 네트워크 트래픽 전달하도록 설정

 

spec.ports[0].name: admin-port 명령을 통해 포트 이름을 admin-port로 설정

 

spec.ports[0].port: 9003 명령을 통해 Service가 노출하는 포트를 9003번으로 설정

 

spec.ports[0].targetPort: 8080 명령을 통해 Service가 실제 트래픽을 전달할 컨테이너의 포트를 8080번으로 지정

 

 

# svc1-web, svc2-guest, svc3-admin 리소스 생성 (Service)

 

kubectl create –f svc1-pod.yml –f svc2-pod.yml –f svc3-pod.yml 명령을 통해 svc1-pod.yml, svc2-pod.yml,

 

svc3-pod.yml 파일 사용하여 svc1-web, svc2-guest, svc3-admin 리소스 생성

 

kubectl get svc,pod,ep –o wide 명령을 통해 리소스가 잘 생성되었는지 확인

 

kubecetl describe ingressclasses.networking.k8s.io 명령을 통해 Ingress Controller 클래스 정보 확인

 

 

vi ingress-test.yml 명령을 통해 vi 편집기 사용하여 ingress-test.yml 파일 생성 및 내용 입력

 

 

# ingress-nginx 리소스 생성

 

kubectl create –f ingress-test.yml 명령을 통해 ingress-test.yml 파일 이용하여 ingress-nginx 리소스 생성

 

kubectl get ingress 명령을 통해 Ingress가 잘 생성되었는지 확인

 

kubectl describe ingres ingress-test 명령을 통해 ingress-test의 상세 정보 확인

 

kubectl get svc,pod,ep –n ingress-nginx 명령을 통해 ingress-nginx 리소스에 대한 상세 정보 확인

 

 

kubectl describe clusterrole ingress-nginx 명령을 통해

 

클러스터 전체에서 적용되는 권한 세트 중 ingress-nginx의 역할이 어떤 권한을 가지고 있는지 확인

 

 

kubectl describe role –n ingress-nginx 명령을 통해

 

Ingress Controller가 자신의 네임스페이스 내에서 어떤 리소스에 접근 가능한지 확인

 

 

kubectl get pod –n ingress-nginx 명령을 통해 ingress-nginx 네임스페이스 안에 있는 모든 Pod 조회

 

 

# Ingress Controller Pod 리소스 내부 컨테이너 동작

 

kubectl exec -n ingress-nginx -it ingress-nginx-controller-54bd8576cd-kk642 --/bin/bash 명령을 통해

 

Ingress Controller Pod 리소스 내부의 컨테이너에 bash로 접속하도록 설정

 

ls 명령을 통해 해당 리소스 내에 있는 파일 목록 확인

 

exit 명령을 통해 Ingress Controller Pod 내부의 컨테이너 bash쉘에서 나옴

 

 

# ingress-test.yml 파일과 그와 관련된 리소스 등 모두 삭제

 

kubectl delete –f ingress-test.yml 명령을 통해 ingress-test.yml 파일과 그와 관련된 리소스 등 모두 삭제

 

 

# svc1-pod.yml, svc2-pod.yml, svc3-pod.yml 파일과 그와 관련된 리소스 등 모두 삭제

 

kubectl delete –f svc1-pod.yml –f svc2-pod.yml –f svc3-pod.yml 명령을 통해

 

svc1-pod.yml, svc2-pod.yml, svc3-pod.yml 파일과 그와 관련된 모든 것 함께 삭제

 

 

# deploy.yaml 파일과 그와 관련된 리소스 등 모두 삭제

 

kubectl delete –f deploy.yaml 명령을 통해 deploy.yaml 파일과 그와 관련된 모든 것 함께 삭제

'Kubernetes' 카테고리의 다른 글

Kubernetes ConfigMap  (0) 2026.06.13
Kubernetes Label과 Annotation  (0) 2026.06.13
Kubernetes Service  (0) 2026.06.13
kubernetes Controller  (0) 2026.06.13
Minikube  (0) 2026.06.13