一, ingress
ingress是一层代理
nginx, HAproxy,envoy 都是反向代理软件,代理软件可以监听一个地址,比如www.baidu.com, 这个地址接收到请求之后,反向代理软件来配置一些规则,规则就是一些配置文件,配置文件规定
接收的请求的跳转规则,跳到哪些服务器上来处理这些请求。那么配置文件如何生成呢?跳转规则在k8s里就抽象成了一个对象,就是ingress
Ingress Controller 这个pod, 就是监听ingress这些对象,并且把它转换成nginx这些代理软件的配置文件
二,service
服务在pod里运行,我们访问服务可以通过pod的ip来访问,但是pod的ip是不固定的,我们需要一个静态的访问入口去访问服务,怎么实现呢?通过service来提供一个静态的访问地址来实现
需要把web服务发布至集群内部或者外部,不同类型的服务,service提供静态访问地址的方式也不同,分为几种:
- clusterIP(Headless): 访问一组pod提供的服务的统一的虚拟ip,虚拟ip只能在集群内部访问,集群外部不能访问此虚拟ip
- NodePort: 集群外部访问服务如何访问呢,集群可以访问到node节点, 在节点开一个端口,端口接收到的请求,转发到后端这组pod里。
- LoadBalancer: 这种类型service要外部设备交互,共同提供一个静态访问地址
- ExternalName: 集群外部有一个服务,比如google, 我想在我集群内部通过另外一个名字去访问,我可以定义个ExternalName, 这样的话,我就可以通过访问集群内部名字,再把本地的域名转到google的网站去
DNS: 域名服务器,一个域名映射多个ip地址,dns通过轮询的方式返回这些地址。客户端查询一次域名之后,域名会返回一个ip地址给客户端,同时返回客户端一个ttl,ttl过期之前,客户端再访问的时候,就会直接访问这个ip地址。这就是dns的ttl问题,就是客户端往往会缓存上一次的域名查询结果,即使后端的服务器ip发生了变化,你客户端还是会往错误的地址发请求。
负载均衡: 所谓的负载均衡,很多时候都是在数据包的基础之上做文章,先看下网络数据包格式:
负载均衡,如果想把请求转发到后端不同服务地址上,只需要修改destination ip 或者 destination port
LB: Load Balance , 负载均衡缩写
ELB: Elastic Load Balance ,弹性负载均衡