master的HA,实际是apiserver的HA。Master的其余组件controller-manager、scheduler都是能够经过etcd作选举(--leader-elect),而APIServer设计的就是可扩展性,因此作到APIServer很容易,只要前面加一个负载均衡轮训转发请求便可。下面简单描述下haproxy和keepalive。
注意⚠️便于你们使用,因此先码部署,有兴趣的能够看下后面的原理。javascript
yum -y install haproxy
生产环境能够用二进制包部署css
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-back
vim /etc/haproxy/haproxy.cfg
java
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode tcp log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 frontend main *:16443 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend kube-apiserver backend static balance roundrobin server static 127.0.0.1:4331 check backend kube-apiserver balance roundrobin server k8s1-matser1 10.8.4.91:6443 check server k8s1-matser2 10.8.4.92:6443 check server k8s1-matser3 10.8.4.93:6443 check
⚠️注意node
配置文件能够拷贝其余节点,配置文件保持同样。web
systemctl start haproxy && systemctl enable haproxy && systemctl status haproxy
redis
yum install -y keepalived
vim
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-back
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { router_id LVS_1 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.8.4.55/24 } }
⚠️注意后端
其余节点只需修改 state 为 BACKUP,优先级 priority 低于100便可。api
systemctl start keepalived && systemctl enable keepalived && systemctl status keepalived
服务器
ip addr show eth0
如图
能够看到vip只在一台机器上;若是两个机器都有vip,多是防火墙拦截了vrrp协议。
软件负载均衡通常经过两种方式来实现:基于操做系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操做系统实现的一种软负载,HAProxy就是开源的而且基于第三应用实现的软负载。
HAProxy相比LVS的使用要简单不少,功能方面也很丰富。当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通讯服务器等),和7层(HTTP)。在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,而且能经过容许、拒绝、交换、增长、修改或者删除请求 (request)或者回应(response)里指定内容来控制协议,这种操做要基于特定规则。
反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有很是不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。自1.3引入了frontend,backend;frontend根据任意 HTTP请求头内容作规则匹配,而后把请求定向到相关的backend.
keepalived是一个相似于layer3, 4 & 5交换机制的软件,也就是咱们平时说的第3层、第4层和第5层交换。Keepalived的做用是检测web服务器的状态,若是有一台web服务器死机,或工做出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工做正常后Keepalived自动将web服务器加入到服务器群中,这些工做所有自动完成,不须要人工干涉,须要人工作的只是修复故障的web服务器。
⚠️相似的HA工具还有heatbeat、drbd等,heatbeat、drbd配置都较为复杂。
keepalived可提供vrrp以及health-check功能,能够只用它提供双机浮动的vip(vrrp虚拟路由功能),这样能够简单实现一个双机热备高可用功能。
keepalived是一个相似于layer3, 4 & 5交换机制的软件,也就是咱们平时说的第3层、第4层和第5层交换。Keepalived的做用是检测web 服务器的状态。 Layer3,4&5工做在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别以下:
- Layer3:Keepalived使用Layer3的方式工做式时,Keepalived会按期向服务器群中的服务器发送一个ICMP的数据包(既咱们平时用的Ping程序),若是发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种状况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效做为服务器工做正常与否的标准。
- Layer4:若是您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工做正常与否。如web server的服务端口通常是80,若是Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
- Layer5:Layer5就是工做在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,若是与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
vip即虚拟ip,是附在主机网卡上的,即对主机网卡进行虚拟,此IP仍然是占用了此网段的某个IP。
tcp的keepalive是侧重在保持客户端和服务端的链接,一方会不按期发送心跳包给另外一方,当一方端掉的时候,没有断掉的定时发送几回心跳包,若是间隔发送几回,对方都返回的是RST,而不是ACK,那么就释放当前连接。设想一下,若是tcp层没有keepalive的机制,一旦一方断开链接却没有发送FIN给另一方的话,那么另一方会一直觉得这个链接仍是存活的,几天,几月。那么这对服务器资源的影响是很大的。
tcp的keepalive就是为了检测连接的可用性。主要调节的参数有三个:
- tcp_keepalive_time // 距离上次传送数据多少时间未收到判断为开始检测
- tcp_keepalive_intvl // 检测开始每多少时间发送心跳包
- tcp_keepalive_probes // 发送几回心跳包对方未响应则close链接
基本上的流程:
- 在客户端和服务端进行完三次握手以后,客户端和服务端都处在ESTABLISH状态,这个时候进行正常的PSH和ACK交互,可是一旦一方服务中断了,另外一方在距离上次PSH时间tcp_keepalive_time发现对方未发送数据,则开始心跳检测。
- 心跳检测实际就是发送一个PSH的空心跳包,这里说的空心跳包就是包的数据为空,可是TCP包的头部的数据和标识和正常包同样。若是这个包获取到的是RST返回的话,下面就会继续每隔tcp_keepalive_intval的时长发送一个空心跳包,若是tcp_keepalive_probes次心跳包对方都是返回RST而不是ACK,则心跳发起方就判断这个链接已经失效,主动CLOST这个链接。
这三个参数能够每一个TCP链接都不一样,使用tcp设置变量的函数能够设置当前tcp链接的这三个对应的值。int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)⚠️ http层的keepalive原理 http的keep-alive通常咱们都会带上中间的横杠,普通的http链接是客户端链接上服务端,而后结束请求后,由客户端或者服务端进行http链接的关闭。下次再发送请求的时候,客户端再发起一个链接,传送数据,关闭链接。这么个流程反复。可是一旦客户端发送connection:keep-alive头给服务端,且服务端也接受这个keep-alive的话,两边对上暗号,这个链接就能够复用了,一个http处理完以后,另一个http数据直接从这个链接走了。