Kubernetes CKA課程筆記 38

苦難的建立ingress Component,及Multi Paths

ZONGRU Li
8 min readNov 1, 2021

接著我們將聚焦在Ingress Controller如何轉拋請求給後面應用程式的Service

在此我們將定義Ingress Component來定義routing logic

Ingress將會把請求轉拋給nginx-service

首先我們得先改造之前的nginx-service,先將其刪除:

編輯修改一下之前的nginx-service.yaml內容:

重建nginx-service為ClusterIP:

所以之後讓Ingress來處理外部的請求,不讓應用程式的Service暴露到Node

接著透過kubectl指令來產生default的Ingress Configuration File:

先看看建立Ingress元件該如何下,執行:

kubectl create ingress --help

看到以下:

所以相對應的dry-run產生yaml檔指令為:

kubectl create ingress {名稱} --rule=host/path=service:port --dry-run=client -o yaml > {名稱}.yaml

實際執行取名my-app-ingress並執行如下:

原始看到內容會是如下,並改造:

上面的pathType會有兩種選擇:

  1. Exact:完全吻合的URL轉拋(有看大小寫)
  2. 前綴字有對應即可(如下官網的範例)
看看右邊是否YES(Match!)

接著執行建立:

這邊講師在建立的時候其實會有錯誤,可能舊版固定的問題

建立失敗的訊息關鍵字大概是:

Internal error occurred: failed calling webhook “validate.nginx.ingress.kubernetes.io”後面balbalbal連到20.107.2.225失敗啥的no route to host

主因是Service其中的ingress-nginx-controller-admission

無法被建立的ingress連接造成建立ingress失敗!

來到官方github可以找到以下片段客製化的部分(跟這個有關)

可執行以下指令看到部分內容:

kubectl get ValidatingWebhookConfiguration

實際內容這邊不細談

如果建立有問題則要執行修改:

kubectl edit ValidatingWebhookConfiguration

然後儲存離開即可(不過因為我建立沒有錯誤,所以我沒修改!)

如果有改OK,就在重新apply建立ingress元件

這邊特別提醒

ingress元件(負責定義轉繞給內部Service)

是有限定namespace同內部service的!!

如上我們暫時定義在default namespace

此時理應AWS的DNS可以正常轉址請求到內部Pod了:

GG~~居然還是404(很大可能還卡在ingress-controller)

我查看ingress controller pod log:

kubectl logs {ingress controller pod名稱}

ingress does not contain a valid IngressClass

這邊找到一些網路偏方:

以下是隔天重啟worker後確認狀態:

kubectl logs {ingress controller pod}

有重啟worker,所以這是剛建出來的ingress-controller pod

比對前一篇筆記,我有紀錄透過helm安裝ingress-controller

在最後結尾其實有給ingress元件的configuration file範本:

所以在ingressManifests內編輯

再回頭看看ingress-controller pod的log:

結果真的OK了!!

也就是照著當初helm安裝完給的ingress範例是可以正常建立ingress元件的

(到這邊我有使用的講師說的那個ValidatingWebhookConfiguration的設定也有更改到)

設定Multiple Paths:

  • 我們可以透過在相同的AWS LB的DNS上
  • 透過不同Path指向到不同的內部Service
  • 以下嘗試增加ingress的path設定如下

移除並重建ingress,並透過以下指令查看新建的ingress rules:

kubectl describe ingress {ingress-name}

過幾分鐘後才生效導址出現:

講師畫面是出現502 bad gateway

接著嘗試後面接剛剛加的path => /my-app

還是一樣404...

這是因為:

  • 打進nginx-service:8080又帶著/my-app這個path
  • 但是內部service背後nginx Pod並沒有定義/my-app的url服務對應

所以要在改寫ingress的規則

參考k8s的官方github:

改好後重建:

講師額外筆記建議:

如上我們僅建立出1個ingress-controller pod

但是建議正式環境下多少worker node就建立多少個ingress-controller pod

我有看到helm安裝的ingress-controller是有deployment的:

所以是可以透過筆記27的scale指令來調整數量

目前是看到可以到以下路徑找到helm拉下來的tgz檔

相關的helm安裝如何調整,待之後研究

並且ingress內也能見多個rule,甚至每個service都建各自的ingress元件

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet