NGINX Ingress Controller Manifests, cross-namespace, ๋กœ๊น…

VirtualServer ๋ฐ VirtualServerRoute ๋ฆฌ์†Œ์Šค

VirtualServer ๋ฐ VirtualServerRoute ๋ฆฌ์†Œ์Šค๋Š” Ingress ๋ฆฌ์†Œ์Šค์˜ ๋Œ€์•ˆ์œผ๋กœ ๊ถŒ์žฅ๋˜๋Š” Load Balancing ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค 1.5์— ๋„์ž…๋œ VirtualServer ๋ฐ VirtualServerRoute ๋ฆฌ์†Œ์Šค๋Š” ํŠธ๋ž˜ํ”ฝ ๋ถ„ํ•  ๋ฐ ๊ณ ๊ธ‰ ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…๊ณผ ๊ฐ™์ด Ingress ๋ฆฌ์†Œ์Šค์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ถ”๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋ณด๋ ค๋ฉด GitHub Repo์˜ examples/custom-resources ํด๋”๋กœ ์ด๋™ํ•˜์„ธ์š”.

๋ชฉ์ฐจ

1. VirtualServer ์‚ฌ์–‘
1-1. VirtualServer.TLS
1-2. VirtualServer.TLS.Redirect
1-3. VirtualServer.TLS.CertManager
1-4. VirtualServer.ExternalDNS

1-5. VirtualServer.ExternalDNS.ProviderSpecific
1-6. VirtualServer.Policy
1-7. VirtualServer.Route
2. VirtualServerRoute ์‚ฌ์–‘
2-1. VirtualServerRoute.Subroute
3. VirtualServer ๋ฐ VirtualServerRoute์˜ ๊ณตํ†ต ๋ถ€๋ถ„
3-1. Upstream
3-2. Upstream.Buffers
3-3. Upstream.TLS
3-4. Upstream.Queue
3-5. Upstream.Healthcheck
3-6. Upstream.SessionCookie
3-7. Header
3-8. Action
3-9. Action.Redirect
3-10. Action.Return
3-11. Action.Proxy
3-12. Action.Proxy.RequestHeaders
3-13. Action.Proxy.RequestHeaders.Set.Header
3-14. Action.Proxy.ResponseHeaders
3-15. AddHeader
3-16. Split
3-17. Match
3-18. Condition
3-19. ErrorPage
3-20. ErrorPage.Redirect
3-21. ErrorPage.Return
3-22. ErrorPage.Return.Header
4.VirtualServer ๋ฐ VirtualServerRoute ์‚ฌ์šฉ
4-1. Snippets ์‚ฌ์šฉ
4-2. ๊ฒ€์ฆ
4-3. ๊ตฌ์กฐ ๊ฒ€์ฆ
4-4. ํฌ๊ด„์  ๊ฒ€์ฆ
5.ConfigMap์„ ํ†ตํ•œ ์‚ฌ์šฉ์ž ์ •์˜

1. VirtualServer ์‚ฌ์–‘

VirtualServer ๋ฆฌ์†Œ์Šค๋Š” example.com๊ณผ ๊ฐ™์€ ๋„๋ฉ”์ธ ์ด๋ฆ„์— ๋Œ€ํ•œ Load Balancing ๊ตฌ์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: cafe
spec:
  host: cafe.example.com
  tls:
    secret: cafe-secret
  upstreams:
  - name: tea
    service: tea-svc
    port: 80
  - name: coffee
    service: coffee-svc
    port: 80
  routes:
  - path: /tea
    action:
      pass: tea
  - path: /coffee
    action:
      pass: coffee
  - path: ~ ^/decaf/.*\\.jpg$
    action:
      pass: coffee
  - path: = /green/tea
    action:
      pass: tea
Field์„ค๋ช…TypeRequired
host์„œ๋ฒ„์˜ ํ˜ธ์ŠคํŠธ(๋„๋ฉ”์ธ ์ด๋ฆ„)์ž…๋‹ˆ๋‹ค. my-app ๋˜๋Š” hello.example.com๊ณผ ๊ฐ™์ด RFC 1123์— ์ •์˜๋œ ์œ ํšจํ•œ ํ•˜์œ„ ๋„๋ฉ”์ธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. *.example.com๊ณผ ๊ฐ™์€ ์™€์ผ๋“œ ์นด๋“œ ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋„๋ฉ”์ธ์„ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. host ๊ฐ’์€ ๋ชจ๋“  Ingress ๋ฐ VirtualServer ๋ฆฌ์†Œ์Šค์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ๋ฐ Listener ์ถฉ๋Œ ์ฒ˜๋ฆฌ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.stringYes
tlsTLS termination ๊ตฌ์„ฑ.tlsNo
externalDNSVirtualServer์˜ externalDNS ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.externalDNSNo
dosDosProtectedResource์— ๋Œ€ํ•œ ์ฐธ์กฐ๋กœ ์„ค์ •ํ•˜๋ฉด VirtualServer์˜ DOS ๋ณดํ˜ธ๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.stringNo
policies์ •์ฑ… ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.[]policyNo
upstreamsUpstream ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.[]upstreamNo
routes๋ฃจํŠธ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.[]routeNo
ingressClassNameVirtualServer ๋ฆฌ์†Œ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” Ingress Controller๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.stringNo
http-snippetshttp Context์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ snippet์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.stringNo
server-snippetsserver Context์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ snippet์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. server-snippets ConfigMap Key๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.stringNo

1-1. VirtualServer.TLS

tls ํ•„๋“œ๋Š” VirtualServer์— ๋Œ€ํ•œ TLS ๊ตฌ์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

secret: cafe-secret
redirect:
  enable: true
Field์„ค๋ช…TypeRequired
secretTLS ์ธ์ฆ์„œ ๋ฐ Key๊ฐ€ ์žˆ๋Š” Secret์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. Secret๋Š” VirtualServer์™€ ๋™์ผํ•œ Namespace์— ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ Secret์€ kubernetes.io/tls ์œ ํ˜•์ด์–ด์•ผ ํ•˜๋ฉฐ ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ์ธ์ฆ์„œ์™€ ๊ฐœ์ธ Key๋ฅผ ํฌํ•จํ•˜๋Š” tls.crt ๋ฐ tls.key๋ผ๋Š” Key๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Secret์ด ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ NGINX๋Š” VirtualServer์˜ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ TLS ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋ ค๋Š” ๋ชจ๋“  ์‹œ๋„๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. Secret๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜์ง€๋งŒ wildcard TLS secret๊ฐ€ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ NGINX๋Š” TLS Termination์— ์™€์ผ๋“œ ์นด๋“œ Secret๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.stringNo
redirectVirtualServer์— ๋Œ€ํ•œ TLS์˜ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.tls.redirectNo
cert-managerVirtualServer์— ๋Œ€ํ•œ TLS์˜ cert-manager ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.tls.cert-managerNo

1-2. VirtualServer.TLS.Redirect

Redirect ํ•„๋“œ๋Š” VirtualServer์— ๋Œ€ํ•œ TLS Redirect์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

enable: true
code: 301
basedOn: scheme
Field์„คTypeRequired
enableVirtualServer์— ๋Œ€ํ•œ TLS ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ False์ž…๋‹ˆ๋‹ค.booleanNo
code๋ฆฌ๋‹ค์ด๋ ‰์…˜์˜ ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’์€ 301 , 302 , 307 , 308์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 301์ž…๋‹ˆ๋‹ค.intNo
basedOnNGINX๊ฐ€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ํ‰๊ฐ€ํ•  ์š”์ฒญ์˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’์€ scheme(์š”์ฒญ์˜ scheme) ๋˜๋Š” x-forwarded-proto(์š”์ฒญ์˜ X-Forwarded-Proto ํ—ค๋”)์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ scheme์ž…๋‹ˆ๋‹ค.stringNo

1-3. VirtualServer.TLS.CertManager

cert-manager ํ•„๋“œ๋Š” cert-manager(cert-manager.io)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ VirtualServer ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ x509 ์ž๋™ ์ธ์ฆ์„œ ๊ด€๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐœ๊ธ‰์ž ๋ฐฐํฌ ๋ฐ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ cert-manager ๊ตฌ์„ฑ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์˜ˆ:

cert-manager:
  cluster-issuer: "my-issuer-name"
