2026. 6. 13. 14:53ㆍKubernetes
Ⅰ. 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 |