比起君子讷于言而敏于行,我更喜欢君子善于言且敏于行。
目录
前言
一、Ingress 是什么?
二、Controller 是什么?
三、Ingress 的作用
四、如何实现
1. 安装 Ingress Controller
2. 创建 Ingress 对象
3. 高可用建议
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 的主要作用有:
1.基于域名路由:不同域名指向不同 Service
eg: app1.example.com → Service app1
app2.example.com → Service app2
2.基于路径路由:同一个域名下,不同路径指向不同 Service
eg: /api → Service api
/web → Service frontend
3.TLS/HTTPS 终端:Ingress 可以绑定证书,为多个域名提供 HTTPS
4.负载均衡(应用层):在 Service 之前,Ingress Controller 可以做 Layer7 负载均衡
5.跨集群/跨服务访问控制(结合注解或中间件):比如限流、白名单、重定向等
四、如何实现
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.yaml2. 创建 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: 80host→ 域名路由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