iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0
DevOps

前端轉生~到了實驗室就要養幾隻可愛鯨魚:自架 Kubernetes 迷航日記系列 第 16

Day 16 — 艦艇訪客參觀動線:Ingress & Ingress Controller

  • 分享至 

  • xImage
  •  

可愛鯨魚

看看那遙遠的飛天鯨魚,有沒有更容易的方法能連上去阿?

圖片來源:Docker (@Docker) / Twitter

上一篇提到了對外公開服務的方法 使用 Service NodePort 和 LoadBalancer
但我就是不想記哪個 port 連到哪個服務、也沒辦法配一個外部 loadbalancer 送一堆 ip 進去... 怎麼辦阿~

那就來看看 IngressIngress Controller 吧!

Ingress

Ingress 是屬於 Layer 7 的應用,能夠將 HTTP/HTTPS 的流量導向對應的 Service

ingress
圖片來源:Ingress | Kubernetes

簡單範例

Ingress 可以設定 hostpath 及其背後對應的 Service

pathType 可設定三種

  • Exact: 完全匹配 path,path: /aaa 無法匹配 /aaa/
  • Prefix: 匹配前綴,如 path: /api 可匹配 /api/aaa, /api/bbb, ...
  • ImplementationSpecific: 依據 IngressClass 設定匹配成前兩種
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  labels:
    name: web
spec:
  rules:
  - host: web.example.site.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: web
            port: 
              name: http

Simple fanout

Ingress 可以透過設定不同 route (path) 導向指定的 Service

Simple fanout
圖片來源:Ingress | Kubernetes

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  labels:
    name: web
spec:
  rules:
  - host: web.example.site.com
    http:
      paths:  # 設定不同 path
      - pathType: Prefix
        path: "/foo"
        backend:
          service:
            name: service1
            port: 
              number: 4200
      - pathType: Prefix
        path: "/bar"
        backend:
          service:
            name: service2
            port: 
              number: 8080

Name based virtual hosting

Ingress 也可以設定不同 host (對外使用同一個對外 ip) 分別導向不同 Service

Name based virtual hosting

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  labels:
    name: web
spec:
  rules:  # 設定不同 host
  - host: foo.bar.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service1
            port: 
              number: 80
  - host: bar.foo.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service1
            port: 
              number: 80

看了 Ingress 的使用方式是不是很心動鴨~
但如果你現在部署會發現 Ingress 完全沒用阿?!

因為還沒架 Ingress Controller 阿!
這樣外面的人會不知道要來 cluster 裡面找 Ingress /images/emoticon/emoticon10.gif


Ingress Controller

Kubernetes 官網 Ingress Controllers 就列了一大堆... 誰知道要挑哪個...

比較常見的三個 Ingress Controller:

第一次看還不知道怎麼會有兩套叫 nginx 的...

接下來都會以 Traefik 為例安裝使用 Ingress~

traefik
圖片來源:Traefik Proxy Documentation - Traefik

為什麼要選 Traefik 呢?
因為他有好看的 Dashboard 阿~ /images/emoticon/emoticon07.gif

Traefik

簡單用 Traefik 的兩大功能來解釋一下為什麼能用來當做 Ingress Controller~

Edge Router

Traefik 會紀錄所有的 route 和規則,根據進入的 request 自動導向對應的 Service

如果有用過 web server 架站 (e.g. Apache, Nginx),應該用過 reverse proxy 功能,Edge Router 做的事就是類似這個功能

Edge Router
圖片來源:Traefik Concepts Documentation - Traefik

Auto Service Discovery

前面有提到 web server 的 revers proxy 功能,基本上都要手動設定背後有哪些 Service

Traefik 就增強了這部分的功能,能透過和 Kubernetes api server 溝通隨時接收最新的 Service,自動更新 route

Auto Service Discovery
圖片來源:Traefik Concepts Documentation - Traefik


Ref


明天就接著安裝 Traefik 吧~ /images/emoticon/emoticon34.gif


上一篇
Day 15 — 艦艇開放參觀區域:Service 介紹
下一篇
Day 17 — 艦艇訪客參觀動線:Ingress Controller - Traefik
系列文
前端轉生~到了實驗室就要養幾隻可愛鯨魚:自架 Kubernetes 迷航日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言