Kubernetes Ingress实战(六):Bare metal环境下Kubernetes Ingress边缘节点的高可用,Ingress Controller使用hostNetwork

2018-12-13 阅读: Kubernetes

前面在Kubernetes Ingress实战(四):Bare metal环境下Kubernetes Ingress边缘节点的高可用Kubernetes Ingress实战(五):Bare metal环境下Kubernetes Ingress边缘节点的高可用(基于IPVS)中Bare metal环境下Kubernetes Ingress边缘节点的高可用的两种方法,都是基于externalIps来暴露nginx-ingress-controller的Service到集群外部的,前者的kube-proxy没有开启IPVS,后者的kube-proxy开启了IPVS。

Kubernetes的边缘节点(edge node)一般是需要使用独立的服务器的,即只做将集群外部流量接入到集群内部。其实除了使用externalIps来暴露nginx-ingress-controller的Service到集群外部,还可以配置Ingress Controller使用hostNetwork,这样Ingress Controller将监听宿主机edge节点的80和443端口,与 Kubernetes Ingress实战(四)中一样,可以通过热备的形式部署多个边缘节点,多个边缘节点争抢一个VIP的形式。 即基于Keepavlied实现边缘节点的高可用。这种方式也是我们目前线上使用的方式。

k8s-edge-node.jpg

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

下面给出helm部署ingress nginx的value file,ingress-nginx.yaml:

controller:
  replicaCount: 2
  hostNetwork: true
#  service:
#    externalIPs:
#      - 192.168.61.10
  nodeSelector:
    node-role.kubernetes.io/edge: ''
  affinity:
    podAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - nginx-ingress
            - key: component
              operator: In
              values:
              - controller
          topologyKey: kubernetes.io/hostname
  tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule

defaultBackend:
  nodeSelector:
    node-role.kubernetes.io/edge: ''
  tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule

nginx ingress controller的副本数replicaCount为2,将被调度到node1和node2这两个边缘节点上。这里并没有指定nginx ingress controller service的externalIPs,而是通过hostNetwork: true设置nginx ingress controller使用宿主机网络。

helm install stable/nginx-ingress \
-n nginx-ingress \
--namespace ingress-nginx  \
-f ingress-nginx.yaml

部署完成后可以看到nginx ingress controller直接监听宿主机的80和443端口。 可以分别使用这两个边缘节点的ip访问ingress controller:

curl 192.168.61.11
default backend - 404

curl 192.168.61.12
default backend - 404

所有边缘节点上安装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/24 dev eth0 label enp0s8:0
    }
}

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 eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:da:9f:97 brd ff:ff:ff:ff:ff:ff
    inet 192.168.61.11/24 brd 192.168.61.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.61.10/24 scope global secondary eth0:0
       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边缘节点的高可用,Ingress Controller使用hostNetwork
本文链接:https://blog.frognew.com/2018/12/ingress-edge-node-ha-in-bare-metal-k8s-host-network.html
转载请注明出处。

目录