What is Ingress

Kubernetes์˜ Ingress์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•„์š”

Reference: Kubernetes docs

์ธ๊ทธ๋ ˆ์Šค (Ingress)

  • ์ผ๋ฐ˜์ ์œผ๋กœ Network traffic์€ ingress ์™€ engress ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค

    • Ingress๋Š” ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์„œ๋ฒ„ ๋‚ด๋ถ€๋กœ ์œ ์ž…๋˜๋Š” network traffic

    • Engress๋Š” ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€๋Š” network traffic

  • Cluster ๋‚ด์˜ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์ ‘๊ทผ์„ ๊ด€๋ฆฌํ•˜๋Š” API Object

    • ์ผ๋ฐ˜์ ์œผ๋กœ HTTPS ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค

  • Ingress๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ, SSL ์ข…๋ฃŒ, ๋ช…์นญ ๊ธฐ๋ฐ˜์˜ ๊ฐ€์ƒ ํ˜ธ์ŠคํŒ… ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค

Terms

  • Node

    • Cluster์˜ ์ผ๋ถ€

    • Kubernetes์— ์†ํ•œ worker machine

  • Cluster

    • Kubernetes์—์„œ ๊ด€๋ฆฌ๋˜๋Š” containerํ™” ๋œ application์„ ์‹คํ–‰ํ•˜๋Š” node์˜ ์ง‘ํ•ฉ

      • ๋Œ€๋ถ€๋ถ„์˜ Kubernetes ๋ฐฐํฌ์—์„œ cluster์— ์†ํ•œ node๋Š” Public Internet์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋‹ค

  • Edge Router

  • Cluster์— ๋ฐฉํ™”๋ฒฝ ์ •์ฑ…์„ ์ ์šฉํ•˜๋Š” router

    • Cloud provider or physical hardware์˜ ์ผ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” Gateway ์ผ ์ˆ˜ ์žˆ๋‹ค

  • Cluster Network

    • Kubernetes networking model์— ๋”ฐ๋ผ cluster ๋‚ด๋ถ€์—์„œ ํ†ต์‹ ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ๋…ผ๋ฆฌ์  ๋˜๋Š” ๋ฌผ๋ฆฌ์  ๋งํฌ์˜ ์ง‘ํ•ฉ

  • Service

    • Label selecter๋ฅผ ์‚ฌ์šฉํ•ด์„œ pod ์ง‘ํ•ฉ์„ ์‹๋ณ„ํ•˜๋Š” Kubernetes service

      • ๋‹ฌ๋ฆฌ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์œผ๋ฉด service๋Š” Cluster network ๋‚ด์—์„œ๋งŒ routing ๊ฐ€๋Šฅํ•œ ๊ฐ€์ƒ IP๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค

What is Ingress?

  • Cluster ์™ธ๋ถ€์—์„œ cluster ๋‚ด๋ถ€ ์„œ๋น„์Šค๋กœ HTTP ์™€ HTTPS ๊ฒฝ๋กœ๋ฅผ ๋…ธ์ถœํ•œ๋‹ค

  • Traffic routing ์€ Ingress resource์— ์ •์˜๋œ ๊ทœ์น™์— ์˜ํ•ด control ๋œ๋‹ค

image-20200929010831268
  • Ingress๋Š” ์™ธ๋ถ€์—์„œ service๋กœ ์ ‘์† ๊ฐ€๋Šฅํ•œ URL, Load balance traffic, SSL/TSL ์ข…๋ฃŒ, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฆ„ ๊ธฐ๋ฐ˜์˜ virtual hosting service๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

    • Ingress controller ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ load balancer๋ฅผ ์‚ฌ์šฉํ•ด์„œ ingress๋ฅผ ์ˆ˜ํ–‰ํ•  ์ฑ…์ž„์ด ์žˆ์œผ๋ฉฐ, traffic์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜๋„๋ก edge router ๋‚˜ additional frontend ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

  • Ingress๋Š” ์ž„์˜์˜ port ๋˜๋Š” protocol ์„ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค

    • HTTP์™€ HTTPS ์ด์™ธ์˜ service๋ฅผ ์ธํ„ฐ๋„ท์— ๋…ธ์ถœํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ Service.Type=NodePort ๋˜๋Š” Service.Type=LoadBalancer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

