안녕하세요.
오늘은 Ingress Controller에 대해 알아보겠습니다.
# Ingress Controller 란?
쿠버네티스가 지원하는 파드, 컨트롤러와 같은 API 중 하나로 웹 기반의 서비스를 외부에서 접속 가능하게 해 줍니다.
대표적으로 아래와 같은 기능을 제공합니다.
- Service에 외부 URL을 제공
- 트래픽을 로드밸런싱
- SSL 인증서 처리
- Virtual hosting을 지정
간단히 말해서 7 계층 로드밸런서의 역할을 합니다.
이러한 Ingress Controller에는 다양한 오픈 소스가 존재합니다.
- NGINX Ingress Controller
- Traefik
- HAProxy
- Istio Gateway
- 클라우드별 컨트롤러 (AWS, GCP)
저희는 NGINX Ingress Controller로 테스트를 진행하겠습니다.
Ingress Controller를 사용하기 위해서는 Ingress도 필요한데요.
Ingress는 일종의 경로 역할을 합니다.
예를 들어 아래와 같이 Login 홈페이지와 Main 홈페이지를 URL 기반으로 나누었을 때
www.test.com/login → login 파드
www.test.com/main → main 파드
Ingress는 url을 감지하여 알맞은 서비스에 연결하는 역할을 합니다.
정리하면 HTTP(S) 요청에 대한 "라우팅 규칙"을 정의하는 Kubernetes 리소스가 Ingress이고
그 규칙을 실제로 해석하고 요청을 라우팅 하는 역할을 수행하는 것이 Ingress Controller 입니다.

# 테스트
직접 배포하여 테스트해보겠습니다.
참고로 저는 VMware 환경에서 테스트를 진행하고 있습니다.
먼저 헬름을 설치하겠습니다.
# Helm 스크립트 설치
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
# 스크립트에 실행 권한 부여
chmod 700 get_helm.sh
# Helm 설치
./get_helm.sh
# Helm 버전 확인
helm version

위와 같이 나오면 설치 성공입니다.
helm upgrade --install ingress-nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx --namespace ingress-nginx --create-namespace
이제 helm을 통해서 nginx ingress controller를 배포하겠습니다.

설치 후 `kubectl get all -n ingress-nginx` 명령어시 위와 같이 출력되면 설치 성공입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: login-deploy
spec:
replicas: 2
selector:
matchLabels:
app: nginx-login
template:
metadata:
labels:
app: nginx-login
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: html-volume
mountPath: /usr/share/nginx/html
volumes:
- name: html-volume
configMap:
name: login-html
---
apiVersion: v1
kind: ConfigMap
metadata:
name: login-html
data:
index.html: |
<html>
<body>
login
</body>
</html>
---
apiVersion: v1
kind: Service
metadata:
name: ingress-svc-login
spec:
selector:
app: nginx-login
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-login
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /login
pathType: Prefix
backend:
service:
name: ingress-svc-login
port:
number: 80
먼저 로그인 페이지 리소스들부터 배포하겠습니다.
`kubectl apply -f login.yml` 명령어로 deployment, service, ingress를 배포합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: main-deploy
spec:
replicas: 2
selector:
matchLabels:
app: nginx-main
template:
metadata:
labels:
app: nginx-main
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: html-volume
mountPath: /usr/share/nginx/html
volumes:
- name: html-volume
configMap:
name: main-html
---
apiVersion: v1
kind: ConfigMap
metadata:
name: main-html
data:
index.html: |
<html>
<body>
main
</body>
</html>
---
apiVersion: v1
kind: Service
metadata:
name: ingress-svc-main
spec:
selector:
app: nginx-main
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-main
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /main
pathType: Prefix
backend:
service:
name: ingress-svc-main
port:
number: 80
이제 main 페이지용 리소스를 배포하겠습니다.
`kubectl apply -f main.yml` 명령어로 배포하겠습니다.

위와 같이 나오면 성공입니다.

이제 테스트를 진행해야 하는데요.
해당 EXTERNAL-IP로 접근하겠습니다.

/login url 접근

/main url 접근
위와 같이 나오면 성공
감사합니다.
참고 :
MetalLB :: MetalLB, bare metal load-balancer for Kubernetes
MetalLB is a load-balancer implementation for bare metal Kubernetes clusters, using standard routing protocols. Note Despite the beta status of the project / API, MetalLB is known to be stable and reliable. The project maturity page explains what that impl
metallb.io
https://kubernetes.io/docs/concepts/services-networking/ingress/
Ingress
Make your HTTP (or HTTPS) network service available using a protocol-aware configuration mechanism, that understands web concepts like URIs, hostnames, paths, and more. The Ingress concept lets you map traffic to different backends based on rules you defin
kubernetes.io