在 Day12: DNS 與 Service Discovery 中,我們學會了如何在 Kubernetes 內部透過 DNS 與 Service 讓不同 Pod 或服務彼此發現。
但有一個更常見的情境是:外部使用者要如何存取我們部署在 K8s 內的服務?
這就是今天要介紹的重點 —— Ingress 與 Ingress Controller。它們是 Kubernetes 集群對外 HTTP/HTTPS 流量的 Gateway。
在沒有 Ingress 之前,K8s 提供兩種方式將服務暴露到外部:
👉 因此,我們需要一個更好的方法:
這就是 Ingress 登場的原因。
Ingress (API 物件)
Ingress Controller (實作元件)
常見選項:
📝 小結:
Ingress 就像「規則文件」,而 Ingress Controller 就是「守門員」。
Ingress 的核心功能
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace
Helm 是 Kubernetes 的套件管理工具,可以類比於 Linux 的 apt 或 yum。
apiVersion: v1
kind: Service
metadata:
name: service-a
spec:
selector:
app: app-a
ports:
- port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: service-b
spec:
selector:
app: app-b
ports:
- port: 80
targetPort: 8080
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /app-a
pathType: Prefix
backend:
service:
name: service-a
port:
number: 80
- path: /app-b
pathType: Prefix
backend:
service:
name: service-b
port:
number: 80
curl -H "Host: example.com" http://<Ingress-Controller-IP>/app-a
curl -H "Host: example.com" http://<Ingress-Controller-IP>/app-b
你會發現,流量會依據不同的 Path 被導向到不同的 Service 🎉
進階議題