上次我们使用Helm部署了Nginx-Ingress,采用hostPort方式,对打了标签的node采用daemonset部署,但当时部署的还只是单点,并没有做到高可用。
链接:Helm部署Nginx-Ingress - SPEX
在做高可用之前,先了解下从外部访问Kubernetes内部Pod的5种方式,如下:

  • hostNetwork
  • hostPort
  • NodePort
  • LoadBalancer
  • Ingress

hostNetwork

如果在Pod中使用hostNetwork:true配置的话,在这种pod中运行的应用程序可以直接看到pod启动的主机的网络接口。在主机的所有网络接口上都可以访问到该应用程序。
其实我不是很理解这就话的意思,网络插件flannel就是使用hostNetwork进行部署的。

hostPort

hostPort是直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过宿主机的IP加上来访问Pod了。
比如Nginx-Ingress就是采用的这种方式,将80与443路由至node的80与443端口上。

NodePort

NodePort在kubenretes里是一个广泛应用的服务暴露方式。Kubernetes中的service默认情况下都是使用的ClusterIP这种类型,这样的service会产生一个ClusterIP,这个IP只能在集群内部访问,要想让外部能够直接访问service,需要将service type修改为 nodePort。
同时还可以给service指定一个nodePort值,范围是30000-32767,这个值在API server的配置文件中,用--service-node-port-range定义。
集群外就可以使用kubernetes任意一个节点的IP加上30000端口访问该服务了。kube-proxy会自动将流量以round-robin的方式转发给该service的每一个pod。
这种服务暴露方式,无法让你指定自己想要的应用常用端口,不过可以在集群上再部署一个反向代理作为流量入口。

LoadBalancer

LoadBalancer 只能在service上定义。这是公有云提供的负载均衡器,如AWS、Azure、CloudStack、GCE等。

Ingress

Ingress是自kubernetes1.1版本后引入的资源类型。必须要部署Ingress controller才能创建Ingress资源,Ingress controller是以一种插件的形式提供。Ingress controller 是部署在Kubernetes之上的Docker容器。它的Docker镜像包含一个像nginx或HAProxy的负载均衡器和一个控制器守护进程。控制器守护程序从Kubernetes接收所需的Ingress配置。它会生成一个nginx或HAProxy配置文件,并重新启动负载平衡器进程以使更改生效。换句话说,Ingress controller是由Kubernetes管理的负载均衡器。

Kubernetes Ingress提供了负载平衡器的典型特性:HTTP路由,粘性会话,SSL终止,SSL直通,TCP和UDP负载平衡等。目前并不是所有的Ingress controller都实现了这些功能,需要查看具体的Ingress controller文档。


0. 服务器

RoleNameIP
MASTERNode0110.0.1.61/192.168.1.61
BACKUPNode0210.0.1.62/192.168.1.62
BACKUPNode0310.0.1.63/192.168.1.63
VIPVIP10.0.1.60/192.168.1.60

因为每台机器均分配两张网卡,绑定关系如下:

  • ens192 10.0.1.0/24
  • ens224 192.168.1.0/24

所以在VIP上,也分别进行配置。

1. 安装Keepalived

三台机器均需安装

# 本机安装
yum install -y keepalived

# 通过ansible
ansible node01 -m yum -a 'name=keepalived state=present'

# 开机自启动
systemctl enable keepalived

2. Keepalived默认配置

安装完成后会生成默认的配置,查看:

cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     
     # email 接收人     
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   
   # email smtp发送配置   
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   
   # 严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址,如果开启,则无法ping通vip。
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# vrrp实例
vrrp_instance VI_1 {

    # 角色
    state MASTER
    
    # 绑定的网卡
    interface eth0
    
    # 虚拟路由标识 同一vrrp实例下,master与backup必须相同
    virtual_router_id 51
    
    # 优先级,优先级高于state(角色),如果backup此值大于master此值,则backup优先级最高
    priority 100
    
    # 心跳时间,单位为秒
    advert_int 1
    
    # 认证方式与密码,默认为PASS,还有AH方式
    authentication {
        auth_type PASS
        
        # 最多8个字符,大于则只取前8字符的值
        auth_pass 1111
    }
    
    # VIP设置
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

# 定义虚拟服务器部分

# 虚拟服务器地址与端口
virtual_server 192.168.200.100 443 { 
    
    # 健康检查时间间隔
    delay_loop 6
    
    # 定义负载均衡LB算法,默认为rr调度算法
    lb_algo rr
    
    # lvs模型,有NAT DR TUN三种
    lb_kind NAT
    
    # 持久会话保持时长
    persistence_timeout 50
    
    # 监控服务协议类型,1.3.0版本之前只支持tcp
    protocol TCP
    
    # 定义real server部分,地址与端口使用空格分隔
    real_server 192.168.201.100 443 {
        
        # lvs权重
        weight 1
        
        # 健康状况检查方式,常见的有 HTTP_GET SSL_GET TCP_CHECK MISC_CHECK
        SSL_GET {
            url {
            
              # 指定ssl get健康检查路径
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            
            # 表示3秒无响应即超市,则此real server不健康,需重试连接
            connect_timeout 3
            
            # 重试3次
            nb_get_retry 3
            
            # 重试的时间间隔
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    
    # 定义当所有real server都宕机的时候,由哪台服务器继续提供服务,一般作为正在维护信息的提供
    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    
    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    
    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

3.配置Keepalived.conf

MASTER与BACKUP在配置文件上只有两个地方不同:

  • state MASTER/BACKUP
  • priority

所以配置文件如下:

MASTER

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 10.0.1.0/24 VIP配置
vrrp_instance VI_1 {
    state MASTER
    interface ens192
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.1.60/24 label ens192:1
    }
}

# 192.168.1.0/24 VIP配置
vrrp_instance VI_2 {
    state MASTER
    interface ens224
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.60/24 label ens224:1
    }
}

BACKUP

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 10.0.1.0/24 VIP配置
vrrp_instance VI_1 {
    state BACKUP
    interface ens192
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.1.60/24 label ens192:1
    }
}

# 192.168.1.0/24 VIP配置
vrrp_instance VI_2 {
    state BACKUP
    interface ens224
    virtual_router_id 52
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.60/24 label ens224:1
    }
}

修改配置后启动:

systemctl start keepalived

测试

# curl
curl 192.168.1.60
<html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>openresty/1.15.8.1</center>
</body>
</html>

# ping
ping 192.168.1.60
PING 192.168.1.60 (192.168.1.60): 56 data bytes
64 bytes from 192.168.1.60: icmp_seq=0 ttl=64 time=0.290 ms
64 bytes from 192.168.1.60: icmp_seq=1 ttl=64 time=0.265 ms
64 bytes from 192.168.1.60: icmp_seq=2 ttl=64 time=0.375 ms
64 bytes from 192.168.1.60: icmp_seq=3 ttl=64 time=0.339 ms
64 bytes from 192.168.1.60: icmp_seq=4 ttl=64 time=0.271 ms
64 bytes from 192.168.1.60: icmp_seq=5 ttl=64 time=0.310 ms

4. 日志

默认日志输出至/var/log/messages

5. 监控

目前并没有使用Prometheus监控Keepalived的方案。


感谢

1.从外部访问Kubernetes中的Pod - 宋净超的博客|Cloud Native|云原生布道师

Last modification:August 16th, 2019 at 12:27 pm