k8s | 深入理解资源对象 Ingress
继续将k8s比做一个公司,Ingress就像该公司的大门。正如公司的大门是外部访问公司内部的入口一样,Ingress充当了Kubernetes集群内服务的外部访问入口。也可以将 Ingress 类比成 Nginx。
Ingress 公开了从集群外部到集群内 services 的访问路由,Ingress 是一个规则的集合,它允许集群外的流量通过一定的规则到达集群内的 Service,Ingress 可以给 service 提供集群外部访问的 URL、负载均衡、SSL 终止、HTTP 路由等
出现的原因
LoadBalance 需要对外暴露端口,不安全,并且无法根据域名路径转发到不同的service,多个service需要多个LoadBalance,无法配置https
核心组件
-
ingress
是一个类型为
Ingress
的k8s api对象,一般用yaml配置,作用是定义请求如何转发到service的规则,可以理解为配置模板定义了域名与service的对应关系
-
ingress-controller
kubernetes API 进行交互,实时的感知后端 service、pod 等变化
Ingress Controller 再结合下文的 Ingress 生成配置,然后更新反向代理负载均衡器,并刷新其配置,实现动态服务发现与更新
-
反向代理负载均衡器
即常见的负载均衡软件,如 nginx、Haproxy 等
类型
根据 Ingress Spec 配置的不同,Ingress 可以分为以下几种类型
单服务 Ingress
单服务 Ingress 即该 Ingress 仅指定一个没有任何规则的后端服务。可以通过设置 Service.Type=NodePort
或者 Service.Type=LoadBalancer
来对外暴露。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
backend:
serviceName: testsvc
servicePort: 80
多服务 Ingress
路由到多服务的 Ingress 即根据请求路径的不同转发到不同的后端服务上
foo.bar.com -> 178.91.123.132 -> / foo s1:80
/ bar s2:80
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: s1
servicePort: 80
- path: /bar
backend:
serviceName: s2
servicePort: 80
虚拟主机 Ingress
虚拟主机 Ingress 即根据名字的不同转发到不同的后端服务上,而他们共用同一个的 IP 地址
foo.bar.com --| |-> foo.bar.com s1:80
| 178.91.123.132 |
bar.foo.com --| |-> bar.foo.com s2:80
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: s1
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend:
serviceName: s2
servicePort: 80
评论区