FieldDescriptionTypeRequired
issuerIssuer์˜ ์ด๋ฆ„. Issuer๋Š” ์ธ์ฆ์„œ์— ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ๊ธฐ๊ด€์„ ์„ค๋ช…ํ•˜๋Š” ์ธ์ฆ์„œ ๊ด€๋ฆฌ์ž ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค. Issuer๋Š” VirtualServer ๋ฆฌ์†Œ์Šค์™€ ๋™์ผํ•œ Namespace์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. issuer ๋ฐ cluster-issuer ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ด๋ฏ€๋กœ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringNo
cluster-issuerClusterIssuer์˜ ์ด๋ฆ„. ClusterIssuer๋Š” ์ธ์ฆ์„œ์— ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ๊ธฐ๊ด€์„ ์„ค๋ช…ํ•˜๋Š” ์ธ์ฆ์„œ ๊ด€๋ฆฌ์ž ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ClusterIssuer๋Š” Namespace๊ฐ€ ์—†๋Š” ๋ฆฌ์†Œ์Šค์ด๋ฏ€๋กœ VirtualServer๊ฐ€ ์ƒ์ฃผํ•˜๋Š” Namespace๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. issuer ๋ฐ cluster-issuer ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ด๋ฏ€๋กœ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringNo
issuer-kind์™ธ๋ถ€ Issuer ๋ฆฌ์†Œ์Šค์˜ ์ข…๋ฅ˜(์˜ˆ: AWSPCAIssuer)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŠธ๋ฆฌ ์™ธ๋ถ€ Issuer์—๊ฒŒ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. cluster-issuer๋„ ์ •์˜๋œ ๊ฒฝ์šฐ์—๋Š” ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.stringNo
issuer-group์™ธ๋ถ€ Issuer Controller์˜ API ๊ทธ๋ฃน(์˜ˆ: awspca.cert-manager.io)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํŠธ๋ฆฌ ์™ธ๋ถ€ Issuer์—๊ฒŒ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. cluster-issuer๋„ ์ •์˜๋œ ๊ฒฝ์šฐ์—๋Š” ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.stringNo
common-name์ด ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑํ•  ์ธ์ฆ์„œ์— ๋Œ€ํ•œ spec.commonName์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์€ x509 ์ธ์ฆ์„œ์— CN์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.stringNo
duration์ด ํ•„๋“œ์—์„œ๋Š” ์ƒ์„ฑํ•  ์ธ์ฆ์„œ์— ๋Œ€ํ•œ spec.duration ํ•„๋“œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go time.Duration ๋ฌธ์ž์—ด ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ d(์ผ) ์ ‘๋ฏธ์‚ฌ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  s, m ๋ฐ h ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringNo
renew-before์ด Annotation์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑํ•  ์ธ์ฆ์„œ์— ๋Œ€ํ•œ spec.renewBefore ํ•„๋“œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go time.Duration ๋ฌธ์ž์—ด ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ d(์ผ) ์ ‘๋ฏธ์‚ฌ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  s, m ๋ฐ h ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringNo
usages์ด ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑํ•  ์ธ์ฆ์„œ์— ๋Œ€ํ•œ spec.usages ํ•„๋“œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๊ฐ’(์˜ˆ: key agreement, digital signature, server auth)์ด ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” Key ์‚ฌ์šฉ์˜ ์ „์ฒด ๋ชฉ๋ก์€ cert-manager api ๋ฌธ์„œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.stringNo

1-4. VirtualServer.ExternalDNS

externalDNS ํ•„๋“œ๋Š” ExternalDNS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ VirtualServer ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ๋™์ ์œผ๋กœ ์ œ์–ดํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ExternalDNS ๋ฐ ๊ณต๊ธ‰์ž ๋ฐฐํฌ ๋ฐ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ExternalDNS ๊ตฌ์„ฑ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ์‹œ:

enable: true
Field์„ค๋ช…TypeRequired
enableVirtualServer ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ExternalDNS ํ†ตํ•ฉ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.stringNo
labelsExternalDNS์—์„œ ์‚ฌ์šฉํ•  Endpoint ๋ฆฌ์†Œ์Šค์— ์ ์šฉํ•  Label์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.map[string]stringNo
providerSpecific๊ฐœ๋ณ„ DNS ๊ณต๊ธ‰์ž์— ํŠน์ •ํ•œ ๊ตฌ์„ฑ์˜ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ๋ณด์œ ํ•˜๋Š” ๊ณต๊ธ‰์ž๋ณ„ ์†์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.[]ProviderSpecificNo
recordTTLDNS ๋ ˆ์ฝ”๋“œ์šฉ TTL์ž…๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค. ์—…์ฒด๋ณ„ ๊ธฐ๋ณธ๊ฐ’์€ ExternalDNS TTL ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.int64No
recordType์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์˜ˆ: “A”, “AAAA”, “CNAME”. ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์™ธ๋ถ€ Endpoint๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.stringNo

1-5. VirtualServer.ExternalDNS.ProviderSpecific

externalDNS ๋ธ”๋ก์˜ providerSpecific ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ณ„ DNS ์ œ๊ณต์ž์— ๊ณ ์œ ํ•œ ๊ตฌ์„ฑ์˜ Key Value ์Œ ๋ชฉ๋ก์ธ ์ œ๊ณต์ž ํŠน์ • ์†์„ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

- name: my-name
  value: my-value
- name: my-name2
  value: my-value2
Field์„ค๋ช…TypeRequired
nameKey Value ์Œ์˜ name์ž…๋‹ˆ๋‹ค.stringYes
valueKey Value ์Œ์˜ value์ž…๋‹ˆ๋‹ค.stringYes

1-6. VirtualServer.Policy

policy ํ•„๋“œ๋Š” ์ด๋ฆ„๊ณผ ์„ ํƒ์  Namespace๋กœ ์ •์ฑ… ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

name: access-control
Field์„ค๋ช…TypeRequired
name์ •์ฑ…์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ •์ฑ…์ด ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ NGINX๋Š” 500 ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ์˜ค๋ฅ˜ ์‘๋‹ต์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.stringYes
namespace์ •์ฑ…์˜ Namespace์ž…๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด VirtualServer ๋ฆฌ์†Œ์Šค์˜ Namespace๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.stringNo

1-7. VirtualServer.Route

Route๋Š” ์š”์ฒญ์„ Upstream์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์— ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ผ์น˜์‹œํ‚ค๋Š” ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

  path: /tea
  action:
    pass: tea
Field์„ค๋ช…TypeRequired
pathroute์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. NGINX๋Š” ์š”์ฒญ์˜ URI์™€ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ( / , /path ), ์ •ํ™•ํ•œ ์ผ์น˜( =/exact/match ), ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ •๊ทœ์‹(~*^/Bar.*\.jpg ) ๋˜๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ •๊ทœ์‹(~^/foo.*\.jpg ). ์ ‘๋‘์‚ฌ(/๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ) ๋˜๋Š” ์ •ํ™•ํžˆ ์ผ์น˜(=๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ)์˜ ๊ฒฝ์šฐ ๊ฒฝ๋กœ์— ๊ณต๋ฐฑ ๋ฌธ์ž({ , } ๋˜๋Š” ;)๊ฐ€ ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ •๊ทœ์‹ ์ผ์น˜์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ํฐ๋”ฐ์˜ดํ‘œ๋Š” " ์ด์Šค์ผ€์ดํ”„๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ผ์น˜๋Š” ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐฑ์Šฌ๋ž˜์‹œ \๋กœ ๋๋‚  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๋Š” VirtualServer์˜ ๋ชจ๋“  ๊ฒฝ๋กœ ๊ฒฝ๋กœ ์ค‘์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ location ์ง€์‹œ๋ฌธ์„ ํ™•์ธํ•˜์„ธ์š”. .stringYes
policies์ •์ฑ… ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์ •์ฑ…์€ VirtualServer์˜ spec์— ์ •์˜๋œ ๋™์ผํ•œ ์œ ํ˜•์˜ ์ •์ฑ…์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ •์ฑ… ์ ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.[]policyNo
action์š”์ฒญ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ๊ธฐ๋ณธ ์ž‘์—…์ž…๋‹ˆ๋‹ค.actionNo
dosDosProtectedResource์— ๋Œ€ํ•œ ์ฐธ์กฐ๋กœ ์„ค์ •ํ•˜๋ฉด VirtualServer ๊ฒฝ๋กœ์˜ DOS ๋ณดํ˜ธ๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.stringNo
splitsํŠธ๋ž˜ํ”ฝ ๋ถ„ํ• ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ถ„ํ•  ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ์ตœ์†Œ 2๊ฐœ์˜ ๋ถ„ํ• ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.[]splitNo
matches๊ณ ๊ธ‰ ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ์œ„ํ•œ ์ผ์น˜ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ actionย  ๋˜๋Š” splits์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ์€ ๊ธฐ๋ณธ actionย  ๋˜๋Š” splits๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.matchesNo
route์ด ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” VirtualServerRoute ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. VirtualServerRoute๊ฐ€ VirtualServer์™€ ๋‹ค๋ฅธ Namespace์— ์†ํ•˜๋Š” ๊ฒฝ์šฐ Namespace๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: tea-namespace/tea.stringNo
errorPages์˜ค๋ฅ˜ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์ž…๋‹ˆ๋‹ค. NGINX๋Š” Upstream ์„œ๋ฒ„์˜ ์˜ค๋ฅ˜ ์‘๋‹ต์ด๋‚˜ NGINX์—์„œ ์ƒ์„ฑํ•œ ๊ธฐ๋ณธ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ํ•ด๋‹น ์‘๋‹ต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋˜๋Š” ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ์‘๋‹ต์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Upstream ์„œ๋ฒ„๊ฐ€ 404 ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ URL๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค.[]errorPageNo
location-snippetslocation Context์—์„œ ๋งž์ถค Snippet์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. location-snippets ConfigMap Key๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.stringNo

* โ€“ ๊ฒฝ๋กœ์—๋Š” action, splits ๋˜๋Š” route ์ค‘ ํ•˜๋‚˜๋ฅผ ์ •ํ™•ํžˆ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. VirtualServerRoute ์‚ฌ์–‘

VirtualServerRoute ๋ฆฌ์†Œ์Šค๋Š” VirtualServer์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜ ๋˜๋Š” ์—ฌ๋Ÿฌ ํ•˜์œ„ ๊ฒฝ๋กœ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. VirtualServerRoute๋Š” Mergeable Ingress Type์˜ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ Namespace cafe-ns์˜ VirtualServer cafa๋Š” ๊ฒฝ๋กœ /coffee๊ฐ€ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ์ด๋Š” Namespace coffee-ns์˜ VirtualServerRoute coffee์—์„œ ์ถ”๊ฐ€๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