Prerequisites

  • Ingress Controller ๊ฐ€ ์žˆ์–ด์•ผ Ingress ๋ฅผ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋‹ค

    • Resource๋งŒ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํšจ๊ณผ๊ฐ€ ์—†๋‹ค! controller ๊ฐ€ ํ•„์š”ํ•˜๋‹ค

  • ingress-nginx ๊ฐ™์€ ingress controller ๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ingress controller์˜ ์ข…๋ฅ˜๋Š” ๋‹ค์–‘ํ•˜๋‹ค

The Ingress resource

A minimal Ingress resource example

# service/networking/minimal-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80
  • ๋‹ค๋ฅธ ๋ชจ๋“  Kubernetes resource์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ingress์—๋Š” apiVersion, kind, metadata field๊ฐ€ ํ•„์š”ํ•˜๋‹ค

  • Ingress object์˜ ์ด๋ฆ„์€ ์œ ํšจ์•ˆ DNS subdomain name ์ด์–ด์•ผ ํ•œ๋‹ค

  • Ingress๋Š” ์ข…์ข… annotation์„ ์ด์šฉํ•ด์„œ ingress controller์— ๋”ฐ๋ผ ๋ช‡ ๊ฐ€์ง€ option์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ, rewrite-target annotation ์„ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค

  • ์„œ๋กœ ๋‹ค๋ฅธ ingress controller๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ annotation์„ ์ง€์›ํ•œ๋‹ค

  • Ingress spec ์—๋Š” Load Balancer ๋˜๋Š” proxy server๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์žˆ๋‹ค

    • ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€, ๋“ค์–ด์˜ค๋Š” request์™€ ์ผ์น˜ํ•˜๋Š” ๊ทœ์น™ ๋ชฉ๋ก์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด๋‹ค

      • Ingress resource๋Š” HTTP(S) traffic ์„ ์ง€์‹œํ•˜๋Š” ๊ทœ์น™๋งŒ ์ง€์›ํ•œ๋‹ค

Ingress rules

: ๊ฐ HTTP ๊ทœ์น™์—๋Š” ๋‹ค์Œ์˜ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ๋‹ค

  • ์„ ํƒ์  host

    • ๋งŒ์•ฝ host๊ฐ€ ์ œ๊ณต๋˜๋ฉด, ๊ทœ์น™์ด ํ•ด๋‹น host์— ์ ์šฉ๋œ๋‹ค

  • ๊ฒฝ๋กœ ๋ชฉ๋ก

    • ๊ฒฝ๋กœ ๋ชฉ๋ก์—๋Š” ๊ฐ๊ฐ service.name, service.port.name or service.port.number ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š”, ๊ด€๋ จ backend๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค

      • Load balancer๊ฐ€ traffic์ด ์ฐธ์กฐ๋œ ์„œ๋น„์Šค๋กœ ๋ณด๋‚ด๊ธฐ ์ „์— host์™€ path ๋Š” incoming request์™€ ๋‚ด์šฉ์ด match ๋˜์–ด์•ผ ํ•œ๋‹ค

  • Backend

    • Backend๋Š” service docs ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ resource backend์— ์„ค๋ช…๋œ ๊ฒƒ ์ฒ˜๋Ÿผ service ์™€ port ์ด๋ฆ„์˜ ์กฐํ•ฉ์ด๋‹ค.

      • Host์™€ ๊ทœ์น™ ๊ฒฝ๋กœ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ingress์— ๋Œ€ํ•œ HTTP(S) ์š”์ฒญ์€ backend ๋ชฉ๋ก์œผ๋กœ ์ „์†ก๋œ๋‹ค

