api.example.com은 backend Service, app.example.com은 frontend Service/api는 API Service, /는 web ServiceIngressClass로 지정ingressClassName, rules, (선택) defaultBackend, (선택) tls
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: / # 컨트롤러별 동작 옵션
spec:
ingressClassName: nginx-example # 어느 컨트롤러가 처리할지
rules:
- host: foo.example.com
http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test-service # 내부 ClusterIP Service
port:
number: 80
spec.ingressClassName — 이 Ingress를 처리할 컨트롤러 선택 (기본 클래스가 있으면 생략 가능)spec.rules — host·path 단위 라우팅 규칙 목록spec.defaultBackend — 어떤 rule에도 매칭되지 않는 요청을 보낼 폴백 백엔드 (선택)spec.tls — TLS 종료 설정 (선택, 별도 세션에서 정리)apiVersion: networking.k8s.io/v1, kind: Ingressmetadata.annotations로 전달
nginx.ingress.kubernetes.io/..., kubernetes.io/ingress.class (구버전)rules는 호스트별로 묶인 라우팅 규칙들의 목록host — 매칭할 호스트 이름 (선택, 생략 시 모든 호스트 매칭)http.paths — 그 호스트로 들어온 요청을 path 단위로 분기path + pathType + backendhost를 생략하면 IP·임의 호스트로 들어오는 모든 요청에 적용/api/v2가 /api보다 먼저 평가됨backend — 라우팅 대상service (대부분의 경우) — 클러스터 내부 Service로 전달
backend:
service:
name: my-service
port:
number: 80 # 또는 name: http
resource — Service가 아닌 다른 리소스(예: 정적 파일을 담은 StorageBucket CR)로 전달, 컨트롤러가 지원해야 함service.port는 숫자 또는 Service에 정의된 포트 이름(name)으로 지정 가능defaultBackendspec.defaultBackend로 Ingress 단위 설정 가능
spec:
defaultBackend:
service:
name: fallback-service
port:
number: 80
pathType이 필수 — 같은 path 문자열이라도 매칭 방식이 달라짐Exact / Prefix / ImplementationSpecificExactpath: /foo
/foo → 매칭/foo/, /foo/bar → 매칭 안 됨Prefix/로 분리한 element 단위로 prefix 비교path: /foo
/foo, /foo/, /foo/bar → 매칭/foobar → 매칭 안 됨 (element 경계가 다름)/api, /admin 같은 prefix 매칭/foo/로 적든 /foo로 적든 동일하게 동작ImplementationSpecificExact / Prefix를 쓰고, 정규식이 꼭 필요할 때만 사용/api/v2(Prefix) 와 /api(Prefix)가 둘 다 있으면 /api/v2 요청은 전자에 매칭Exact와 Prefix가 같은 path 문자열을 갖는 경우 — 보통 Exact가 우선| Path 정의 | 요청 경로 | Exact | Prefix |
|---|---|---|---|
/foo |
/foo |
⭕ | ⭕ |
/foo |
/foo/ |
❌ | ⭕ |
/foo |
/foo/bar |
❌ | ⭕ |
/foo |
/foobar |
❌ | ❌ |
/foo/ |
/foo |
❌ | ⭕ |
host 값에 와일드카드(*)를 한 단계만 사용 가능*은 가장 왼쪽 라벨에서 정확히 한 번만 — *.example.com ⭕*이 중간이나 오른쪽에 오면 무효 — foo.*.com ❌*.example.com은 bar.example.com은 매칭하지만 bar.baz.example.com은 매칭 안 함bar.example.com에 매칭되는 룰이 따로 있다면 그쪽으로 라우팅*.example.com을 한 번에 처리 가능backend.resource로 Service가 아닌 임의 리소스를 백엔드로 지정 가능backend.service와 backend.resource 중 하나만 가질 수 있음IngressClass 리소스 — 컨트롤러를 식별하는 클래스 정의Ingress.spec.ingressClassName — 그 Ingress가 어느 클래스를 따를지 선택IngressClass 정의apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb # Ingress가 ingressClassName으로 참조할 이름
spec:
controller: example.com/ingress-controller # 어떤 컨트롤러 구현이 처리할지
parameters: # 컨트롤러별 추가 파라미터(선택)
apiGroup: k8s.example.com
kind: IngressParameters
name: external-lb-params
spec.controller — 컨트롤러 구현체를 식별하는 문자열. 컨트롤러는 자기와 일치하는 IngressClass의 Ingress만 처리spec.parameters — 컨트롤러 전용 설정을 담은 별도 CR을 가리킴 (예: 외부 LB 옵션, TLS 정책)ingressclass.kubernetes.io/is-default-class: "true"를 붙이면 기본 클래스가 됨
metadata:
name: default-class
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
Ingress.spec.ingressClassName이 비어 있으면 기본 클래스가 자동 적용ingressClassName을 비워두면 어느 컨트롤러도 처리하지 않음kubernetes.io/ingress.class 어노테이션으로 컨트롤러를 지정했음networking.k8s.io/v1부터는 spec.ingressClassName이 정식 — 어노테이션 방식은 deprecatedingressClassName 사용