VirtualServer:

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: cafe
  namespace: cafe-ns
spec:
  host: cafe.example.com
  upstreams:
  - name: tea
    service: tea-svc
    port: 80
  routes:
  - path: /tea
    action:
      pass: tea
  - path: /coffee
    route: coffee-ns/coffee

VirtualServerRoute:

apiVersion: k8s.nginx.org/v1
kind: VirtualServerRoute
metadata:
  name: coffee
  namespace: coffee-ns
spec:
  host: cafe.example.com
  upstreams:
  - name: latte
    service: latte-svc
    port: 80
  - name: espresso
    service: espresso-svc
    port: 80
  subroutes:
  - path: /coffee/latte
    action:
      pass: latte
  - path: /coffee/espresso
    action:
      pass: espresso

๊ฐ ํ•˜์œ„ path์—๋Š” VirtualServer์˜ ๊ฒฝ๋กœ์— ์ •์˜๋œ ๋™์ผํ•œ ์ ‘๋‘์‚ฌ(์—ฌ๊ธฐ์„œ๋Š” /coffee)๋กœ ์‹œ์ž‘ํ•˜๋Š” Route๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ VirtualServerRoute์˜ host๋Š” VirtualServer์˜ host์™€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Field์„ค๋ช…TypeRequired
host์„œ๋ฒ„์˜ ํ˜ธ์ŠคํŠธ(๋„๋ฉ”์ธ ์ด๋ฆ„)์ž…๋‹ˆ๋‹ค. my-app ๋˜๋Š” hello.example.com๊ณผ ๊ฐ™์ด RFC 1123์— ์ •์˜๋œ ์œ ํšจํ•œ ํ•˜์œ„ ๋„๋ฉ”์ธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. *.example.com๊ณผ ๊ฐ™์€ ์™€์ผ๋“œ ์นด๋“œ ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋„๋ฉ”์ธ์„ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” VirtualServer์˜ host์™€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringYes
upstreamsUpstreams ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.[]upstreamNo
subroutesํ•˜์œ„ ๊ฒฝ๋กœ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.[]subrouteNo
ingressClassNameVirtualServerRoute ๋ฆฌ์†Œ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” Ingress Controller๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” VirtualServer์˜ ingressClassName๊ณผ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.string_No

2-1. VirtualServerRoute.Subroute

ํ•˜์œ„ ๊ฒฝ๋กœ๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ Upstream์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์— ์ผ์น˜์‹œํ‚ค๋Š” ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

path: /coffee
action:
  pass: coffee
Field์„ค๋ช…TypeRequired
pathsubroute์˜ path์ž…๋‹ˆ๋‹ค. NGINX๋Š” ์š”์ฒญ์˜ URI์™€ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ( / , /path ), ์ •ํ™•ํ•œ ์ผ์น˜( =/exact/match ), ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ •๊ทœ์‹( ย ~*^/Bar.*\.jp ) ๋˜๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ •๊ทœ์‹(ย ~^/foo.*\.jpg ). ์ ‘๋‘์‚ฌ์˜ ๊ฒฝ์šฐ ๊ฒฝ๋กœ๋Š” ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” VirtualServer์˜ route path์™€ ๋™์ผํ•œ path๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์ผ์น˜ ๋˜๋Š” ์ •๊ทœ์‹ ์ผ์น˜์˜ ๊ฒฝ์šฐ ๊ฒฝ๋กœ๋Š” ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” VirtualServer์˜ route path์™€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ ๋˜๋Š” ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ path์— ๊ณต๋ฐฑ ๋ฌธ์ž({ , } ๋˜๋Š” ;)๊ฐ€ ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ •๊ทœ์‹ ์ผ์น˜์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ํฐ๋”ฐ์˜ดํ‘œ " ๋Š” ์ด์Šค์ผ€์ดํ”„๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ผ์น˜๋Š” ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐฑ์Šฌ๋ž˜์‹œ \๋กœ ๋๋‚  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. path๋Š” VirtualServerRoute์˜ ๋ชจ๋“  ํ•˜์œ„ path์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringYes
policies์ •์ฑ… ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์ •์ฑ…์€ ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” VirtualServer์˜ ๊ฒฝ๋กœ์— ์ •์˜๋œ ๋ชจ๋“  ์ •์ฑ…์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ •์ฑ…์€ ๋˜ํ•œ VirtualServer์˜ spec์— ์ •์˜๋œ ๋™์ผํ•œ ์œ ํ˜•์˜ ์ •์ฑ…์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ •์ฑ… ์ ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.[]policyNo
action์š”์ฒญ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ๊ธฐ๋ณธ ์ž‘์—…์ž…๋‹ˆ๋‹ค.actionNo
dosDosProtectedResource์— ๋Œ€ํ•œ ์ฐธ์กฐ๋กœ ์ด๋ฅผ ์„ค์ •ํ•˜๋ฉด VirtualServerRoute ํ•˜์œ„ ๊ฒฝ๋กœ์˜ DOS ๋ณดํ˜ธ๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.stringNo
splitsํŠธ๋ž˜ํ”ฝ ๋ถ„ํ• ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ถ„ํ•  ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ์ตœ์†Œ 2๊ฐœ์˜ ๋ถ„ํ• ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.[]splitNo
matches๊ณ ๊ธ‰ ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ์œ„ํ•œ ์ผ์น˜ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ action ๋˜๋Š” splits์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ์€ ๊ธฐ๋ณธ action ๋˜๋Š” splits๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.matchesNo
errorPages์˜ค๋ฅ˜ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์ž…๋‹ˆ๋‹ค. NGINX๋Š” Upstream ์„œ๋ฒ„์˜ ์˜ค๋ฅ˜ ์‘๋‹ต์ด๋‚˜ NGINX์—์„œ ์ƒ์„ฑํ•œ ๊ธฐ๋ณธ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ํ•ด๋‹น ์‘๋‹ต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋˜๋Š” ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ์‘๋‹ต์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Upstream ์„œ๋ฒ„๊ฐ€ 404 ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ URL๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค.[]errorPageNo
location-snippets์œ„์น˜ Context์—์„œ ๋งž์ถค Snippet์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. VirtualServer(์„ค์ •๋œ ๊ฒฝ์šฐ)์˜ location-snippets ๋˜๋Š” location-snippets ConfigMap Key๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.stringNo

* โ€“ ํ•˜์œ„ ๊ฒฝ๋กœ๋Š” action ๋˜๋Š” splits ์ค‘ ํ•˜๋‚˜๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. VirtualServer ๋ฐ VirtualServerRoute์˜ ๊ณตํ†ต ๋ถ€๋ถ„

3-1. Upstream

Upstream์€ ๋ผ์šฐํŒ… ๊ตฌ์„ฑ์˜ ๋Œ€์ƒ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

name: tea
service: tea-svc
subselector:
  version: canary
port: 80
lb-method: round_robin
fail-timeout: 10s
max-fails: 1
max-conns: 32
keepalive: 32
connect-timeout: 30s
read-timeout: 30s
send-timeout: 30s
next-upstream: "error timeout non_idempotent"
next-upstream-timeout: 5s
next-upstream-tries: 10
client-max-body-size: 2m
tls:
  enable: true

Note: WebSocket ํ”„๋กœํ† ์ฝœ์€ ์ถ”๊ฐ€ ๊ตฌ์„ฑ ์—†์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

