Kubernetes
提供了两种内建的云端负载均衡机制(cloud load balancing
)用于发布公共应用,一种是工作于传输层的Service
资源,它实现的是“TCP负载均衡器”
,另一种是Ingress
资源,它实现的是“HTTP(S)负载均衡器”
。
TCP负载均衡器
HTTP(S)负载均衡器
无论是iptables
还是ipvs
模型的Service
资源都配置于Linux
内核中的Netfilter
之上进行四层调度,是一种类型更为通用的调度器,支持调度HTTP
、MySQL
等应用层服务。不过,也正是由于工作于传输层从而使得它无法做到类似卸载HTTPS
中的SSL
会话等一类操作,也不支持基于URL
的请求调度机制,而且,Kubernetes
也不支持为此类负载均衡器配置任何类型的健康状态检查机制。
HTTP(S)
负载均衡器是应用层负载均衡机制的一种,支持根据环境做出更好的调度决策。与传输层调度器相比,它提供了诸如可自定义URL
映射和TLS
卸载等功能,并支持多种类型的后端服务器健康状态检查机制。
1 Ingress概述
1.1 什么是Ingress?
通常情况下,service
和pod
仅可在集群内部网络中通过IP
地址访问。所有到达边界路由器的流量或被丢弃或被转发到其他地方。从概念上讲,可能像下面这样:
Ingress是授权入站连接到达集群服务的规则集合。
你可以给Ingress
配置提供外部可访问的URL
、负载均衡、SSL
、基于名称的虚拟主机等。用户通过POST Ingress
资源到API Server
的方式来请求Ingress
。Ingress controller
负责实现Ingress
,通常使用负载平衡器,它还可以配置边界路由和其他前端,这有助于以HA
方式处理流量。
1 | internet |
1.2 Ingress和Ingress Controller
Ingress
是Kubernetes API
的标准资源类型之一,它其实就是一组基于DNS
名称(host
)或URL
路径把请求转发至指定的Service
资源的规则,用于将集群外部的请求流量转发至集群内部完成服务发布。然而,Ingress
资源自身并不能进行“流量穿透”,它仅是一组路由规则的集合,这些规则要想真正发挥作用还需要其他功能的辅助,如监听某套接字,然后根据这些规则的匹配机制路由请求流量。这种能够为Ingress
资源监听套接字并转发流量的组件称为Ingress
控制器(Ingress Controller
)。
Ingress
控制器并不直接运行为kube-controller-manager
的一部分,它是Kubernetes
集群的一个重要组件,类似CoreDNS
,需要在集群上单独部署。
1.3 Ingress工作流程
如下图所示,流量到达外部负载均衡器(externalLB
)后,首先转发至Service
资源Ingres-nginx
上,然后通过Ingress
控制器基于Ingress
资源定义的规则将客户端请求流量直接转发至与Service
对应的后端Pod
资源之上。这种转发机制会绕过Service
资源(app Service
;api Service
),从而省去了由kube-proxy
实现的端口代理开销。Ingress
规则需要由一个Service
资源对象辅助识别相关的所有Pod
资源。如下Ingress
通过app service
资源去匹配后端的pod1
和pod2
;这个app service
只是起到一个辅助识别功能。
1.4 先决条件
在使用Ingress resource
之前,必须先了解下面几件事情。Ingress
是beta
版本的resource
,在kubernetes1.1
之前还没有。你需要一个Ingress Controller
来实现Ingress
,单纯的创建一个Ingress
没有任何意义。
GCE/GKE
会在master
节点上部署一个Ingress Controller
。你可以在一个Pod
中部署任意个自定义的Ingress Controller
。你必须正确的annotate
每个Ingress
,比如运行多个Ingress Controller
和关闭glbc
。
1.5 Ingress清单文件几个字段说明
Ingress
资源是基于HTTP
虚拟主机或URL
的转发规则,spec
字段中嵌套了rules
、backend
、tls
等字段进行定义。下面这个示例中,它包含了一个转发规则,把发往www.ilinux.io
的请求代理给名为myapp-svc
的Service
资源。
1 | apiVersion: extensions/v1beta1 |
2 部署Ingress Controller(Nginx)
2.1 描述
Ingress
控制器自身是运行于Pod
中的容器应用,一般是Nginx
或Envoy
一类的具有代理及负载均衡功能的守护进程,它监视着来自API Server
的Ingress
对象状态,并根据规则生成相应的应用程序专有格式的配置文件并通过重载或重启守护进程而使新配置生效。
Ingress
控制器其实就是托管于Kubernetes
系统之上的用于实现在应用层发布服务的Pod
资源,跟踪Ingress
资源并实时生成配置规则。
运行为Pod
资源的Ingress
控制器进程通过下面两种方式接入外部请求流量:
- 以
Deployment
控制器管理Ingress
控制器的Pod
资源,通过NodePort
或LoadBalancer
类型的Service
对象为其接入集群外部的请求流量,这就意味着,定义一个Ingress
控制器时,必须在其前端定义一个专用的Service
资源。
- 借助于
DaemonSet
控制器,将Ingress
控制器的Pod
资源各自以单一实例的方式运行于集群的所有或部分工作节点之上,并配置这类Pod
对象以HostPort
(如下图中的a)或HostNetwork
(如下图中的b)的方式在当前节点接入外部流量。