DefaultBackend

  • ๊ทœ์น™์ด ์—†๋Š” ingress๋Š” ๋ชจ๋“  traffic์„ ํ•˜๋‚˜์˜ default backend๋กœ ์ „์†กํ•œ๋‹ค

  • DefaultBackend๋Š” ingress controller ์˜ ๊ตฌ์„ฑ option์ด๊ณ , ingress resource ์— ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค

  • ๋งŒ์•ฝ ingress object ์˜ HTTP ์š”์ฒญ๊ณผ ์ผ์น˜ํ•˜๋Š” host or path๊ฐ€ ์—†์œผ๋ฉด, traffic์€ default backend๋กœ routing ๋œ๋‹ค

Resource Backend

  • Resource backend ๋Š” ingresss object์˜ ๋™์ผํ•œ namespace ๋‚ด์— ์žˆ๋Š” ๋‹ค๋ฅธ Kubernets resource์— ๋Œ€ํ•œ ObjectRef ์ด๋‹ค

  • Resource ๋Š” service์™€ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ธ ์„ค์ •์ด๋ฉฐ, ๋‘˜ ๋‹ค ์ง€์ •ํ•˜๊ฒŒ ๋˜๋ฉด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฅผ ํ†ต๊ณผ ํ•  ์ˆ˜ ์—†๋‹ค

    • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ์‹คํŒจํ•œ๋‹ค

  • Resource backend ์˜ ์ผ๋ฐ˜์ ์ธ ์šฉ๋„๋Š” static asset์ด ์žˆ๋Š” object storage backend๋กœ data๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๊ฒƒ ์ด๋‹ค

Resource backend example

# service/networking/ingress-resource-backend.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-resource-backend
spec:
  defaultBackend:
    resource:
      apiGroup: k8s.example.com
      kind: StorageBucket
      name: static-assets
  rules:
    - http:
        paths:
          - path: /icons
            pathType: ImplementationSpecific
            backend:
              resource:
                apiGroup: k8s.example.com
                kind: StorageBucket
                name: icon-assets
  • ์œ„์˜ yaml file ์ฒ˜๋Ÿผ ingress ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์•„๋ž˜์˜ ๋ช…๋ น์œผ๋กœ ์ƒ์„ฑ๋œ ingress๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค

    $ kubectl describe ingress ingress-resource-backend
    • ๊ฒฐ๊ณผ

      Name:             ingress-resource-backend
      Namespace:        default
      Address:
      Default backend:  APIGroup: k8s.example.com, Kind: StorageBucket, Name: static-assets
      Rules:
        Host        Path  Backends
        ----        ----  --------
        *
                    /icons   APIGroup: k8s.example.com, Kind: StorageBucket, Name: icon-assets
      Annotations:  <none>
      Events:       <none>

Path types

  • Ingress ์˜ ๊ฐ ๊ฒฝ๋กœ์—๋Š” ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ์œ ํ˜•์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค

    • ๋ช…์‹œ์  pathType ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ๋‹ค!

  • ์ง€์›๋˜๋Š” ๊ฒฝ๋กœ ์œ ํ˜•์€ ์•„๋ž˜์˜ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค

    1. ImplementationSpecific

      • ์ด ๊ฒฝ๋กœ ์œ ํ˜•์˜ ์ผ์น˜ ์—ฌ๋ถ€๋Š” IngressClass ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค

        • ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋ณ„๋„ pathType ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜,

        • Prefix ๋˜๋Š” Exact ๊ฒฝ๋กœ ์œ ํ˜•์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค

    2. Exact

      • URL ๊ฒฝ๋กœ์˜ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์ผ์น˜์‹œํ‚จ๋‹ค

    3. Prefix

      • URL ๊ฒฝ๋กœ์˜ ์ ‘๋‘์‚ฌ๋ฅผ / ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌํ•œ ๊ฐ’๊ณผ ์ผ์น˜์‹œํ‚จ๋‹ค

        • ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ ,

        • Element basis๋กœ path element๋ฅผ ์ผ์น˜์‹œํ‚จ๋‹ค

      • Request path์˜ ๋ชจ๋“  element๋ณ„ ์ ‘๋‘์‚ฌ๊ฐ€ p ์ธ ๊ฒฝ์šฐ ์š”์ฒญ์€ p ๊ฒฝ๋กœ์— ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค

        • ๋‹จ, ๊ฒฝ๋กœ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ request path์— ์žˆ๋Š” ๋งˆ์ง€๋ง‰ element์˜ ํ•˜์œ„ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ์—๋Š” ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค

          • ex)

            • /foo/bar ์™€ /foo/bar/baz ๋Š” ์ผ์น˜ํ•˜์ง€๋งŒ,

            • /foo/bar ์™€ /foo/barbaz ๋Š” ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค!