FieldDescriptionTypeRequired
nameUpstream์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. RFC 1035์— ์ •์˜๋œ ์œ ํšจํ•œ DNS Label์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด hello ๋ฐ upstream-123์€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋ฆฌ์†Œ์Šค์˜ ๋ชจ๋“  Upstream์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringYes
service์„œ๋น„์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” ๋ฆฌ์†Œ์Šค์™€ ๋™์ผํ•œ Namespace์— ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ NGINX๋Š” ์„œ๋น„์Šค์— Endpoint๊ฐ€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด Upstream์— ๋Œ€ํ•œ ์š”์ฒญ์— ๋Œ€ํ•ด 502 ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. NGINX Plus์˜ ๊ฒฝ์šฐ์—๋งŒ ExternalName ์œ ํ˜•์˜ ์„œ๋น„์Šค๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค(์ „์ œ ์กฐ๊ฑด ํ™•์ธ).stringYes
subselectorLabel Key์™€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๋‚ด์˜ Pod๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋น„์Šค์˜ ๋ชจ๋“  Pod๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. Note: ์ง€์ •๋œ Label์€ ์ƒ์„ฑ๋  ๋•Œ Pod์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Pod Label์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด Ingress Controller๋Š” Pod ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.map[string]stringNo
use-cluster-ipPod์˜ IP ๋ฐ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ๋™์ž‘ ๋Œ€์‹  ์„œ๋น„์Šค์˜ ํด๋Ÿฌ์Šคํ„ฐ IP ๋ฐ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด Ingress Controller๊ฐ€ ์„œ๋น„์Šค ํด๋Ÿฌ์Šคํ„ฐ IP์™€ ์ผ์น˜ํ•˜๋Š” ํ•˜๋‚˜์˜ Upstream ์„œ๋ฒ„๋กœ๋งŒ NGINX๋ฅผ ๊ตฌ์„ฑํ•˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ Upstream ์„œ๋ฒ„์™€ ๊ด€๋ จ๋œ NGINX ๋™์ž‘์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•„๋“œ(์˜ˆ: lb-method ๋ฐ next-upstream)๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.booleanNo
port์„œ๋น„์Šค์˜ ํฌํŠธ์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ํ•ด๋‹น ํฌํŠธ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด NGINX๋Š” ์„œ๋น„์Šค์— Endpoint๊ฐ€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด Upstream์— ๋Œ€ํ•œ ์š”์ฒญ์— ๋Œ€ํ•ด 502 ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํฌํŠธ๋Š” 1..65535 ๋ฒ”์œ„์— ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.uint16Yes
lb-methodLoad Balancing ๋งค์„œ๋“œ์ž…๋‹ˆ๋‹ค. ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด round_robin์„ ์ง€์ •ํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ lb-method ConfigMap Key์— ์ง€์ •๋ฉ๋‹ˆ๋‹ค.stringNo
fail-timeout์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ์œ„ํ•ด Upstream ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์„ ์‹œ๋„ํ•˜๋Š”๋ฐ ์ง€์ •๋œ ํšŸ์ˆ˜๋งŒํผ ์‹คํŒจํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. sever ์ง€์‹œ๋ฌธ์˜ fail_timeout ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ fail-timeout ConfigMap Key์— ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.stringNo
max-fails์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜๊ธฐ ์œ„ํ•ด fail-timeout ์—์„œ ์„ค์ •ํ•œ ๊ธฐ๊ฐ„ ๋‚ด์— ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” Pustream ์„œ๋ฒ„์™€์˜ ํ†ต์‹  ์‹œ๋„ ์‹คํŒจ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. server ์ง€์‹œ๋ฌธ์˜ max_fails ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ max-fails ConfigMap Key์— ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.intNo
max-connsUpstream ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ตœ๋Œ€ ๋™์‹œ ํ™œ์„ฑ ์—ฐ๊ฒฐ ์ˆ˜์ž…๋‹ˆ๋‹ค. server ์ง€์‹œ๋ฌธ์˜ max_conns ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. Note: keepalive ์—ฐ๊ฒฐ์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ Upstream ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ด ํ™œ์„ฑ ๋ฐ ์œ ํœด keepalive ์—ฐ๊ฒฐ ์ˆ˜๊ฐ€ max_conns ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.intNo
keepaliveUpstream ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์บ์‹œ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ ๊ฐ’์„ 0์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. keepalive ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ Keepailive ConfigMap Key์— ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.intNo
connect-timeoutUpstream ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. proxy_connect_timeout ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ proxy-connect-timeout ConfigMap Key์— ์ง€์ •๋ฉ๋‹ˆ๋‹ค.stringNo
read-timeoutUpstream ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ์ฝ๊ธฐ ์œ„ํ•œ ์ œํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. proxy_read_timeout ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ proxy-read-timeout ConfigMap Key์— ์ง€์ •๋ฉ๋‹ˆ๋‹ค.stringNo
send-timeoutUpstream ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. proxy_send_timeout ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ proxy-send-timeout ConfigMap Key์— ์ง€์ •๋ฉ๋‹ˆ๋‹ค.stringNo
next-upstream์š”์ฒญ์„ ๋‹ค์Œ Upstream ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. proxy_next_upstream ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ error timeout์ž…๋‹ˆ๋‹ค.stringNo
next-upstream-timeout์š”์ฒญ์ด ๋‹ค์Œ Upstream ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. proxy_next_upstream_timeout ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. 0 ๊ฐ’์€ ์‹œ๊ฐ„ ์ œํ•œ์„ ๋•๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.stringNo
next-upstream-tries์š”์ฒญ์„ ๋‹ค์Œ Upstream ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€๋Šฅํ•œ ์‹œ๋„ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. proxy_next_upstream_tries ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. 0 ๊ฐ’์€ ์ด ์ œํ•œ์„ ๋•๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.intNo
client-max-body-sizeํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ๋ณธ๋ฌธ์˜ ์ตœ๋Œ€ ํ—ˆ์šฉ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. client_max_body_size ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ client-max-body-size ConfigMap ํ‚ค์— ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.stringNo
tlsUpstream์— ๋Œ€ํ•œ TLS ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.tlsNo
healthCheckUpstream์— ๋Œ€ํ•œ Health Check ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. health_check ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. Note: ์ด ๊ธฐ๋Šฅ์€ NGINX Plus์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.healthcheckNo
slow-startSlow Start์„ ์‚ฌ์šฉํ•˜๋ฉด Upstream ์„œ๋ฒ„๊ฐ€ ๋ณต๊ตฌ๋˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง„ ํ›„ ๋˜๋Š” ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ ์ผ์ • ๊ธฐ๊ฐ„ ํ›„์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง€๋ฉด ๊ฐ€์ค‘์น˜๋ฅผ 0์—์„œ ๊ณต์นญ ๊ฐ’์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Slow Start์€ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. server ์ง€์‹œ๋ฌธ์˜ slow_start ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. Note: ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” random, hash ๋˜๋Š” ip_hash ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฐฉ๋ฒ•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.stringNo
queueUpstream์— ๋Œ€ํ•œ ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ Upstream ์„œ๋ฒ„๋ฅผ ์ฆ‰์‹œ ์„ ํƒํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด ์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์€ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Note: ์ด ๊ธฐ๋Šฅ์€ NGINX Plus์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.queueNo
bufferingUpstream ์„œ๋ฒ„์˜ ์‘๋‹ต ๋ฒ„ํผ๋ง์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. proxy_buffering ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ proxy_buffering ConfigMap ํ‚ค์— ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.booleanNo
buffers๋‹จ์ผ ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ Upstream ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฒ„ํผ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.buffersNo
buffer-sizeUpstream ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์‘๋‹ต์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. proxy_buffer_size ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ proxy-buffer-size ConfigMap ํ‚ค์— ์„ค์ •๋ฉ๋‹ˆ๋‹ค.stringNo
ntlmNTLM ์ธ์ฆ์œผ๋กœ Proxy ์š”์ฒญ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ntlm ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. NTLM ์ธ์ฆ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด keepalive ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Upstream ์„œ๋ฒ„์— ๋Œ€ํ•œ keepalive ์—ฐ๊ฒฐ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Note: ์ด ๊ธฐ๋Šฅ์€ NGINX Plus์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.booleanNo
typeUpstream์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๊ฐ’์€ http ๋ฐ grpc์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ http์ž…๋‹ˆ๋‹ค. gRPC์˜ ๊ฒฝ์šฐ ConfigMap์—์„œ HTTP/2๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ณ  VirtualServer์—์„œ TLS ์ข…๋ฃŒ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringNo

3-2. Upstream.Buffers

buffers ํ•„๋“œ๋Š” ๋‹จ์ผ ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ Upstream ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” Buffers๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

number: 4
size: 8K

์ž์„ธํ•œ ๋‚ด์šฉ์€ proxy_buffers ์ง€์นจ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Field์„ค๋ช…TypeRequired
number๋ฒ„ํผ ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ proxy-buffers ConfigMap Key์— ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.intYes
size๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ proxy-buffers ConfigMap Key์— ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.stringYes

3-3. Upstream.TLS

Field์„ค๋ช…TypeRequired
enableUpstream ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์— ๋Œ€ํ•ด HTTPS๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ False ์ด๋ฉฐ HTTP๊ฐ€ ์‚ฌ์šฉ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Note: ๊ธฐ๋ณธ์ ์œผ๋กœ NGINX๋Š” Upstream ์„œ๋ฒ„ ์ธ์ฆ์„œ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•์ธ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด EgressMTLS ์ •์ฑ…์„ ๊ตฌ์„ฑํ•˜์‹ญ์‹œ์˜ค.booleanNo

3-4. Upstream.Queue

queue ํ•„๋“œ๋Š” Queue์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ Upstream ์„œ๋ฒ„๋ฅผ ์ฆ‰์‹œ ์„ ํƒํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด Queue์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

size: 10
timeout: 60s

์ž์„ธํ•œ ๋‚ด์šฉ์€ Queue ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Note: ์ด ๊ธฐ๋Šฅ์€ NGINX Plus์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

Field์„ค๋ช…TypeRequired
sizeํ(Queue)์˜ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.intYes
timeoutํ(Queue)์˜ ์ œํ•œ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ œํ•œ ์‹œ๊ฐ„๋ณด๋‹ค ๊ธด ๊ธฐ๊ฐ„ ๋™์•ˆ ์š”์ฒญ์„ ๋Œ€๊ธฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 60์ดˆ์ž…๋‹ˆ๋‹ค.stringNo

3-5. Upstream.Healthcheck

Healthcheck๋Š” Active Health Check๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์—์„œ๋Š” Upstream์— ๋Œ€ํ•œ Health Check์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  Mandatory ๋ฐ Persistent์™€ ๊ฒฐํ•ฉ๋œ Slow-Start ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

name: tea
service: tea-svc
port: 80
slow-start: 30s
healthCheck:
  enable: true
  path: /healthz
  interval: 20s
  jitter: 3s
  fails: 5
  passes: 5
  port: 8080
  tls:
    enable: true
  connect-timeout: 10s
  read-timeout: 10s
  send-timeout: 10s
  headers:
  - name: Host
    value: my.service
  statusMatch: "! 500"
  mandatory: true
  persistent: true

