쿠버네티스 인그레스
쿠버네티스의 Ingress는 클러스터 외부에서 내부 서비스로 HTTP(S) 트래픽을 라우팅하기 위한 리소스임.
Ingress는 쿠버네티스 클러스터에서 외부 트래픽과 서비스 간의 연결을 효율적으로 관리함.
도메인 기반 라우팅, HTTPS 지원, 리다이렉션 등의 고급 기능을 제공함.
Ingress의 핵심 개념
Ingress는 단순한 서비스 노출 방식인 NodePort와 LoadBalancer와 달리, HTTP/HTTPS 레벨에서의 트래픽 관리를 제공함.
1. Ingress 컨트롤러
Ingress 리소스는 스스로 동작하지 않음.
이를 구현하고 실행하기 위해 Ingress Controller가 필요함.
1-2. 일반적으로 사용되는 Ingress Controller
NGINX Ingress Controller
Traefik
HAProxy
AWS ALB Ingress Controller
Istio Gateway
1-3. 클러스터에 설치된 Ingress Controller가 Ingress 리소스를 감지하고 트래픽을 라우팅함.
2. Ingress와 서비스 비교
2-1. 트래픽 관리
Ingress : URL 기반 라우팅, HTTPS, 다중 서비스 지원
Loadbalancer/NodePort : 단일 서비스로 트래픽 전달
2-2. 도메인 관리
Ingress : 서브도메인별 트래픽 라우팅
Loadbalancer/NodePort : 도메인과 관계없이 단순 포트 기반 라우팅
2-3. HTTPS 지원
Ingress : 네이티브 HTTPS 및 인증서 관리 가능
Loadbalancer/NodePort : 개별 서비스에서 처리 필요
Ingress 리소스의 구성 요소
Ingress는 YAML 파일로 정의되며, 주요 구성 요소는 다음과 같음.
1. API 버전 및 리소스 유형
apiVersion: networking.k8s.io/v1
kind: Ingress
2. 메타데이터
이름, 네임스페이스, 어노테이션 등을 포함.
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
3. 스펙
트래픽 라우팅 규칙 정의.
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
Ingress 주요 기능
1. 호스트 기반 라우팅
하나의 Ingress 리소스에서 여러 도메인 트래픽을 관리할 수 있음.
rules:
- host: app1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- host: app2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80
2. 패스 기반 라우팅
경로별로 다른 서비스에 트래픽을 전달할 수 있음.
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
3. HTTPS 지원
TLS(HTTPS) 트래픽을 지원하며, 인증서를 Secret으로 관리함.
tls:
- hosts:
- example.com
secretName: example-tls-secret
인증서 생성 및 Secret 생성
kubectl create secret tls example-tls-secret --cert=cert.crt --key=cert.key
4. 리다이렉션
NGINX Ingress Controller를 사용하여 HTTP 트래픽을 HTTPS로 리다이렉트.
metadata:
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
5. 리라이트(Rewriting)
URL 경로를 수정하여 백엔드 서비스에 전달.
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
Ingress 컨트롤러 설치
Ingress는 Ingress Controller가 있어야 동작함.
여기서는 NGINX Ingress Controller를 예로 들어 설명함.
1. NGINX Ingress Controller 설치
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
2. 설치 확인
kubectl get pods -n ingress-nginx
Ingress 동작 예시
1. 서비스 정의
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: example
2. Ingress 정의
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
tls:
- hosts:
- example.com
secretName: example-tls-secret
3. Ingress 테스트
로컬 /etc/hosts 파일에 다음과 같이 설정.
<Ingress-Controller-EXTERNAL-IP> example.com
브라우저에서 http://example.com 또는 https://example.com에 접속하여 서비스 확인.
Ingress 한계
1. 로드밸런싱 수준
Ingress는 HTTP(S) 트래픽만 처리하며, TCP/UDP는 지원하지 않음 (일부 Ingress Controller에서 확장 지원).
2. 확장성
대규모 트래픽에는 추가적인 로드밸런서(예: AWS ALB)와 함께 사용해야 함.
3. 복잡성
고급 기능을 활용하려면 Ingress Controller별로 다양한 설정과 튜닝이 필요.
Ingress의 Best Practice
1. Ingress Controller 선택
요구 사항에 맞는 Ingress Controller 선택(NGINX, AWS ALB 등).
2. HTTPS 사용
모든 트래픽은 HTTPS로 강제 리다이렉션.
3. 리소스 분리
환경(개발, 테스트, 프로덕션)별로 Ingress 리소스를 분리.
4. 모니터링 및 로깅
Prometheus, Grafana, Fluentd 등을 사용해 Ingress 트래픽과 성능을 모니터링.
'Operating System > Kubernetes' 카테고리의 다른 글
[Kubernetes] k8s, PGBouncer 개념 (0) | 2024.12.26 |
---|---|
[Kubernetes] 쿠버네티스 인그레스의 PathType (0) | 2024.12.26 |
[Kubernetes] Nginx Dockerfile을 arm64로 ECR에 배포하는 방법 (0) | 2024.12.26 |
[Kubernetes] Liveness, Readiness, Startup Probe 정리 (0) | 2024.12.26 |
[Kubernetes] k8s, 파드란? (0) | 2024.12.26 |