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 λœλ‹€

  • 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