Note: ์ด ๊ธฐ๋Šฅ์€ NGINX Plus์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

Field์„ค๋ช…TypeRequired
enableUpstream ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ƒํƒœ ํ™•์ธ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.booleanNo
pathHealth Check ์š”์ฒญ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ /์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ gRPC ์œ ํ˜• Upstream์— ๋Œ€ํ•ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.stringNo
interval์—ฐ์†๋œ ๋‘ Health Check ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 5s์ž…๋‹ˆ๋‹ค.stringNo
jitter๊ฐ Health Check๊ฐ€ ์ž„์˜๋กœ ์ง€์—ฐ๋˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์—ฐ์€ ์—†์Šต๋‹ˆ๋‹ค.stringNo
fails์ด ์„œ๋ฒ„๊ฐ€ ๋น„์ •์ƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ ํ›„ ํŠน์ • Upstream ์„œ๋ฒ„์˜ Health Check์— ์—ฐ์†์œผ๋กœ ์‹คํŒจํ•œ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.integerNo
passes์„œ๋ฒ„๊ฐ€ ์ •์ƒ ์ƒํƒœ๋กœ ๊ฐ„์ฃผ๋  ๋•Œ๊นŒ์ง€ ํŠน์ • Upstream ์„œ๋ฒ„์— ๋Œ€ํ•ด ์—ฐ์†์ ์œผ๋กœ ํ†ต๊ณผ๋œ Health Check ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.integerNo
portHealth Check ์š”์ฒญ์— ์‚ฌ์šฉ๋˜๋Š” ํฌํŠธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ server port๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ : Upstream์˜ ํฌํŠธ์™€ ๋‹ฌ๋ฆฌ ์ด ํฌํŠธ๋Š” ์„œ๋น„์Šค ํฌํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ Pod์˜ ํฌํŠธ์ž…๋‹ˆ๋‹ค.integerNo
tlsHealth Check ์š”์ฒญ์— ์‚ฌ์šฉ๋˜๋Š” TLS ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Upstream์˜ tls ํ•„๋“œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.upstream.tlsNo
connect-timeoutUpstream ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Upstream์˜ connect-timeout์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.stringNo
read-timeoutUpstream ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ์ฝ๊ธฐ ์œ„ํ•œ ์ œํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Upstream์˜ read-timeout์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.stringNo
send-timeoutUpstream ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Upstream์˜ send-timeout์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.stringNo
headersHealth Check ์š”์ฒญ์— ์‚ฌ์šฉ๋˜๋Š” ์š”์ฒญ ํ—ค๋”์ž…๋‹ˆ๋‹ค. NGINX Plus๋Š” ํ•ญ์ƒ Health Check ์š”์ฒญ์„ ์œ„ํ•ด Host, ์‚ฌ์šฉ์ž User-Agent ๋ฐ Connection ํ—ค๋”๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.[]headerNo
statusMatchHealth Check์˜ ์˜ˆ์ƒ ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์‘๋‹ต์—๋Š” ์ƒํƒœ ์ฝ”๋“œ 2xx ๋˜๋Š” 3xx๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: '200' , '! 500' , '301-303 307'. match ์ง€์‹œ์–ด ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. gRPC ์œ ํ˜• Upstream์—๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.stringNo
grpcStatusCheck method์— ๋Œ€ํ•œ Upstream ์„œ๋ฒ„ ์‘๋‹ต์˜ ์˜ˆ์ƒ gRPC status code์ž…๋‹ˆ๋‹ค. gRPC ์„œ๋น„์Šค๊ฐ€ gRPC Health Check ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด ํ•„๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด Upstream ์„œ๋ฒ„๊ฐ€ 12(UNIMPLEMENTED) ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•˜๋Š” ๊ฒฝ์šฐ 12๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. gRPC ์œ ํ˜• Upstream์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.intNo
grpcServiceUpstream ์„œ๋ฒ„์—์„œ ๋ชจ๋‹ˆํ„ฐ๋งํ•  gRPC ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. gRPC ์œ ํ˜• Upstream์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.stringNo
mandatoryNGINX Plus๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•˜๊ธฐ ์ „์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ๊ตฌ์„ฑ๋œ ๋ชจ๋“  Health Check์„ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ false๋กœ ์„ค์ •ํ•˜๋ฉด ์ฒ˜์Œ์—๋Š” ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. Slow-Start๊ณผ ๊ฒฐํ•ฉํ•˜๋ฉด ์ƒˆ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  ์ „์ฒด ํŠธ๋ž˜ํ”ฝ ๊ณต์œ ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›๊ธฐ ์ „์— “Warm Up”ํ•  ์ˆ˜ ์žˆ๋Š” ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.boolNo
persistentReloadํ•˜๊ธฐ ์ „์— ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ ๊ฒฝ์šฐ Reloadํ•œ ํ›„ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ดˆ๊ธฐ “Up” ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜๊ตฌ์ ์œผ๋กœ ์‚ฌ์šฉ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋„ true๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.boolNo

3-6. Upstream.SessionCookie

SessionCookie ํ•„๋“œ๋Š” ๋™์ผํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋™์ผํ•œ Upstream ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์„ธ์…˜ ์ง€์†์„ฑ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ Upstream ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ •๋ณด๋Š” NGINX Plus์—์„œ ์ƒ์„ฑ๋œ ์„ธ์…˜ Cookie์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ๋Š” Upstream์— ๋Œ€ํ•œ ์„ธ์…˜ Cookie๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜ ์ง€์†์„ฑ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

name: tea
service: tea-svc
port: 80
sessionCookie:
  enable: true
  name: srv_id
  path: /
  expires: 1h
  domain: .example.com
  httpOnly: false
  secure: true

์ถ”๊ฐ€ ์ •๋ณด๋Š” sticky ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. Session Cookie๋Š” sticky cookie ๋ฐฉ๋ฒ•์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

Note: ์ด ๊ธฐ๋Šฅ์€ NGINX Plus์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

Field์„ค๋ช…TypeRequired
enableUpstream ์„œ๋ฒ„์— ๋Œ€ํ•œ ์„ธ์…˜ Cookie๋กœ ์„ธ์…˜ ์ง€์†์„ฑ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.booleanNo
nameCookie์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.stringYes
pathCookie๊ฐ€ ์„ค์ •๋œ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.stringNo
expires๋ธŒ๋ผ์šฐ์ €๊ฐ€ Cookie๋ฅผ ๋ณด๊ด€ํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. Cookie๊ฐ€ 2037๋…„ 12์›” 31์ผ 23:55:55 GMT์— ๋งŒ๋ฃŒ๋˜๋„๋ก ํ•˜๋Š” ํŠน์ˆ˜ ๊ฐ’ max๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.stringNo
domainCookie๊ฐ€ ์„ค์ •๋œ ๋„๋ฉ”์ธ์ž…๋‹ˆ๋‹ค.stringNo
httpOnlyCookie์— HttpOnly ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.booleanNo
secureCookie์— Secure ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.booleanNo

3-7. Header

header๋Š” HTTP Header๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

name: Host
value: example.com
FieldDescriptionTypeRequired
nameํ—ค๋”์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.stringYes
valueํ—ค๋”์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.stringNo

3-8. Action

action์€ ์š”์ฒญ์— ๋Œ€ํ•ด Action ์ž‘์—…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์€ Upstream coffe๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

 path: /coffee
 action:
  pass: coffee
Field์„ค๋ช…TypeRequired
pass์š”์ฒญ์„ Upstream์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ด๋ฆ„์˜ Upstream์„ ๋ฆฌ์†Œ์Šค์— ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringNo
redirect์š”์ฒญ์„ ์ œ๊ณต๋œ URL๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค.action.redirectNo
return๋ฏธ๋ฆฌ ๊ตฌ์„ฑ๋œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.action.returnNo
proxy์š”์ฒญ/์‘๋‹ต์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ(์˜ˆ: URI ์žฌ์ž‘์„ฑ ๋˜๋Š” ํ—ค๋” ์ˆ˜์ •)์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ Upstream์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.action.proxyNo

* โ€“ ์ž‘์—…์—๋Š” pass, redirect, return ๋˜๋Š” proxy ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ •ํ™•ํžˆ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3-9. Action.Redirect

redirect ์ž‘์—…์€ ์š”์ฒญ์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜ํ•  Redirect์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด http://www.nginx.com URL๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค:

redirect:
  url: http://www.nginx.com
  code: 301
Field์„คTypeRequired
url์š”์ฒญ์„ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•  URL์ž…๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” NGINX ๋ณ€์ˆ˜: $scheme , $http_x_forwarded_proto , $request_uri , $host ๋ณ€์ˆ˜๋Š” ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ${host}${request_uri}.stringYes
code๋ฆฌ๋‹ค์ด๋ ‰์…˜์˜ ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’์€ 301, 302, 307, 308์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 301์ž…๋‹ˆ๋‹ค.intNo

3-10. Action.Return

return ์ž‘์—…์€ ์š”์ฒญ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ๊ตฌ์„ฑ๋œ ์‘๋‹ต์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ NGINX๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์‚ฌ์ „ ๊ตฌ์„ฑ๋œ ์‘๋‹ต์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค:

return:
  code: 200
  type: text/plain
  body: "Hello World\n"
