반응형
이번 포스트에서는 Kubernetes에서 외부 요청을 관리하는 핵심 오브젝트인 Ingress 에 대해 정리합니다.
왜 필요한지, 구조는 어떤지, 그리고 실제로 어떻게 설정하고 사용하는지까지 다룹니다.
✅ Ingress의 기본 기능 3가지
- 외부 요청 라우팅
- 예시: /apple, /apple/red 처럼 특정 경로 요청을 적절한 서비스로 전달
- 가상 호스트(Virtual Host) 기반 요청 처리
- 같은 IP를 쓰더라도 도메인명에 따라 요청을 다르게 라우팅
- SSL/TLS 보안 연결 처리
- 인증서를 쉽게 적용해 HTTPS 통신 처리 가능
🔥 Ingress를 사용하는 이유
- 단일 진입점
- Deployment마다 Service 생성 대신, Ingress 하나로 외부 노출 통합 관리 가능
- 클라이언트는 Ingress URL만 알면 됨
- 라우팅 정의와 보안 설정은 모두 Ingress 규칙이 책임짐
- 구조를 간단하고 깔끔하게 만들 수 있음
🛠️ Ingress 구조 (YAML 설명)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: www.example.com
http:
paths:
- path: /apple
pathType: Prefix
backend:
service:
name: apple-service
port:
number: 80
주요 필드 설명
- host: 요청 도메인 지정 (여러 host 가능)
- path: 특정 경로 요청을 어디로 보낼지 정의
- serviceName, servicePort: 요청을 받을 Service와 포트 지정
- annotations: 부가 기능 추가 설정 (ex: SSL 리다이렉션, URL 리라이트 등)
⚡ 주의: Ingress 오브젝트만 생성해도 아무 동작 안 함. 반드시 Ingress Controller가 필요!
🚀 Nginx-Ingress-Controller란?
Ingress 요청을 실제로 처리하는 대표적인 Ingress Controller입니다.
사용 방법
- 공식 GitHub에서 Nginx-Ingress-Controller YAML 파일 배포
- LoadBalancer 타입의 Service로 외부 노출
- Ingress 리소스 생성해 라우팅 규칙 작성
- Ingress 규칙에 따라 트래픽을 Service로 전달
- 404 Not Found 에러 시: 요청 host를 LoadBalancer DNS 이름이나 설정한 도메인으로 수정해야 함
- Nginx Ingress Controller는 보통 Service를 거치지 않고 Pod로 직접 bypass 요청 전달함
✍️ 세부 기능 - annotations로 세밀 제어하기
Ingress에 annotations를 추가해 다양한 기능을 세밀하게 조정할 수 있습니다.
Nginx-Ingress-Controller 실습
- host: xx.xx.example.com 도메인에서 요청하는 트래픽을
- path: /로 보냄
- serviceName, servicePort: 요청을 받을 Service는 "example-com"이고, 포트는 80
- annotations:
- kubernetes.io/ingress.class: nginx -> 이 Ingress는 "nginx" Ingress Controller가 처리하게 지정
- nginx.ingress.kubernetes.io/proxy-body-size: 200m -> 클라이언트 요청 본문(body) 크기 제한을 200MB로 설정 (업로드 큰 경우 필요)
- nginx.ingress.kubernetes.io/proxy-send-timeout: 90 -> 백엔드 서버에 요청 보낼 때, 응답을 기다리는 최대 시간 90초로 설정
- external-dns.alpha.kubernetes.io/target: internal-xxx.elb.amazonaws.com -> Route53 같은 ExternalDNS에서 이 Ingress가 사용할 ELB 주소 지정
ExternalDNS에 대한 내용은 아래 포스트에서 확인가능!
ExternalDNS
{
"apiVersion": "networking.k8s.io/v1",
"kind": "IngressList",
"metadata": {
"name": "example-com",
"namespace": "example",
...
"labels": {
"app.kubernetes.io/instance": "example",
"app.kubernetes.io/managed-by": "Helm",
"app.kubernetes.io/name": "example-com",
"app.kubernetes.io/version": "1.16.0",
"argocd.argoproj.io/instance": "example",
"helm.sh/chart": "example-com-0.1.0"
},
"annotations": {
"external-dns.alpha.kubernetes.io/target": "internal-xxx.elb.amazonaws.com",
"kubectl.kubernetes.io/last-applied-configuration": ...
"kubernetes.io/ingress.class": "nginx",
"nginx.ingress.kubernetes.io/proxy-body-size": "200m",
"nginx.ingress.kubernetes.io/proxy-send-timeout": "90"
}
},
"spec": {
"rules": [
{
"host": "xx.xx.example.com",
"http": {
"paths": [
{
"path": "/",
"pathType": "Prefix",
"backend": {
"service": {
"name": "example-com",
"port": {
"number": 80
}
}
}
}
]
}
}
]
},
"status": {
"loadBalancer": {
"ingress": [
{
"hostname": "dept-example-nlb-nginx-an2-prd-xxx.elb.ap-northeast-2.amazonaws.com"
}
]
}
}
}
rewrite-target 예시
- URL을 변환해서 Service로 넘기는 기능
- 특히 정규 표현식과 함께 유용하게 사용
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
요청 URL | 실제 요청 경로 |
/html | / |
/html/color/red | /color/red |
🔒 SSL/TLS 보안 연결 적용 방법
Ingress Controller에서 SSL/TLS 설정을 적용할 수 있습니다.
- LoadBalancer Service에 ACM 인증서 연결
- Nginx-Ingress-Controller에 직접 인증서 적용 가능
(※ 상황에 따라 선택)
🛠️ 여러 개의 Ingress Controller 운영하기
- Nginx-Ingress-Controller 배포 시 --ingress-class 옵션 추가
- Ingress 리소스에 주석(annotation) 추가
metadata:
annotations:
kubernetes.io/ingress.class: "custom-nginx"
🧹 정리
항목 | 내용 |
Ingress 핵심 역할 | 외부 요청을 경로/도메인/보안 설정에 따라 라우팅 |
Controller 필요 여부 | 필수 (Ingress 리소스만으로는 작동 안 함) |
대표 Controller | Nginx-Ingress-Controller |
주요 부가 기능 | rewrite-target, SSL 인증서 적용, 여러 Controller 동시 운영 |
반응형
'OPS' 카테고리의 다른 글
DevOps 스터디 - 퍼시스턴트 볼륨(PV)과 퍼시스턴트 볼륨 클레임(PVC) #2 (0) | 2025.05.04 |
---|---|
Kubernetes Pod와 Deployment 수정 방법 정리 (0) | 2025.04.28 |
EKS 도메인 자동 관리 with ExternalDNS + Ingress + Route53 (0) | 2025.04.24 |
Zonal shift delegated to dns가 뭐야? (0) | 2025.04.23 |
[AWS 실무 팁] S3 aws s3 sync 시 AccessDenied 해결법 (0) | 2025.04.22 |