9. 从集群外访问服务-ingress
我们有什么问题
Service/Nodeport 已经能暴露我们的服务了, 但 Service 因为使用iptable实现, 也只能识别的出IP报头里的属性, 换句话说, 任何http协议中的特性全都做不了, 比如: 我想以HTTP中的Cookie为线索做粘性会话, 比如某个已登录的用户(cookie已经set上了)只跟一个pod会话, 使得日志统一集中在同一个pod上. 这个需求交给Service有办法做吗? 没有, 因为超过IP级别以上的全都识别不了.
Ingress可以完成以上需求, ingress按照某种协议解析你包里的内容, 并按照内容的某些属性, 去转发给指定Service, 比如现在有一个 ingress 可以解析包里的HTTP协议, 并根据HTTP包里的Path属性, 路由到不同的Service上, 那么这就是一个nginx类型的Ingress. 意思就是, ingress 是一个工作在高级协议上的转发器:
比如一个工作在HTTP级别的转发器, 即包按照HTTP协议解析, 读懂这个包里的内容, 按照Path / Cookie 转发到不同的Service上, 比如
Path=login
就转发到登录Service上,path=forum
就转发到论坛Service上, 这种情况下这个Ingress就是nginx理解成一个能读懂 MySQL 协议并, 并按照MySQL包里的某些内容转发, 这种情况下Ingress同样可以是 Envoy
为了能让我们的Ingress运行起来
一个ingress定义出一个ingress对象, 并指明path与service的对应关系. 随后IngressController(就是pod) 监听并发现了这个新创建出来的 ingress对象, 根据配置里path/service的对照关系, 生成一份 nginx.conf 配置文件, 并令nginx按照最新的配置文件运行, 简单来说 IngressController 负责实现ingress中定义出的规则.
那么到了这一步, nginx进程已经跑起来了, 并按照你在ingress对象里定义出的规则运行着. 访问到这个nginx进程的http请求会按照要求前往不同的service, 但还是那个问题, 在集群内你想去哪个Service这都没问题, 但如果是集群外访问你还要定义出NodePort来让集群外的请求, 也能访问这个Service
Last updated
Was this helpful?