- Kubernetes Ingress实战(一):在Kubernetes集群中部署NGINX Ingress Controller
- Kubernetes Ingress实战(二):使用Ingress将第一个HTTP服务暴露到集群外部
- Kubernetes Ingress实战(三):使用Ingress将gRPC服务暴露到Kubernetes集群外部
- Kubernetes Ingress实战(四):Bare metal环境下Kubernetes Ingress边缘节点的高可用
- Kubernetes Ingress实战(五):Bare metal环境下Kubernetes Ingress边缘节点的高可用(基于IPVS)
- Kubernetes Ingress实战(六):Bare metal环境下Kubernetes Ingress边缘节点的高可用,Ingress Controller使用hostNetwork
前面在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实现边缘节点的高可用。这种方式也是我们目前线上使用的方式。

如上图所示,部署两个边缘节点192.168.61.11和192.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: NoSchedulenginx 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 K8S_INGRESS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_ingress_controller {
script "</dev/tcp/127.0.0.1/443"
interval 5
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_ingress_controller
}
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漂到了剩余边缘节点的某个节点上。