Kubernetes Ingress实战(四):Bare metal环境下Kubernetes Ingress边缘节点的高可用

栏目: 编程工具 · 发布时间: 6年前

内容简介:经过前面几篇对Ingress的学习,我们已经可以在一个Kubernetes中部署nginx ingress,同时可以将集群中的两类服务HTTP和gRPC暴露到集群外部。 本篇将主要关注一下Bare metal环境下Kubernetes Ingress边缘节点高可用相关的问题。我们的线上环境并没有使用公有云,因此无法使用各种共有云提供的ingress controller。在Bare metal环境中Kubernetes集群,nginx ingress controller负责将集群外部的流量接入到集群内。

1.Kubernetes边缘节点的单点故障

经过前面几篇对Ingress的学习,我们已经可以在一个Kubernetes中部署nginx ingress,同时可以将集群中的两类服务HTTP和gRPC暴露到集群外部。 本篇将主要关注一下Bare metal环境下Kubernetes Ingress边缘节点高可用相关的问题。我们的线上环境并没有使用公有云,因此无法使用各种共有云提供的ingress controller。

在Bare metal环境中Kubernetes集群,nginx ingress controller负责将集群外部的流量接入到集群内。 实际中需要将边缘路由器或全局统一接入层的负载均衡器将到达公网ip的外网流量转发到nginx ingress controller所在Kubernetes节点(这里成为边缘节点edge节点)的内网ip上,外部通过域名访问集群中以ingress暴露的服务。

Bare metal环境的Ingress的实施往往采用下图所示的形式:

Kubernetes Ingress实战(四):Bare metal环境下Kubernetes Ingress边缘节点的高可用

Kubernetes的Node节点中的Edge节点用于接入集群外部的流量,nginx ingress controller被部署到edge节点上。通过边缘路由器,将公网ip上的流量转到edge节点上。 例如公网ip的80和443端口对应edge节点内网ip的80和443端口。

但是当前的方案中edge节点是存在单点故障的,如果这个edge节点宕机的话,整个Kubernetes集群将无法对集群外部提供服务(所有的ingress都将不可用)。

2.高可用的Kubernetes边缘节点

Kubernetes边缘节点上部署的nginx ingress controller实际上就是一个负载均衡器。因此可以通过热备的形式部署多个边缘节点,多个边缘节点争抢一个VIP的形式。 即基于Keepavlied实现边缘节点的高可用。

Kubernetes Ingress实战(四):Bare metal环境下Kubernetes Ingress边缘节点的高可用

如上图所示,部署了两个边缘节点 192.168.61.11192.168.61.12 。边缘路由器上公网ip映射到内网的VIP 192.168.61.10 上。

3.我们的实践

Kubernetes有个Contrib的 kube-keepalived-vip 项目是专门来做这件事的,在这个项目中keepalived是以容器的形式部署。 但由于我们线上一些没有部署在Kubernetes的一些服务和中间件都是用ansible部署的,这其中已经包括了keepalived的ansible role(包含keepalived+nginx和keepavlied+haproxy)。 所以我们在做Kubernetes边缘节点的高可用时,直接使用已有的ansible role将keepavlied直接部署在边缘节点上,而不是运行到容器中。

3.1 测试环境

根据前面的内容,一个Kubernetes集群分为三种类型的节点,master节点、跑业务负载的node节点、用于将外部流量接入的边缘节点edge节点。

这里的测试环境只有两个节点:

kubectl get node -o wide
NAME      STATUS    ROLES     AGE       VERSION   INTERNAL-IP 
node1     Ready     master    38d       v1.11.1   192.168.61.11
node2     Ready     <none>    38d       v1.11.1   192.168.61.12

node1同时作为master、node和edge节点,node2同时作为node和edge节点。

3.2 调度nginx-ingress-controller到边缘节点

这个测试集群的nginx ingress是使用helm部署的,这里调整一下value file ingress-nginx.yaml的内容,externalIPs指定为 192.168.61.10 这个VIP以及所有边缘节点的内网ip,同时通过nodeAffinity将 nginx-ingress-controller 调度到集群中所有的边缘节点,这里是node1和node2。

controller:
  replicaCount: 2
  service:
    externalIPs:
      - 192.168.61.10
      - 192.168.61.11
      - 192.168.61.12
  affinity:
      nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - node1
                - node2
helm upgrade nginx-ingress stable/nginx-ingress \
 --namespace ingress-nginx \
 --install \
 -f ingress-nginx.yaml

3.3 在边缘节点上安装keepalived

接下来在所有边缘节点上安装keepalived和ipvsadmin。 ipvsadm是IPVS的管理命令,VIP由IPVS创建。

我们使用ansible完成各个边缘节点上keepalived的部署和配置。 这里将略过keepalived的安装过程。

各个边缘节点上的keepalived.conf配置如下:

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

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 {
        192.168.61.10
    }
}

virtual_server 192.168.61.10 443 {
    delay_loop 6
    lb_algo loadbalance
    lb_kind DR
    nat_max 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.61.11 443 {
        weight 1
        TCP_CHECK {
          connect_timeout 3
        }
    }
    real_server 192.168.61.12 443 {
        weight 1
        TCP_CHECK {
          connect_timeout 3
        }
    }

}

各个边缘节点上的keepalvied启动后,可以在某个边缘节点上运行下面的命令查看到该节点获取到了VIP:

ip addr sh etn0
2: etn0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:7a:a0:d5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.61.12/24 brd 192.168.61.255 scope global etn0
       valid_lft forever preferred_lft forever
    inet 192.168.61.10/32 scope global etn0
       valid_lft forever preferred_lft forever
    inet6 fe80::1f1d:9638:d8f5:c2a5/64 scope link
       valid_lft forever preferred_lft forever
    inet6 fe80::3a95:48aa:a404:4275/64 scope link tentative dadfailed
       valid_lft forever preferred_lft forever

下面模拟VIP所在边缘节点宕机,将该节点关机。此时在剩余边缘节点上查,确认VIP漂到了剩余边缘节点的某个节点上。

参考


以上所述就是小编给大家介绍的《Kubernetes Ingress实战(四):Bare metal环境下Kubernetes Ingress边缘节点的高可用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Dream Machine

The Dream Machine

M. Mitchell Waldrop / Penguin Books / 2002-8 / USD 16.00

While most people may not be familiar with the name J. C. R. Licklider, he was the guiding spirit behind the greatest revolution of the modern era. At a time when most computers were big, ponderous ma......一起来看看 《The Dream Machine》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具