Field์„ค๋ช…TypeRequired
code์‘๋‹ต์˜ ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’์€ 2XX, 4XX ๋˜๋Š” 5XX์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 200์ž…๋‹ˆ๋‹ค.intNo
type์‘๋‹ต์˜ MIME ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ text/plain์ž…๋‹ˆ๋‹ค.stringNo
body์‘๋‹ต์˜ ๋ณธ๋ฌธ์ž…๋‹ˆ๋‹ค. NGINX ๋ณ€์ˆ˜*๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ์š”์ฒญ์€ ${request_uri}\n์ž…๋‹ˆ๋‹ค.stringYes

* โ€“ ์ง€์›๋˜๋Š” NGINX ๋ณ€์ˆ˜: $request_uri, $request_method, $request_body, $http_, $args, $args, $arg_, $cookie_, $host, $request_time, $request_length, $nginx_vers, $pid, $remote_addr, $remote_port, $time_iso8601, $time_local, $readdr, $re, $readdr, $servers_connection, $connections_writing ๋ฐ $connections_delays.

3-11. Action.Proxy

proxy ์ž‘์—…์€ ์š”์ฒญ/์‘๋‹ต์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ(์˜ˆ: URI Rewrite ๋˜๋Š” ํ—ค๋” ์ˆ˜์ •)์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ Upstream์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” ์š”์ฒญ URI๊ฐ€ /๋กœ ๋‹ค์‹œ ์ž‘์„ฑ๋˜๊ณ  ์š”์ฒญ ๋ฐ ์‘๋‹ต ํ—ค๋”๊ฐ€ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค:

proxy:
  upstream: coffee
  requestHeaders:
    pass: true
    set:
    - name: My-Header
      value: Value
    - name: Client-Cert
      value: ${ssl_client_escaped_cert}
  responseHeaders:
    add:
    - name: My-Header
      value: Value
    - name: IC-Nginx-Version
      value: ${nginx_version}
      always: true
    hide:
    - x-internal-version
    ignore:
    - Expires
    - Set-Cookie
    pass:
    - Server
  rewritePath: /
Field์„ค๋ช…TypeRequired
upstream์š”์ฒญ์ด Proxy๋  Upstream์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ด๋ฆ„์˜ Upstream์ด ๋ฆฌ์†Œ์Šค์— ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringYes
requestHeaders์š”์ฒญ ํ—ค๋” ์ˆ˜์ • ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.action.Proxy.RequestHeadersNo
responseHeaders์‘๋‹ต ํ—ค๋” ์ˆ˜์ • ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.action.Proxy.ResponseHeadersNo
rewritePath์žฌ์ž‘์„ฑ๋œ URI์ž…๋‹ˆ๋‹ค. ๋ฃจํŠธ ๊ฒฝ๋กœ๊ฐ€ ~๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ •๊ทœ์‹์ธ ๊ฒฝ์šฐ, rewritePath์—๋Š” $1-9์˜ ์บก์ฒ˜ ๊ทธ๋ฃน์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฒซ ๋ฒˆ์งธ ๊ทธ๋ฃน์— $1 ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์‹œ ์“ฐ๊ธฐ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.stringNo

3-12. Action.Proxy.RequestHeaders

RequestHeaders ํ•„๋“œ๋Š” Proxy Upstream ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ ํ—ค๋”๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

Field์„ค๋ช…TypeRequired
pass์›๋ž˜ ์š”์ฒญ ํ—ค๋”๋ฅผ Proxy Upstream ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ proxy_pass_request_header ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.boolNo
setProxy Upstream ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋œ ์š”์ฒญ ํ—ค๋”๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํ•„๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ proxy_set_header ์ง€์‹œ๋ฌธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.[]headerNo

3-13. Action.Proxy.RequestHeaders.Set.Header

header๋Š” HTTP Header๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

name: My-Header
value: My-Value

Ingress Controller๊ฐ€ $host๋กœ ์„ค์ •ํ•˜๋Š” Host ํ—ค๋”์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

name: Host
value: example.com
Field์„ค๋ช…TypeRequired
nameํ—ค๋”์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.stringYes
valueํ—ค๋”์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. NGINX ๋ณ€์ˆ˜*๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ${scheme}.stringNo

* โ€“ ์ง€์›๋˜๋Š” NGINX ๋ณ€์ˆ˜: $request_uri, $request_method, $request_body, $http_, $args, $args, $arg_, $cookie_, $host, $request_time, $request_length, $nginx_vers, $pid, $remote_addr, $remote_port, $time_iso8601, $time_local, $readdr, $re, $readdr, $servers_connection, $connections_writing, $connections_dn, $ssl_dn, $ssl_client_cert, $ssl_client_dn, $ssl_client_dn_fingerprint, $ssl_client_writing, $ssl_client_dn, $ssl_client_dn_dn, $ssl_client_dn_dn_dn, $ssl_client_dn, $ssl_dn_client_dn_client_dn, $ssl_dn_dn, $ss, $ssl_curves, $ssl_early_data, $ssl_protocol, $ssl_server_name, $ssl_session_id, $ssl_session_reuse, $jwt_claim_(NGINX Plus ์ „์šฉ) ๋ฐ $jwt_header_(NGINX Plus ์ „์šฉ).

3-14. Action.Proxy.ResponseHeaders

ResponseHeaders ํ•„๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์‘๋‹ต์˜ ํ—ค๋”๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

Field์„ค๋ช…TypeRequired
hideProxy Upstream ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”* ํ—ค๋”์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ proxy_hide_header ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”.[]stringNo
passProxy Upstream ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ˆจ๊ฒจ์ง„ ํ—ค๋” ํ•„๋“œ*๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ proxy_pass_header ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”.[]stringNo
ignoreProxy Uptream ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ์˜ ํŠน์ • ํ—ค๋”** ์ฒ˜๋ฆฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ proxy_ignore_headers ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”.[]stringNo
addํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์‘๋‹ต์— ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.[]addHeaderNo

* โ€“ ๊ธฐ๋ณธ ์ˆจ๊น€ ํ—ค๋”: Date, Server, X-Pad ๋ฐ X-Accel-โ€ฆ ๋“ฑ.

** โ€“ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋Š” X-Acel-Redirect, X-Acel-Expires, X-Acel-Limit-Rate, X-Acel-Buffering, X-Acel-Charset, Expires, Cache-Control, Set-Cookie ๋ฐ Vari์ž…๋‹ˆ๋‹ค.

3-15. AddHeader

addHeader๋Š” ์„ ํƒ์  always ํ•„๋“œ๊ฐ€ ์žˆ๋Š” HTTP ํ—ค๋”๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

name: My-Header
value: My-Value
always: true
Field์„ค๋ช…TypeRequired
nameํ—ค๋”์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.stringYes
valueํ—ค๋”์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. NGINX ๋ณ€์ˆ˜*๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ${scheme}.stringNo
alwaystrue๋กœ ์„ค์ •ํ•˜๋ฉด ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ**์— ๊ด€๊ณ„์—†์ด ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ add_header ์ง€์‹œ์–ด๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.boolNo

* โ€“ ์ง€์›๋˜๋Š” NGINX ๋ณ€์ˆ˜: $request_uri, $request_method, $request_body, $http_, $args, $args, $arg_, $cookie_, $host, $request_time, $request_length, $nginx_vers, $pid, $remote_addr, $remote_port, $time_iso8601, $time_local, $readdr, $re, $readdr, $servers_connection, $connections_writing, $connections_dn, $ssl_dn, $ssl_client_cert, $ssl_client_dn, $ssl_client_dn_fingerprint, $ssl_client_writing, $ssl_client_dn, $ssl_client_dn_dn, $ssl_client_dn_dn_dn, $ssl_client_dn, $ssl_dn_client_dn_client_dn, $ssl_dn_dn, $ss, $ssl_curves, $ssl_early_data, $ssl_protocol, $ssl_server_name, $ssl_session_id, $ssl_session_reuse, $jwt_claim_(NGINX Plus ์ „์šฉ) ๋ฐ $jwt_header_(NGINX Plus ์ „์šฉ).

** โ€“ always๊ฐ€ false์ด๋ฉด ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 200, 201, 204, 206, 301, 302, 303, 304, 307 ๋˜๋Š” 308์ธ ๊ฒฝ์šฐ์—๋งŒ ์‘๋‹ต ํ—ค๋”๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

3-16. Split

split์€ Split ๊ตฌ์„ฑ์˜ ์ผ๋ถ€๋กœ ์ž‘์—…์— ๋Œ€ํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ NGINX๋Š” ์š”์ฒญ์˜ 80%๋ฅผ Upstream coffee-v1์— ์ „๋‹ฌํ•˜๊ณ  ๋‚˜๋จธ์ง€ 20%๋ฅผ coffee-v2์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

splits:
- weight: 80
  action:
    pass: coffee-v1
- weight: 20
  action:
    pass: coffee-v2
Field์„ค๋ช…TypeRequired
weight์ž‘์—…์˜ ๋ฌด๊ฒŒ์ž…๋‹ˆ๋‹ค. 1..99 ๋ฒ”์œ„์— ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ถ„ํ•  ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์€ 100์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.intYes
action์š”์ฒญ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค.actionYes

3-17. Match

match๋Š” ์กฐ๊ฑด๊ณผ ์ž‘์—… ๋˜๋Š” Split ๊ฐ„์˜ ์ผ์น˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ NGINX๋Š” Cookie user์˜ ๊ฐ’์— ๋”ฐ๋ผ /coffee ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” ์š”์ฒญ์„ ๋‹ค๋ฅธ Upstream์œผ๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.

