Ingress & Ingress Controller 教學
使用 Nginx Ingress Controller
在 Kubernetes 中,Ingress 是一種 API 對象,允許 HTTP 和 HTTPS 的流量路由進入集群內的服務。Ingress Controller 是用來實現這些路由規則的控制器,它負責監控 Ingress 資源,並基於定義的路由規則來管理流量。本文將介紹如何安裝並配置 Nginx Ingress Controller 來處理 Kubernetes 中的流量。
目錄
Ingress & Ingress Controller 概述
安裝 Nginx Ingress Controller
創建 Ingress 資源
調整本機 Hosts 檔案
測試 Ingress 路由
總結
1. Ingress & Ingress Controller 概述
Ingress
Ingress 是一個 Kubernetes 物件,用來定義如何將外部 HTTP 和 HTTPS 請求路由到集群內的服務。Ingress 使得 Kubernetes 中的服務能夠有一個統一的入口,並且可以根據不同的路由規則將請求分發到不同的服務。
Ingress 的基本結構如下:
apiVersion
:networking.k8s.io/v1
kind
:Ingress
metadata
: 包含名稱、標籤等元數據spec
: 定義了如何處理流量的規則(路由規則)
Ingress Controller
Ingress Controller 是一個負責監控 Kubernetes 中 Ingress 物件的控制器。它會根據 Ingress 資源中定義的路由規則,將外部流量轉發到相應的服務。Ingress Controller 是 Kubernetes 集群中運行的 Pod,通常是基於 Nginx、Traefik 或 HAProxy 等開源反向代理實現的。
2. 安裝 Nginx Ingress Controller
在 Kubernetes 集群中安裝 Nginx Ingress Controller 是非常簡單的,Nginx 官方提供了 Helm Chart 和 YAML 文件來進行部署。
使用 Helm 安裝
1. 建立 nginx ingress controller CRDs
kubectl apply -f https://raw.githubusercontent.com/nginx/kubernetes-ingress/v4.0.0/deploy/crds.yaml
在 Kubernetes 中,CRDs(Custom Resource Definitions,自訂資源定義)是讓你擴展 Kubernetes API 的一種方式。它允許你定義自訂的資源類型,使得 Kubernetes 能夠理解並操作你自定義的資源。以下將解釋 CRDs 的概念,並且說明一些常見指令的用途。
2. 首先安裝 Helm 前往官方 github 網站下載指令程式,並且完成系統環境變數設定
3. 選定目錄存放 ingress controller 設定文件
4. 使用 Helm 指令拉取ingress controller 資源
helm pull oci://ghcr.io/nginx/charts/nginx-ingress --untar --version 2.0.0
執行完會發先你的資料夾底下會出現 nginx-ingress
5. 進入 nginx-ingress 資料夾,執行部署 ingress controller
helm install caster-nic .
# caster-nic 可自訂義-最終會與POD組建在一起
# . 指定nginx-ingress 資料夾位置
當然也可以使用YAML 建立 ingress controller ,這部分我就沒有成功過.... 所以就不補充了,後續如果我有成功,在跟各位分享實際做法與遇到什麼樣的問題
查看 k8s 集群內容
kubectl get all

確認 ingress controller 狀態為 running,這樣基本上你已經完成了一半
3. 創建 Ingress 資源
當 Nginx Ingress Controller 成功安裝並運行後,您可以創建一個 Ingress 資源來將流量路由到您的服務。以下是一個基本的 Ingress 配置範例。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: caster-ingress
namespace: default
spec:
ingressClassName: nginx
rules:
- host: example-caster.com # 替換為你的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
# 你要提供服務的 k8s Service 名稱 & port
name: normal-project-service
port:
number: 9000
其中有註解的部分,如果你是根據前面的文章一路看到這邊,normal-project-service 的部分,前面的文章有設定 nodePort 需要將他移除掉,稍後會在補充完整的YML
normal-projecy yml其餘設定接不調整, 僅調整 Service 設定部分
---
# ClusterIP Service (內部通信)
apiVersion: v1
kind: Service
metadata:
name: normal-project-service
namespace: default
spec:
type: ClusterIP
clusterIP: 10.96.100.1 # 指定固定的 Cluster IP
selector:
app.kubernetes.io/name: normal-project
ports:
- port: 9000 # 與服務端口一致
targetPort: 8080
ClusterIP:主要是用來後續如果多服務的架構,可透過ClusterIP進行內部通信 NodePort:移除掉,因為對外部分,就交給 ingress & ingress controller 管理
建立 ingress 並且查看資源狀態
kubectl apply -f .\ingress.yml
kubectl get ingress

4. 調整本機 Hosts 檔案
主要是因為我們要使用自訂義域名,去訪問我們所串建的服務
hosts 的檔案位置,就根據自己使用的系統,上網查一下位置在哪裡,並且進行修改,調整前請先備份一份起來避免修改錯誤。

像我自己本機的內部IP就是 172.20.61.17 ,所以我就設定 example-caster.com 指向 172.20.61.17,這樣我透過自訂義域名訪問,我的主機就會幫我轉發到我的內部IP。
5. 測試 Ingress 路由

6. 總結
在本文中,我們介紹了 Kubernetes 中的 Ingress 和 Ingress Controller,並且使用 Nginx Ingress Controller 作為流量路由的控制器。我們學會了如何安裝 Nginx Ingress Controller、創建 Ingress 資源,並測試路由功能。通過這種方式,您可以將外部 HTTP(S) 流量路由到 Kubernetes 集群中的服務,從而提高服務的可擴展性與靈活性。
這不就上扣了嗎? 很急吼 GitHub: 前往
居然都已經走到這邊了,後續會再把TSL也把他補上,未完待續.........
Last updated