Kubernetes 那些事 — Ingress 篇(一)

Andy Chen
Andy的技術分享blog
6 min readJan 30, 2020

前言

在上一篇文章介紹完 Service 後,看似解決了對外連接的問題,但大家一定會發現 port 真的太醜了,現在應該沒有任何一個網站除了網域之外後面還要加 port 吧XD

為了解決這個問題,今天的文章就要來介紹 Ingress ,廢話不多說馬上開始吧!

什麼是 Ingress?

Ingress 可以幫助我們統一對外的 port number,並且根據 hostname 或是 pathname 決定請求要轉發到哪個 Service 上,之後就可以利用該 Service 連接到 Pod 做事情了,而 K8s 的 Ingress 會統一開 http 的 80 port 以及 https 的 443 port。

Ingress 作用

上面的段落簡單的介紹了 Ingress 的觀念後,接下來介紹一下 Ingress 真正的功能吧!

  • 將不同路徑的請求對應到不同的 Service 物件

若沒有設定網域,則該機器上所有網域只要透過此路徑均可以連接到指定的 Service 物件。

  • 將不同網域的請求對應到不同的 Service 物件

若沒有設定路徑,則會以 /路徑連接到指定的 Service 物件。

  • 支援 SSL Termination

SSL 全名為:傳輸層安全性協定,而網站通常都會利用 https 進行加密以確保資料安全,但 Service 與 Pod 之間的溝通都是以無加密方式傳輸,所以 Ingress 就支援解密,讓 Service 與 Pod 可以正常溝通傳遞資料。

最後加了 Ingress 後架構圖就會長得像下圖這樣,這裡筆者故意用網域以及路徑的方式來表示 Ingress 的連結到 Service 的方式。

啟動 Ingress

由於 minikube 本身並沒有啟用 Ingress 的功能,因此需要額外下指令讓 minikube 可以順利的使用 Ingress ,啟動方法也很簡單只要在終端機下 minikube addons enable ingress 即可。

修改本機 host 內容

加了 Ingress 後基本上就需要網域才可以使用了,但我們都在本機端上練習而已,所以也不用刻意去網路上購買網域,只要修改本機的 host 檔案就可以了。

首先在終端機下 sudo vim /etc/hosts 並輸入電腦密碼後,在檔案內加入 minikube ip 以及想要呈現的網域名稱即可,寫法如下。

Ingress 寫法

接下來就用個簡單的範例來講一下 Ingress 的寫法吧!這邊會用兩種方式來介紹 Ingress。

  • 只設定路徑沒有設定網域
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: helloworld
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: helloworld
servicePort: 8080
  • 設定網域以及路徑
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: helloworld
spec:
rules:
- host: helloworld.com.tw
http:
paths:
- path: /
backend:
serviceName: helloworld
servicePort: 8080

這邊可以發現 Ingress 的 apiVersionextensions/v1beta1 而不是 v1 是因為目前 Ingress 能支援的 API 版本只有 extensions/v1beta1 而已,這邊要稍微注意一下不要複製太快結果忘記改 API 版本了XD

基本上整體寫法跟 Service 差不多,唯一不同的地方就在 spec 的細部設定,因此底下就來講講 spec 的相關設定吧!

  • rules

代表這個 Ingress 的轉發規則,所有 Ingress 的設定都要寫在 rules 內。

  • host

設定可以連接到 Service 物件的網域名稱。

  • path

設定可以連接到 Service 物件的路徑名稱。

  • serviceName

設定欲連接到的 Service 名稱,這裡要填寫的就是 Service 中在 metadata 內寫上的 name

  • servicePort

設定要經由哪個 port 連接到 Service 物件,就像 Service 的 port 要連接到 Pod 的 targetPort。

建立 Ingress

由於上面用了兩種寫法,因此這個段落也會拆成兩個部分來說明。

  • 只設定路徑沒有設定網域

建立 Ingress 一樣也要用 apply 這個參數來建立。

為了要查看 Ingress 是否有正確建立起來也可以利用 get 這個參數來查看。

可以發現 hosts 的部分是 * ,這代表的是所有背後會指向 192.168.64.14 這個 IP 的網域都可以利用上面指定的路徑連接到指定的 Service 物件。

  • 設定網域以及路徑

一樣利用 apply 參數建立完 Ingress 物件後,接下來利用 get 參數來查看一下 Ingress 的詳細資訊。

可以發現現在 hosts 變成helloworld.com.tw 這個網域了,所以可想而知 helloworld-test.com.tw 就會出現 404 錯誤。

小結

今天介紹了 Ingress ,看似美好而且也不用再輸入麻煩的 port 到網域後,這時候讀者心中應該都有一個疑惑,連 Service 都可以利用 LoadBalancer 形式來做負載平衡了(雖然要在雲端服務上才能實現XD),難道 Ingress 做不到嗎?

其實 Ingress 也做得到,但要用其他的方法來實現,所以接下來要介紹 Ingress Controller ,那我們就下篇文章見嘍~

--

--

Andy Chen
Andy的技術分享blog

嗨嗨我是Andy,用嘴巴工作的工程師😂,喜歡學習不同領域的內容,專長為網頁開發,歡迎大家跟我聊技術~