Examples

์ข…๋ฅ˜
๊ฒฝ๋กœ
์š”์ฒญ ๊ฒฝ๋กœ
์ผ์น˜ ์—ฌ๋ถ€

Prefix

/

(๋ชจ๋“  ๊ฒฝ๋กœ)

์˜ˆ

Exact

/foo

/foo

์˜ˆ

Exact

/foo

/bar

์•„๋‹ˆ์˜ค

Exact

/foo

/foo/

์•„๋‹ˆ์˜ค

Exact

/foo/

/foo

์•„๋‹ˆ์˜ค

Prefix

/foo

/foo, /foo/

์˜ˆ

Prefix

/foo/

/foo, /foo/

์˜ˆ

Prefix

/aaa/bb

/aaa/bbb

์•„๋‹ˆ์˜ค

Prefix

/aaa/bbb

/aaa/bbb

์˜ˆ

Prefix

/aaa/bbb/

/aaa/bbb

์˜ˆ, ๋งˆ์ง€๋ง‰ ์Šฌ๋ž˜์‹œ ๋ฌด์‹œํ•จ

Prefix

/aaa/bbb

/aaa/bbb/

์˜ˆ, ๋งˆ์ง€๋ง‰ ์Šฌ๋ž˜์‹œ ์ผ์น˜ํ•จ

Prefix

/aaa/bbb

/aaa/bbb/ccc

์˜ˆ, ํ•˜์œ„ ๊ฒฝ๋กœ ์ผ์น˜ํ•จ

Prefix

/aaa/bbb

/aaa/bbbxyz

์•„๋‹ˆ์˜ค, ๋ฌธ์ž์—ด ์ ‘๋‘์‚ฌ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ

Prefix

/, /aaa

/aaa/ccc

์˜ˆ, /aaa ์ ‘๋‘์‚ฌ ์ผ์น˜ํ•จ

Prefix

/, /aaa, /aaa/bbb

/aaa/bbb

์˜ˆ, /aaa/bbb ์ ‘๋‘์‚ฌ ์ผ์น˜ํ•จ

Prefix

/, /aaa, /aaa/bbb

/ccc

์˜ˆ, / ์ ‘๋‘์‚ฌ ์ผ์น˜ํ•จ

Prefix

/aaa

/ccc

์•„๋‹ˆ์˜ค, ๊ธฐ๋ณธ ๋ฐฑ์—”๋“œ ์‚ฌ์šฉํ•จ

Mixed

/foo (Prefix), /foo (Exact)

/foo

์˜ˆ, Exact ์„ ํ˜ธํ•จ

Multiple matches

  • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ Ingress์˜ ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๊ฐ€ request์™€ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค

    • ์ด ๊ฒฝ์šฐ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ๋กœ ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ฒฝ๋กœ๊ฐ€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค

      • ๋‘ ๊ฐœ์˜ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ, Prefix ๊ฒฝ๋กœ ์œ ํ˜•๋ณด๋‹ค Exact ๊ฒฝ๋กœ ์œ ํ˜•์„ ๊ฐ€์ง„ ๊ฒฝ๋กœ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค!

+

  • Kubernetes์˜ ์„œ๋น„์Šค๋Š” L4 layer ๋กœ TCP๋‹จ์—์„œ Pods ๋ฅผ balancing ํ•œ๋‹ค

Last updated

Was this helpful?