看看那遙遠的飛天鯨魚,有沒有更容易的方法能連上去阿?
圖片來源:Docker (@Docker) / Twitter
上一篇提到了對外公開服務的方法 使用 Service NodePort 和 LoadBalancer
但我就是不想記哪個 port 連到哪個服務、也沒辦法配一個外部 loadbalancer 送一堆 ip 進去... 怎麼辦阿~
那就來看看 Ingress 和 Ingress Controller 吧!
Ingress 是屬於 Layer 7 的應用,能夠將 HTTP/HTTPS 的流量導向對應的 Service

圖片來源:Ingress | Kubernetes
Ingress 可以設定 host 和 path 及其背後對應的 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
Ingress 可以透過設定不同 route (path) 導向指定的 Service

圖片來源: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
Ingress 也可以設定不同 host (對外使用同一個對外 ip) 分別導向不同 Service

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 
Kubernetes 官網 Ingress Controllers 就列了一大堆... 誰知道要挑哪個...
比較常見的三個 Ingress Controller:
第一次看還不知道怎麼會有兩套叫 nginx 的...
接下來都會以 Traefik 為例安裝使用 Ingress~

圖片來源:Traefik Proxy Documentation - Traefik
為什麼要選 Traefik 呢?
因為他有好看的 Dashboard 阿~ 
簡單用 Traefik 的兩大功能來解釋一下為什麼能用來當做 Ingress Controller~
Traefik 會紀錄所有的 route 和規則,根據進入的 request 自動導向對應的 Service
如果有用過 web server 架站 (e.g. Apache, Nginx),應該用過 reverse proxy 功能,Edge Router 做的事就是類似這個功能

圖片來源:Traefik Concepts Documentation - Traefik
前面有提到 web server 的 revers proxy 功能,基本上都要手動設定背後有哪些 Service
Traefik 就增強了這部分的功能,能透過和 Kubernetes api server 溝通隨時接收最新的 Service,自動更新 route

圖片來源:Traefik Concepts Documentation - Traefik
明天就接著安裝 Traefik 吧~ 