user=johnย ->ย coffee-future

user=bobย ->ย coffee-deprecated

Cookie๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ john ๋˜๋Š” bob๊ณผ ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ NGINX๋Š” coffee-stable๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.

path: /coffee
matches:
- conditions:
  - cookie: user
    value: john
  action:
    pass: coffee-future
- conditions:
  - cookie: user
    value: bob
  action:
    pass: coffee-deprecated
action:
  pass: coffee-stable

๋‹ค์Œ ์˜ˆ์—์„œ NGINX๋Š” ์š”์ฒญ์˜ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐ๋ณธ ์ œ๊ณต $request_method ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ์„ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  POST ์š”์ฒญ ->ย coffee-post

๋ชจ๋“  non-POST ์š” ->ย coffee

path: /coffee
matches:
- conditions:
  - variable: $request_method
    value: POST
  action:
    pass: coffee-post
action:
  pass: coffee
Field์„ค๋ช…TypeRequired
conditions์กฐ๊ฑด ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์กฐ๊ฑด์„ 1๊ฐœ ์ด์ƒ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.[]conditionYes
action์š”์ฒญ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค.actionNo
splitsํŠธ๋ž˜ํ”ฝ ๋ถ„ํ• ์„ ์œ„ํ•œ ๋ถ„ํ•  ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ์ตœ์†Œ 2๊ฐœ์˜ ๋ถ„ํ• ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.[]splitNo

* โ€“ Match์—๋Š” action ๋˜๋Š” splits ์ค‘ ์ •ํ™•ํžˆ ํ•˜๋‚˜๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3-18. Condition

condition์€ ์ผ์น˜ Condition์˜ ์กฐ๊ฑด์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Field์„คTypeRequired
headerํ—ค๋”์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์˜์ˆซ์ž ๋˜๋Š” -๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringNo
cookieCookie์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์˜์ˆซ์ž ๋ฌธ์ž ๋˜๋Š” _๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringNo
argumentArgument์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์˜์ˆซ์ž ๋ฌธ์ž ๋˜๋Š” _๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.stringNo
variableNGINX ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. $๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ‘œ ์•„๋ž˜์—์„œ ์ง€์›๋˜๋Š” ๋ณ€์ˆ˜ ๋ชฉ๋ก์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.stringNo
value์กฐ๊ฑด๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ฐ’์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ‘œ ์•„๋ž˜์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.stringYes

* โ€“ ์กฐ๊ฑด์€ header, cookie, argument ๋˜๋Š” variable ์ค‘ ํ•˜๋‚˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” NGINX ๋ณ€์ˆ˜: $args, $http2, $https, $remote_addr, $remote_port, $query_string, $request, $request_body, $request_uri, $request_method, $scheme. ์—ฌ๊ธฐ์—์„œ ๊ฐ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ช…์„œ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ด ๊ฐ’์€ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ Matching๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  • ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด ๋น„๊ต. ์˜ˆ:
    • john โ€“ ๋ฌธ์ž์—ด(์˜ˆ: john, John, JOHN)์— ๋Œ€ํ•ด ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ผ์น˜.
    • !john โ€“ bob, anything, ' '(๋นˆ ๋ฌธ์ž์—ด)๊ณผ ๊ฐ™์€ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด john์— ๋Œ€ํ•œ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์ผ์น˜๋ฅผ ๋ถ€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ •๊ทœ์‹๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. NGINX๋Š” PCRE(Perl ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด)์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ํ˜ธํ™˜๋˜๋Š” ์ •๊ทœ์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
    • ~^yes โ€“ yes๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ •๊ทœ์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด yes, yes123์ž…๋‹ˆ๋‹ค.
    • !~^yes โ€“ YES, Yes123, noyes์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์„ฑ๊ณตํ•˜๋Š” ์ด์ „ ์ •๊ทœ์‹์˜ ๋ถ€์ •. (๋ถ€์ • ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ PCRE ๊ตฌ๋ฌธ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.).
    • ~*no$ โ€“ no๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ •๊ทœ์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ: no, 123no, 123NO.

