比起君子讷于言而敏于行,我更喜欢君子善于言且敏于行。
目录
[一、Ingress 是什么?](#一、Ingress 是什么?)
[二、Controller 是什么?](#二、Controller 是什么?)
[三、Ingress 的作用](#三、Ingress 的作用)
[1. 安装 Ingress Controller](#1. 安装 Ingress Controller)
[2. 创建 Ingress 对象](#2. 创建 Ingress 对象)
[3. 高可用建议](#3. 高可用建议)
[4. 外部访问](#4. 外部访问)
前言
ingress单独理解是好理解的,k8s的service、hostnameNetwork单独理解也是好理解的,排列组合用起来确实容易眼花缭乱。万变不离其宗,那就以不变应万变叭~
一、Ingress 是什么?
Ingress 是 Kubernetes 的 HTTP/HTTPS 层流量入口(入口控制器) ,它负责根据 域名和路径 将外部请求路由到集群内部的 Service。
- Service(ClusterIP / NodePort) → 解决了 "找 Pod" 的问题
- Ingress → 解决了 "找 Service 里的哪一个路径 / 域名" 的问题
Ingress 本身是一个 K8s 对象 + Controller 的组合,没 Controller 其实不能工作。
二、Controller 是什么?
Ingress Controller = 负责实现 Ingress 对象规则的实际服务
1)Ingress 就是一个"路由清单"或者"路由计划表",告诉 Kubernetes:"域名 myapp.example.com 的流量要送到哪个 Service"。
2)但是这个清单本身 不会自动搬运流量。它只是一个对象,存储在 Kubernetes 里。
3)Ingress Controller 才是真正做路由的程序,它会监听这个清单,把流量送到对应的 Service。
最常见的实现是 nginx,所以很多人说 Ingress Controller = nginx
三、Ingress 的作用
Ingress 的主要作用有:
- 基于域名路由:不同域名指向不同 Service
eg: app1.example.com → Service app1
app2.example.com → Service app2
- 基于路径路由:同一个域名下,不同路径指向不同 Service
eg: /api → Service api
/web → Service frontend
3.TLS/HTTPS 终端:Ingress 可以绑定证书,为多个域名提供 HTTPS
-
负载均衡(应用层):在 Service 之前,Ingress Controller 可以做 Layer7 负载均衡
-
跨集群/跨服务访问控制(结合注解或中间件):比如限流、白名单、重定向等
四、如何实现
1. 安装 Ingress Controller
Ingress 本身只是对象,需要 Controller 来真正路由流量。常见有:
- NGINX Ingress Controller
- Traefik
- HAProxy Ingress
安装 NGINX Ingress Controller(简化示例):
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.14.0/deploy/static/provider/cloud/deploy.yaml
2. 创建 Ingress 对象
注意:Ingress YAML里的端口 = Service端口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
spec:
tls:
- hosts:
- myapp.example.com
secretName: myapp-tls
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
host→ 域名路由paths→ 路径路由backend.service.name/port→ 指向内部 Service
3. 高可用建议
- Ingress Controller 使用 Deployment/DaemonSet
- DaemonSet → 每个节点一个 Pod,保证节点级别高可用
- Deployment → 多副本 Pod,保证 Pod 高可用
- hostNetwork: true → 如果要直接占用节点 80/443 端口
4. 外部访问
如果使用 NodePort 类型 Service + Ingress Controller → 外部访问端口在 30000-32767。(可以配置hostNetwork: true 占用节点的80/443端口)
如果使用 hostNetwork + DaemonSet → 外部可以直接访问节点的 80/443(这种方式可以访问每个节点的ip:80/443。但是有url的话,还是得前面再做一层nginx,或者直接用ingress)
总结
这里其实最让人乱七八糟的是端口,ingress的yaml里面写的是service服务的端口。service的yaml里面写的是三个端口。
port: 443 # Service 内部端口,集群内部访问这个 Service 用 443
targetPort: 443 # Pod 的端口,Service 转发到 Pod 444
nodePort: 32443 # 节点上暴露的端口,外部访问节点IP:32443也能访问 Pod