Note: ๊ฐ’์—๋Š” ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ํฐ๋”ฐ์˜ดํ‘œ(")๊ฐ€ ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐฑ์Šฌ๋ž˜์‹œ(\)๋กœ ๋๋‚˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์ž…๋‹ˆ๋‹ค. some"value, somevalue\.

3-19. ErrorPage

errorPage๋Š” Upstream ์„œ๋ฒ„๊ฐ€ ์˜ค๋ฅ˜ ์ƒํƒœ ์ฝ”๋“œ๋กœ ์‘๋‹ต(๋˜๋Š” NGINX๊ฐ€ ์ƒ์„ฑ)ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์‘๋‹ต์€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋˜๋Š” ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ์‘๋‹ต์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ error_page ์ง€์‹œ๋ฌธ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

path: /coffee
errorPages:
- codes: [502, 503]
  redirect:
    code: 301
    url: https://nginx.org
- codes: [404]
  return:
    code: 200
    body: "Original resource not found, but success!"
Field์„ค๋ช…TypeRequired
codes์˜ค๋ฅ˜ ์ƒํƒœ ์ฝ”๋“œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.[]intYes
redirect์ง€์ •๋œ ์ƒํƒœ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค.errorPage.RedirectNo
return์ง€์ •๋œ ์ƒํƒœ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ์‘๋‹ต ์ž‘์—…์ž…๋‹ˆ๋‹ค.errorPage.ReturnNo

* โ€“ errorPage๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ •ํ™•ํžˆ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: return ๋˜๋Š” redirect.

3-20. ErrorPage.Redirect

redirect์€ errorPage์— ๋Œ€ํ•œ Redirect์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ NGINX๋Š” Upstream ์„œ๋ฒ„์˜ ์‘๋‹ต์— 404 ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

codes: [404]
redirect:
  code: 301
  url: ${scheme}://cafe.example.com/error.html
Field์„ค๋ช…TypeRequired
code๋ฆฌ๋””๋ ‰์…˜์˜ ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’์€ 301, 302, 307, 308์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 301์ž…๋‹ˆ๋‹ค.intNo
url์š”์ฒญ์„ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•  URL์ž…๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” NGINX ๋ณ€์ˆ˜: $scheme ๋ฐ $http_x_forwarded_proto ๋ณ€์ˆ˜๋Š” ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ${scheme}.stringYes

3-21. ErrorPage.Return

๋ฐ˜ํ™˜์€ errorPage์— ๋Œ€ํ•œ ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ์‘๋‹ต์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ NGINX๋Š” Upstream ์„œ๋ฒ„์˜ ์‘๋‹ต์— 401 ๋˜๋Š” 403 ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ์ค€๋น„๋œ ์‘๋‹ต์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

codes: [401, 403]
return:
  code: 200
  type: application/json
  body: |
        {\"msg\": \"You don't have permission to do this\"}
  headers:
  - name: x-debug-original-statuses
    value: ${upstream_status}
Field์„คTypeRequired
code์‘๋‹ต์˜ ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์›๋ž˜ ์‘๋‹ต์˜ ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.intNo
type์‘๋‹ต์˜ MIME ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ text/html์ž…๋‹ˆ๋‹ค.stringNo
body์‘๋‹ต์˜ ๋ณธ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” NGINX ๋ณ€์ˆ˜: $upstream_status . ๋ณ€์ˆ˜๋Š” ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ${upstream_status}.stringYes
headers์‘๋‹ต์˜ ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋”์ž…๋‹ˆ๋‹ค.errorPage.Return.HeaderNo

3-22. ErrorPage.Return.Header

ํ—ค๋”๋Š” errorPage์—์„œ ๊ฒ€์ƒ‰๋œ ์‘๋‹ต์— ๋Œ€ํ•œ HTTP ํ—ค๋”๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

name: x-debug-original-statuses
value: ${upstream_status}
Field์„ค๋ช…TypeRequired
nameํ—ค๋”์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.stringYes
valueํ—ค๋”์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” NGINX ๋ณ€์ˆ˜: $upstream_status . ๋ณ€์ˆ˜๋Š” ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ${upstream_status}.stringNo

4. VirtualServer ๋ฐ VirtualServerRoute ์‚ฌ์šฉ

์ผ๋ฐ˜์ ์ธ kubectl ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Ingress ๋ฆฌ์†Œ์Šค์™€ ์œ ์‚ฌํ•œ VirtualServer ๋ฐ VirtualServerRoute ๋ฆฌ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ช…๋ น์€ cafe-virtual-server.yaml์— ์ด๋ฆ„์ด cafe์ธ VirtualServer ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

$ kubectl apply -f cafe-virtual-server.yaml
virtualserver.k8s.nginx.org "cafe" created

๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

$ kubectl get virtualserver cafe
NAME   STATE   HOST                   IP            PORTS      AGE
cafe   Valid   cafe.example.com       12.13.23.123  [80,443]   3m

kubectl get ๋ฐ ์œ ์‚ฌํ•œ ๋ช…๋ น์—์„œ virtualserver ๋Œ€์‹  vs๋ผ๋Š” ์งง์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

VirtualServerRoute ๋ฆฌ์†Œ์Šค ์ž‘์—…์€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. kubectl ๋ช…๋ น์—์„œ virtualserverroute ๋˜๋Š” ๋‹จ์ถ• ์ด๋ฆ„ vsr์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

4-1. Snippets ์‚ฌ์šฉ

Snippets์„ ์‚ฌ์šฉํ•˜๋ฉด Raw NGINX ๊ตฌ์„ฑ์„ ๋‹ค๋ฅธ NGINX ๊ตฌ์„ฑ Context์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์—์„œ๋Š” Snippets์„ ์‚ฌ์šฉํ•˜์—ฌ VirtualServer์—์„œ ์—ฌ๋Ÿฌ NGINX ๊ธฐ๋Šฅ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: cafe
  namespace: cafe
spec:
  http-snippets: |
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
    proxy_cache_path /tmp keys_zone=one:10m;    
  host: cafe.example.com
  tls:
    secret: cafe-secret
  server-snippets: |
        limit_req zone=mylimit burst=20;
  upstreams:
  - name: tea
    service: tea-svc
    port: 80
  - name: coffee
    service: coffee-svc
    port: 80
  routes:
  - path: /tea
    location-snippets: |
      proxy_cache one;
      proxy_cache_valid 200 10m;      
    action:
      pass: tea
  - path: /coffee
    action:
      pass: coffee

Snippets์€ ์ƒ์„ฑ๋œ NGINX ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ณ ๊ธ‰ NGINX ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜์— ์„ค๋ช…๋œ ๋‹จ์  ๋•Œ๋ฌธ์— Snippets์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Snippets์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด enable-snippets Command-line๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Snippets ์‚ฌ์šฉ์˜ ๋‹จ์ :

  • ๋ณต์žก์„ฑ. Snippets์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:
    • NGINX ๊ตฌ์„ฑ ๊ธฐ๋ณธ ์š”์†Œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ NGINX ๊ตฌ์„ฑ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    • IC๊ฐ€ NGINX ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ตฌ์„ฑ์˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ Snippets์ด ๊ฐ„์„ญํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฌ๊ณ ์„ฑ ๊ฐ์†Œ. ์ž˜๋ชป๋œ Snippets์€ NGINX ๊ตฌ์„ฑ์„ ๋ฌดํšจํ™”ํ•˜์—ฌ Reload์— ์‹คํŒจํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Snippets์ด ์ˆ˜์ •๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ VirtualServer ๋ฐ VirtualServerRoute ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐฉ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. Snippets์€ NGINX ๊ตฌ์„ฑ ๊ธฐ๋ณธ ์š”์†Œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ ์š”์†Œ๋Š” Ingress Controller์—์„œ ๊ฒ€์ฆ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Snippets์€ ์ž…๋ ฅ ๋ฐ ๊ฐ€์ƒ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ TLS Termination์— ์‚ฌ์šฉ๋˜๋Š” TLS ์ธ์ฆ์„œ ๋ฐ Key๋ฅผ ์ œ๊ณตํ•˜๋„๋ก NGINX๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Snippets์„ ์‚ฌ์šฉํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก Ingress Controller๋Š” ๋กœ๊ทธ๋ฟ ์•„๋‹ˆ๋ผ VirtualServer ๋ฐ VirtualServerRoute ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฒคํŠธ ๋ฐ ์ƒํƒœ ํ•„๋“œ์— ๊ตฌ์„ฑ Reload ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์ˆ˜์˜ Prometeus ๋ฉ”ํŠธ๋ฆญ์€ ์‹คํŒจํ•œ Reload์— ๋Œ€ํ•œ ํ†ต๊ณ„(controller_nginx_last_reload_status ๋ฐ controller_nginx_reload_errors_total)๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Note: NGINX ๊ตฌ์„ฑ์— ์ž˜๋ชป๋œ Snippets์ด ํฌํ•จ๋œ ๊ธฐ๊ฐ„ ๋™์•ˆ NGINX๋Š” ์œ ํšจํ•œ ์ตœ์‹  ๊ตฌ์„ฑ์œผ๋กœ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

4-2. ๊ฒ€์ฆ

VirtualServer ๋ฐ VirtualServerRoute ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Kubectl ๋ฐ Kubernetes API ์„œ๋ฒ„์— ์˜ํ•œ ๊ตฌ์กฐ ๊ฒ€์ฆ.
  • Ingress Controller์— ์˜ํ•œ ํฌ๊ด„์ ์ธ ๊ฒ€์ฆ.

4-3. ๊ตฌ์กฐ ๊ฒ€์ฆ

VirtualServer ๋ฐ VirtualServerRoute์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์ •์˜์—๋Š” ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ ๋ชจ๋“  ํ•„๋“œ ์œ ํ˜•์„ ์„ค๋ช…ํ•˜๋Š” ๊ตฌ์กฐ์  OpenAPI ์Šคํ‚ค๋งˆ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ์  ์Šคํ‚ค๋งˆ๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ(๋˜๋Š” ์—…๋ฐ์ดํŠธ)ํ•˜๋ ค๊ณ  ํ•˜๋ฉด(์˜ˆ: Upstream์˜ ํฌํŠธ ํ•„๋“œ์— ๋ฌธ์ž์—ด ๊ฐ’ ์‚ฌ์šฉ) kubectl ๋ฐ Kubernetes API ์„œ๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

kubectl ๊ฒ€์ฆ์˜ ์˜ˆ:

$ kubectl apply -f cafe-virtual-server.yaml
  error: error validating "cafe-virtual-server.yaml": error validating data: ValidationError(VirtualServer.spec.upstreams[0].port): invalid type for org.nginx.k8s.v1.VirtualServer.spec.upstreams.port: got "string", expected "integer"; if you choose to ignore these errors, turn validation off with --validate=false

Kubernetes API ์„œ๋ฒ„ ๊ฒ€์ฆ์˜ ์˜ˆ:

$ kubectl apply -f cafe-virtual-server.yaml --validate=false
  The VirtualServer "cafe" is invalid: []: Invalid value: map[string]interface {}{ ... }: validation failure list:
  spec.upstreams.port in body must be of type integer: "string"

๋ฆฌ์†Œ์Šค๊ฐ€ ๊ฑฐ๋ถ€๋˜์ง€ ์•Š์œผ๋ฉด(๊ตฌ์กฐ ์Šคํ‚ค๋งˆ๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์Œ) Ingress Controller๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

4-4. ํฌ๊ด„์  ๊ฒ€์ฆ

Ingress Controller๋Š” VirtualServer ๋ฐ VirtualServerRoute ๋ฆฌ์†Œ์Šค์˜ ํ•„๋“œ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๊ฐ€ ์œ ์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Ingress Controller๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ๊ณ„์† ์กด์žฌํ•˜์ง€๋งŒ Ingress Controller๋Š” ์ด๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

Ingress Controller๊ฐ€ VirtualServer์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Example cafe VirtualServer์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ kubectl describe vs cafe
. . .
Events:
  Type    Reason          Age   From                      Message
  ----    ------          ----  ----                      -------
  Normal  AddedOrUpdated  16s   nginx-ingress-controller  Configuration for default/cafe was added or updated

๊ตฌ์„ฑ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” AddedOrUpdated ์‚ฌ์œ ๊ฐ€ ์žˆ๋Š” Normal ์ด๋ฒคํŠธ๊ฐ€ ์ด๋ฒคํŠธ ์„น์…˜์— ์–ด๋–ป๊ฒŒ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ž˜๋ชป๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด Ingress Controller๊ฐ€ ์ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  Rejected ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ™์€ ์ด๋ฆ„์˜ tea๋ฅผ ๊ฐ€์ง„ ๋‘ ๊ฐœ์˜ Upstream์ด ์žˆ๋Š” VirtualServer cafe๋ฅผ ๋งŒ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

$ kubectl describe vs cafe
. . .
Events:
  Type     Reason    Age   From                      Message
  ----     ------    ----  ----                      -------
  Warning  Rejected  12s   nginx-ingress-controller  VirtualServer default/cafe is invalid and was rejected: spec.upstreams[1].name: Duplicate value: "tea"

์ด๋ฒคํŠธ ์„น์…˜์— Rejected ์‚ฌ์œ ๊ฐ€ ์žˆ๋Š” ๊ฒฝ๊ณ  ์ด๋ฒคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋˜ํ•œ ์ด ์ •๋ณด๋Š” VirtualServer ๋ฆฌ์†Œ์Šค์˜ status ํ•„๋“œ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. VirtualServer์˜ ์ƒํƒœ ์„น์…˜์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

$ kubectl describe vs cafe
. . .
Status:
  External Endpoints:
    Ip:        12.13.23.123
    Ports:     [80,443]
  Message:  VirtualServer default/cafe is invalid and was rejected: spec.upstreams[1].name: Duplicate value: "tea"
  Reason:   Rejected
  State:    Invalid

Ingress Controller๋Š” ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ VirtualServerRoute ๋ฆฌ์†Œ์Šค์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Note: ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค๋ฉด Ingress Controller๋Š” ์ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ  NGINX์—์„œ ํ•ด๋‹น ๊ตฌ์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

5. ConfigMap์„ ํ†ตํ•œ ์‚ฌ์šฉ์ž ์ •์˜

ConfigMap์„ ์‚ฌ์šฉํ•˜์—ฌ VirtualServer ๋ฐ VirtualServerRoutes ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ NGINX ๊ตฌ์„ฑ์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ œ์™ธํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ConfigMap Key๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

  • proxy-hide-headers
  • proxy-pass-headers
  • hsts
  • hsts-max-age
  • hsts-include-subdomains
  • hsts-behind-proxy
  • redirect-to-https
  • ssl-redirect