翼度科技»论坛 云主机 服务器技术 查看内容

Nginx ingress controller高可用的实现

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
前提准备

既然要实现ingress controller的高可用必须是多实例部署ingress,这里我们可以使用
  1. Daemonset+nodeseletor
复制代码
的模式进行部署多实例,这样就可以将ingress部署多个实例且能根据
  1. 标签选择
复制代码
固定node(IP);

1.修改Ingress-Controller 运行模式为hostNetwork并生效
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4.   labels:
  5.     app.kubernetes.io/component: controller
  6.     app.kubernetes.io/instance: ingress-nginx
  7.     app.kubernetes.io/name: ingress-nginx
  8.     app.kubernetes.io/part-of: ingress-nginx
  9.     app.kubernetes.io/version: 1.3.0
  10.   name: ingress-nginx-controller
  11.   namespace: ingress-nginx
  12. spec:
  13.   minReadySeconds: 0
  14.   revisionHistoryLimit: 10
  15. ...
  16.     spec:
  17.       #共享宿主机的网络协议栈(不给ingress controller分配独立的网路命名空间,与宿主机网络命名空间共享)
  18.       hostNetwork: True
  19.       containers:
  20.       - args:
  21.         - /nginx-ingress-controller
  22.         - --election-id=ingress-controller-leader
  23.         - --controller-class=k8s.io/ingress-nginx
  24.         - --ingress-class=nginx
  25.         - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
  26.         - --validating-webhook=:8443
  27.         - --validating-webhook-certificate=/usr/local/certificates/cert
  28.         - --validating-webhook-key=/usr/local/certificates/key
  29.         ...
  30.         volumeMounts:
  31.         - mountPath: /usr/local/certificates/
  32.           name: webhook-cert
  33.           readOnly: true
  34.       dnsPolicy: ClusterFirst
  35.       #添加节点调度器
  36.       nodeSelector:
  37.         #节点上含有的标签
  38.         ingress: "yes"
  39.       serviceAccountName: ingress-nginx
  40.       terminationGracePeriodSeconds: 300
  41.       volumes:
  42.       - name: webhook-cert
  43.         secret:
  44.           secretName: ingress-nginx-admission
复制代码



2.给部署ingress-controller的节点打标签
  1. [root@k8s-master ~]# kubectl label nodes/k8s-node1 ingress=yes
  2. [root@k8s-master ~]# kubectl label nodes/k8s-node2 ingress=yes
复制代码


3.查看ingress-controller的部署情况
  1. [root@k8s-master ~]# kubectl get pod -n ingress-nginx -o wide
  2. NAME                                   READY   STATUS      RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
  3. ingress-nginx-admission-create-7gnc4   0/1     Completed   0          59d   10.244.107.200   k8s-node3   <none>           <none>
  4. ingress-nginx-admission-patch-ldmt4    0/1     Completed   0          59d   10.244.107.199   k8s-node3   <none>           <none>
  5. ingress-nginx-controller-qcfj8         1/1     Running     1          14d   192.168.1.3      k8s-node2   <none>           <none>
  6. ingress-nginx-controller-zf5vd         1/1     Running     2          14d   192.168.1.2      k8s-node1   <none>           <none>
复制代码
方式一:LVS+Keepalived+Nginx+Ingress


serverIPlvs01-master(keepalived)192.168.1.5lvs02-slave(keepalived)192.168.1.6nginx01192.168.1.7nginx02192.168.1.8ingress-ngx-controller01192.168.1.2ingress-ngx-controller02192.168.1.3工作流程:
1、当客户端请求web2.study.com我们的服务时,DNS会解析出这个域名对应的IP为47.9x.5x.xx;
2、然后根据路由器上的nat将47.9x.5x.xx的请求都转发至VIP让LVS进行处理;
3、lvs(四层)再根据负载策略(这里是rr)将请求转发至后端服务器(nginx01,02)
4、nginx(七层)接收到请求后 根据相应的域名(这里可以设置泛域名) 转发至ingress处理;
ps:这里加nginx主要进行七层负载,根据客户端请求的域名来进行处理,代理ingress的同时,也可以当作正常的nginx(添加相应的vhost就行)处理业务;


一、部署ipvsadm和keepalived
  1. lvs01和lvs02节点都部署
复制代码
  1. [root@localhost ~]# yum install ipvsadm keepalived
复制代码

二、配置keepalived



1.配置lvs01(keepalived master)
  1. [root@lvs01-master ~]# vim /etc/keepalived/keepalived.conf
  2. global_defs {
  3. # 这里将邮件设置的相关信息都注释掉了
  4. # router_id是keepalived的一个标识,最好不同的keepalived配置成不一样
  5.    router_id LVS_DEVEL_MASTER
  6. }

  7. vrrp_instance VI_1 {
  8.     # MASTER表示是主节点,备份节点是BACKUP
  9.     state MASTER
  10.     # 工作接口用于选举,这里写网卡名称,这个不同的服务器,可能有所不同
  11.     interface ens33
  12.     # vrrp虚拟路由标识,如果是一组虚拟路由内的MASTER和BACKUP节点的该值要保持一致,如果是多组就定义多个,范围0-255
  13.     virtual_router_id 51
  14.     # 优先级,MASTER节点的值必须大于BACKUP的值
  15.     priority 100
  16.     # MASTER与BACKUP同步的时间间隔,单位为秒
  17.     advert_int 1
  18.     # lvs对应的真实IP
  19.     mcast_src_ip=192.168.1.5
  20.     authentication {
  21.         auth_type PASS
  22.         auth_pass 1111
  23.     }
  24.     # 虚拟IP的地址
  25.     virtual_ipaddress {
  26.         192.168.1.188
  27.     }
  28. }

  29. #定义lvs集群服务 这里就相当于设置lvs路由 也可以说是防火墙规则,当有请求来请求虚拟地址时转发至下面配置的真实服务器
  30. virtual_server 192.168.1.188 80 {
  31.     # 健康检查的时间,单位为秒
  32.     delay_loop 6
  33.     # 负载调度算法,这里设置为rr,即轮询算法
  34.     lb_algo rr
  35.     # 设置DR模式,返回请求时,不走LVS,直接返回到客户端。
  36.     lb_kind DR
  37.     # 虚拟地址的子网掩码
  38.     nat_mask 255.255.255.0
  39.     # 会话保持时间(对动态网页非常有用),单位为秒
  40.     persistence_timeout 50
  41.     #指定转发协议类型,有TCP和UDP两种
  42.     protocol TCP

  43.     # 配置后端真实服务器信息(这里指ngx)
  44.     # 当然如果只是lvs+keepalived+ingress高可用的话,在这里就可以直接写ingress的信息
  45.     real_server 192.168.1.7 80 {
  46.         # 节点的权重,数字越大权重越高,被转发至此服务器的请求也就相应的多
  47.         weight 1
  48.         #realserver的状态监测设置 单位秒
  49.         TCP_CHECK {
  50.             # 连接超时时间
  51.             connect_timeout 3
  52.             # 重试次数
  53.             nb_get_retry 3
  54.             # 重试间隔
  55.             delay_before_retry 3
  56.         }
  57.     }

  58.     real_server 192.168.1.8 80 {
  59.         weight 1
  60.         TCP_CHECK {
  61.             connect_timeout 3
  62.             nb_get_retry 3
  63.             delay_before_retry 3
  64.         }
  65.     }
  66. }

  67. virtual_server 192.168.1.188 443 {
  68.     delay_loop 6
  69.     lb_algo rr
  70.     lb_kind DR
  71.     nat_mask 255.255.255.0
  72.     persistence_timeout 50
  73.     protocol TCP

  74.     real_server 192.168.1.7 443 {
  75.         weight 1
  76.         TCP_CHECK {
  77.             connect_timeout 3
  78.             nb_get_retry 3
  79.             delay_before_retry 3
  80.         }
  81.     }

  82.     real_server 192.168.1.8 443 {
  83.         weight 1
  84.         TCP_CHECK {
  85.             connect_timeout 3
  86.             nb_get_retry 3
  87.             delay_before_retry 3
  88.         }
  89.     }
  90. }
复制代码

2.配置lvs02(keepalived backup)
  1. [root@lvs02-slave ~]# vim /etc/keepalived/keepalived.conf
  2. global_defs {
  3. # 这里将邮件设置的相关信息都注释掉了
  4. # router_id是keepalived的一个标识,最好不同的keepalived配置成不一样
  5.    router_id LVS_DEVEL_BACKUP
  6. }

  7. vrrp_instance VI_1 {
  8.     # MASTER表示是主节点,备份节点是BACKUP
  9.     state BACKUP
  10.     # 工作接口用于选举,这里写网卡名称,这个不同的服务器,可能有所不同
  11.     interface ens33
  12.     # vrrp虚拟路由标识,如果是一组虚拟路由内的MASTER和BACKUP节点的该值要保持一致,如果是多组就定义多个,范围0-255
  13.     virtual_router_id 51
  14.     # 优先级,MASTER节点的值必须大于BACKUP的值
  15.     priority 99
  16.     # MASTER与BACKUP同步的时间间隔,单位为秒
  17.     advert_int 1
  18.     # lvs对应的真实IP
  19.     mcast_src_ip=192.168.1.6
  20.     authentication {
  21.         auth_type PASS
  22.         auth_pass 1111
  23.     }
  24.     # 虚拟IP的址
  25.     virtual_ipaddress {
  26.         192.168.1.188
  27.     }
  28. }

  29. #定义lvs集群服务 这里就相当于设置lvs路由 也可以说是防火墙规则,当有请求来请求虚拟地址时转发至下面配置的真实服务器
  30. virtual_server 192.168.1.188 80 {
  31.     # 健康检查的时间,单位为秒
  32.     delay_loop 6
  33.     # 负载调度算法,这里设置为rr,即轮询算法
  34.     lb_algo rr
  35.     # 设置DR模式,返回请求时,不走LVS,直接返回到客户端。
  36.     lb_kind DR
  37.     # 虚拟地址的子网掩码
  38.     nat_mask 255.255.255.0
  39.     # 会话保持时间(对动态网页非常有用),单位为秒
  40.     persistence_timeout 50
  41.     #指定转发协议类型,有TCP和UDP两种
  42.     protocol TCP

  43.     # 配置后端真实服务器信息(这里指ngx)
  44.     # 当然如果只是lvs+keepalived+ingress高可用的话,在这里就可以直接写ingress的信息
  45.     real_server 192.168.1.7 80 {
  46.         # 节点的权重,数字越大权重越高,被转发至此服务器的请求也就相应的多
  47.         weight 1
  48.         #realserver的状态监测设置 单位秒
  49.         TCP_CHECK {
  50.             # 连接超时时间
  51.             connect_timeout 3
  52.             # 重试次数
  53.             nb_get_retry 3
  54.             # 重试间隔
  55.             delay_before_retry 3
  56.         }
  57.     }

  58.     real_server 192.168.1.8 80 {
  59.         weight 1
  60.         TCP_CHECK {
  61.             connect_timeout 3
  62.             nb_get_retry 3
  63.             delay_before_retry 3
  64.         }
  65.     }
  66. }

  67. virtual_server 192.168.1.188 443 {
  68.     delay_loop 6
  69.     lb_algo rr
  70.     lb_kind DR
  71.     nat_mask 255.255.255.0
  72.     persistence_timeout 50
  73.     protocol TCP

  74.     real_server 192.168.1.7 443 {
  75.         weight 1
  76.         TCP_CHECK {
  77.             connect_timeout 3
  78.             nb_get_retry 3
  79.             delay_before_retry 3
  80.         }
  81.     }

  82.     real_server 192.168.1.8 443 {
  83.         weight 1
  84.         TCP_CHECK {
  85.             connect_timeout 3
  86.             nb_get_retry 3
  87.             delay_before_retry 3
  88.         }
  89.     }
  90. }
复制代码
三、启动两台keepalived

分别启动两台keepalived并加入开机自启后查看此时的网络变化以及ipvs
  1. [root@lvs01-master ~]# systemctl start keepalived
  2. [root@lvs01-master ~]# systemctl enable keepalived
复制代码
如下状态 keepalived已经正常运行了,可以看到简短日志指的是健康检查未检测到后端真是服务器节点然后在ipvs中删除了就不会路由请求了

在keepalived master节点查看网卡是否
  1. 生成了虚拟VIP
复制代码
  1. [root@lvs01-master ~]# ip a
复制代码

再查看路由转发情况(此时的lvs01 02节点都会有此路由转发的规则)
  1. [root@lvs01-master ~]# ipvsadm -Ln
复制代码

如上我们可以看到有两条TCP规则,分别代表的是
  1. keepalived里的"virtual_server"
复制代码
的配置,但是现在他们下面没有真实的服务器 是因为我们后端真实的服务器ngx还没启动~

四、安装ngx并配置代理ingress启动
  1. ngx01 nginx02 同操作
复制代码

1.yum安装并配置ngx
  1. [root@ngx01 ~]# yum -y install nginx nginx-all-modules
  2. [root@ngx01 ~]# vim /etc/nginx/nginx.conf
  3. #这里将默认的server块配置的端口监听改为除80以外的端口,因为80端口会用来代理ingress配合keepalived做检测
  4. ...
  5.     server {
  6.         listen       90;
  7.         listen       [::]:90;
  8.         server_name  _;
  9.         root         /usr/share/nginx/html;
  10. ...
  11.     }
复制代码
2.ngx反向代理ingress
  1. upstream ingress-server-http{
  2.   server 192.168.1.3:80 max_fails=2 fail_timeout=30s;
  3.   server 192.168.1.2:80 max_fails=2 fail_timeout=30s;
  4. }

  5. upstream ingress-server-https{
  6.   server 192.168.1.3:443 max_fails=2 fail_timeout=30s;
  7.   server 192.168.1.2:443 max_fails=2 fail_timeout=30s;
  8. }


  9. server {                                    # 设定虚拟主机配置
  10.         listen  80;                             # 监听的端口
  11.         server_name  web2.study.com;            # 监听的地址,多个域名用空格隔开
  12.         location / {                            # 默认请求 ,后面 "/" 表示开启反向代理,也可以是正则表达式
  13.            #proxy_set_header X-Real-IP $remote_addr;
  14.            #proxy_set_header X-Real-Port $remote_port;
  15.            #proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
  16.            #root     html;                       # 监听地址的默认网站根目录位置
  17.            proxy_set_header Host $http_host;    # 重写请求头中的host字段
  18.            #proxy_set_header X-Forward-For $remote_addr;
  19.                                                 # 配置XFF,记录HTTP的请求端真实的IP

  20.            proxy_pass   http://ingress-server-http;   # 代理转发
  21.            #index  index.html index.htm;         # 欢迎页面
  22.            #proxy_set_header Host $host;
  23.            #proxy_set_header X-Real-IP $remote_addr;
  24.            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  25.            #proxy_set_header X-Forwarded-Proto $scheme;   
  26.         }
  27.         add_header backendCode $upstream_status;
  28.         add_header BackendIP "$upstream_addr;" always;
  29. }

  30. server {                                    # 设定虚拟主机配置
  31.         #listen  80;                             # 监听的端口
  32.         listen 443 ssl;
  33.         server_name  web2.study.com;            # 监听的地址,多个域名用空格隔开

  34.         ssl_certificate /etc/nginx/conf.d/cert/web2.study.com.crt;
  35.         ssl_certificate_key /etc/nginx/conf.d/cert/web2.study.com.key;
  36.         ssl_session_timeout 5m;
  37.         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  38.         ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
  39.         ssl_prefer_server_ciphers on;


  40.         location / {                            # 默认请求 ,后面 "/" 表示开启反向代理,也可以是正则表达式
  41.            proxy_pass   https://ingress-server-https;
  42.            proxy_set_header Host $host;
  43.            proxy_set_header X-Real-IP $remote_addr;
  44.            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  45.            proxy_set_header X-Forwarded-Proto $scheme;

  46.         }
  47.         add_header backendCode $upstream_status;
  48.         add_header BackendIP "$upstream_addr;" always;
  49. }
复制代码
3.启动ngx
  1. [root@ngx01 ~]# nginx
  2. [root@ngx01 ~]# ps -ef |grep nginx
  3. root      65865      1  0 22:48 ?        00:00:00 nginx: master process nginx
  4. nginx     65866  65865  0 22:48 ?        00:00:00 nginx: worker process
  5. root      65868  65838  0 22:48 pts/1    00:00:00 grep --color=auto nginx
复制代码


4.关闭后端服务器ngx的arp查询功能并设置回环IP
  1. [root@ngx01 ~]# vim /etc/nginx/conf.d/lvs-rs.sh
  2. vip=192.168.1.188
  3. mask='255.255.255.255'
  4. dev=lo:0

  5. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  6. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  7. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  8. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

  9. sysctl -w net.ipv4.ip_forward=1
  10. ifconfig $dev $vip broadcast $vip netmask $mask up
  11. route add -host $vip dev $dev

  12. [root@ngx01 conf.d]# chmod +755 lvs-rs.sh
  13. [root@ngx01 conf.d]# bash lvs-rs.sh
复制代码
5.再次查看keepalived状态和lvs路由转发规则

后端服务器ngx启动并配置后查看keepalived日志,发现监听到了后端服务器并将路由加入了转发规则内
  1. [root@lvs01-master ~]# journalctl -f -u keepalived
复制代码
  1. [root@lvs01-master ~]# ipvsadm
复制代码


五、验证


1.验证此架构是否可以正常处理请求

k8s创建一个pod应用,并暴露ingress 模拟用户访问,此时需要将ingress的域名解析绑定为 虚拟VIP

浏览器模拟用户访问


如上 实现了nginx反向代理ingress的轮询流程

2.验证后端真实服务器ngx是否高可用

接下来验证每次请求都会负载到哪台后端真实服务器nginx来转发到ingress的呢,这就需要在ingress-controller上进行配置了
修改ingress的日志输出格式,并查看ingress的访问日志
  1. [root@k8s-master ~]# vim /etc/kubernetes/manifests/ingress-controller.yaml
  2. apiVersion: v1
  3. data:
  4.   log-format-upstream: '{"time": "$time_iso8601", "remote_addr": "$proxy_protocol_addr", "x_forwarded_for": "$proxy_add_x_forwarded_for", "request_id": "$req_id","remote_user": "$remote_user", "bytes_sent": $bytes_sent, "request_time": $request_time, "status": $status, "vhost": "$host", "request_proto": "$server_protocol","path": "$uri", "request_query": "$args", "request_length": $request_length, "duration": $request_time,"method": "$request
  5. _method", "http_referrer": "$http_referer","http_user_agent": "$http_user_agent" }'
  6. kind: ConfigMap
  7. ...
复制代码
  1. [root@k8s-master ~]# kubectl apply -f /etc/kubernetes/manifests/ingress-controller.yaml
复制代码

如上图可以发现现在我们的请求都是经过nginx01 IP为1.7这台机器转发过来的
现关闭1.7这台ngx01模拟故障,客户端接着请求看是否会把请求转发至另一台1.8nginx02上
  1. [root@ngx01 conf.d]# killall nginx
复制代码

当ngx01宕机后,我们也可以通过keepalived的日志看到ngx01会被健康检测剔除
此时lvs的路由规则如下


3.验证lvs+keepalived是否高可用

当 keepalived master节点和backup节点同时在线且运行正常时,虚拟VIP会在keepalived master上, 如下:
  1. lvs01-master节点:
复制代码
  1. lvs02-backup节点:
复制代码

此时将lvs01 master节点的 keeaplived服务停止模拟宕机故障,看虚拟Vip是否会漂移到lvs02 backup节点上
  1. [root@lvs01-master ~]# systemctl stop keepalived
复制代码
再次查看lvs02 backup节点
  1. 可以看到虚拟vip已经漂移过来了
复制代码
,并可以正常的提供服务,可以通过keepalived的日志来查看漂移过程;
ps:附加一个https的访问


方式二:Nginx+Keepalived+Ingress


serverIPngx01-master(keepalived)192.168.1.5ngx02-slave(keepalived)192.168.1.6ingress-ngx-controller01192.168.1.2ingress-ngx-controller02192.168.1.3这种方式是直接用nginx做负载均衡,同时兼顾反向代理的角色,直接通过七层代理协议来通过域名来分发请求,当并发少时可以使用这种方式
ps:每日PV1000万以下或并发请求1万以下都可以考虑用Nginx;构建大型网站或者提供重要服务且机器较多时,可多加考虑利用LVS。

一、部署keepalived及nginx

两台同操作
  1. [root@localhost ~]# yum -y install nginx keepalived nginx-all-modules
复制代码
二、配置nginx


1.修改ngx主配置文件

两台同操作
  1. [root@localhost ~]# vim /etc/nginx/nginx.conf
  2. #这里将默认的server块配置的端口监听改为除80以外的端口,因为80端口会用来代理ingress配合keepalived做检测
  3. ...
  4.     server {
  5.         listen       90;
  6.         listen       [::]:90;
  7.         server_name  _;
  8.         root         /usr/share/nginx/html;
  9. ...
  10.     }
复制代码
2.ngx反向代理ingress并启动

两台ngx同操作
  1. [root@localhost ~]# vim /etc/nginx/conf.d/proxy-ingress.conf
  2. upstream ingress-server-http{
  3.   server 192.168.1.3:80 max_fails=2 fail_timeout=30s;
  4.   server 192.168.1.2:80 max_fails=2 fail_timeout=30s;
  5. }

  6. upstream ingress-server-https{
  7.   server 192.168.1.3:443 max_fails=2 fail_timeout=30s;
  8.   server 192.168.1.2:443 max_fails=2 fail_timeout=30s;
  9. }

  10. server {                                    # 设定虚拟主机配置
  11.         listen  80;                             # 监听的端口
  12.         server_name  *.study.com;            # 监听的地址,多个域名用空格隔开
  13.         location / {                            # 默认请求 ,后面 "/" 表示开启反向代理,也可以是正则表达式
  14.            proxy_set_header Host $http_host;    # 重写请求头中的host字段
  15.            proxy_pass   http://ingress-server-http;   # 代理转发
  16.            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  17.         }
  18.         add_header backendCode $upstream_status;
  19.         add_header BackendIP "$upstream_addr;" always;
  20. }


  21. server {                                    # 设定虚拟主机配置
  22.         #listen  80;                             # 监听的端口
  23.         listen 443 ssl;
  24.         server_name  *.study.com;            # 监听的地址,多个域名用空格隔开

  25.         ssl_certificate /etc/nginx/conf.d/cert/web2.study.com.crt;
  26.         ssl_certificate_key /etc/nginx/conf.d/cert/web2.study.com.key;
  27.         ssl_session_timeout 5m;
  28.         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  29.         ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
  30.         ssl_prefer_server_ciphers on;


  31.         location / {                            # 默认请求 ,后面 "/" 表示开启反向代理,也可以是正则表达式
  32.            proxy_pass   https://ingress-server-https;
  33.            proxy_set_header Host $host;
  34.            proxy_set_header X-Real-IP $remote_addr;
  35.            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  36.            proxy_set_header X-Forwarded-Proto $scheme;

  37.         }
  38.         add_header backendCode $upstream_status;
  39.         add_header BackendIP "$upstream_addr;" always;
  40. }
复制代码
三、配置keepalived


1. 配置ngx01-master
  1. [root@localhost ~]# vim /etc/keepalived/keepalived.conf
  2. global_defs {
  3.    router_id NGINX_MASTER
  4. }

  5. vrrp_script check_nginx {
  6.   script "/etc/keepalived/check_nginx.sh"
  7. }

  8. vrrp_instance VI_1 {
  9.     state MASTER
  10.     interface ens33 #修改为实际网卡名
  11.     virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,同一组虚拟路由器的vrid必须一致
  12.     priority 100 #优先级,备服务设置90
  13.     advert_int 1 #指定VRRP心跳包通告间隔时间,默认为1秒
  14.     authentication {
  15.         auth_type PASS
  16.         auth_pass 1111
  17.     }
  18.     #虚拟IP
  19.     virtual_ipaddress {
  20.         192.168.1.99/24
  21.     }
  22.     track_script {
  23.         check_nginx
  24.     }
  25. }
复制代码
2. 配置ngx02-slave
  1. global_defs {
  2.    router_id NNGINX_BACKUP
  3. }

  4. vrrp_script check_nginx {
  5.   script "/etc/keepalived/check_nginx.sh"
  6. }

  7. vrrp_instance VI_1 {
  8.     state BACKUP
  9.     interface ens33
  10.     virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,同一组虚拟路由器的vrid必须一致
  11.     priority 90
  12.     advert_int 1
  13.     authentication {
  14.         auth_type PASS
  15.         auth_pass 1111
  16.     }
  17.     virtual_ipaddress {
  18.         192.168.1.99/24
  19.     }
  20.     track_script {
  21.         check_nginx
  22.     }
  23. }
复制代码
3.配置检查nginx运行状态的脚本

两台同操作
check_nginx.sh 检测nginx脚本如下
  1. [root@localhost ~]# vim /etc/keepalived/check_nginx.sh
  2. nginx_status_http=$(ss -unptl |grep 80 |egrep -cv "grep|$$")
  3. nginx_status_https=$(ss -unptl |grep 443 |egrep -cv "grep|$$")

  4. if [ $nginx_status_http -ne 0 ] && [ $nginx_status_https -ne 0 ];then
  5.   exit 0
  6.   #echo "检测通过"
  7. else
  8.   exit 1
  9.   #echo "检测不通过"
  10. fi
复制代码
然后启动keepalived
  1. systemctl start keepalived
复制代码

四、验证

验证步骤跟第一种方式类似,keepalived起来之后看下虚拟vip,然后模拟kill掉其中一台的nginx服务看 IP是否会漂移到另一台上;
不同的是:
第一种方式两台lvs服务器挂掉一台VIP会漂移至另一台;
这种方式是两台服务器中的nginx服务挂掉一个VIP就会漂移至另一台;

方式三:LVS+Keepalived+Ingress


serverIPlvs01-master(keepalived)192.168.1.5lvs02-slave(keepalived)192.168.1.6ingress-ngx-controller01192.168.1.2ingress-ngx-controller02192.168.1.3这种方式和第一种方式步骤相同,只不过不用添加ngx这一步了,
只需要 将keepalived配置的真实服务器(real_server)换成ingress controller的pod所在节点IP地址 和 关闭ingress controller的pod所在节点的arp查询功能并设置回环IP即可
一、部署ipvsadm和keepalived
  1. lvs01和lvs02节点都部署
复制代码
  1. [root@localhost ~]# yum install ipvsadm keepalived
复制代码
二、配置keepalived

1.配置lvs01(keepalived master)
  1. [root@lvs01-master ~]# vim /etc/keepalived/keepalived.conf
  2. global_defs {
  3. # 这里将邮件设置的相关信息都注释掉了
  4. # router_id是keepalived的一个标识,最好不同的keepalived配置成不一样
  5.    router_id LVS_DEVEL_MASTER
  6. }

  7. vrrp_instance VI_1 {
  8.     # MASTER表示是主节点,备份节点是BACKUP
  9.     state MASTER
  10.     # 工作接口用于选举,这里写网卡名称,这个不同的服务器,可能有所不同
  11.     interface ens33
  12.     # vrrp虚拟路由标识,如果是一组虚拟路由内的MASTER和BACKUP节点的该值要保持一致,如果是多组就定义多个,范围0-255
  13.     virtual_router_id 51
  14.     # 优先级,MASTER节点的值必须大于BACKUP的值
  15.     priority 100
  16.     # MASTER与BACKUP同步的时间间隔,单位为秒
  17.     advert_int 1
  18.     # lvs对应的真实IP
  19.     mcast_src_ip=192.168.1.5
  20.     authentication {
  21.         auth_type PASS
  22.         auth_pass 1111
  23.     }
  24.     # 虚拟IP的地址
  25.     virtual_ipaddress {
  26.         192.168.1.188
  27.     }
  28. }

  29. #定义lvs集群服务 这里就相当于设置lvs路由 也可以说是防火墙规则,当有请求来请求虚拟地址时转发至下面配置的真实服务器
  30. virtual_server 192.168.1.188 80 {
  31.     # 健康检查的时间,单位为秒
  32.     delay_loop 6
  33.     # 负载调度算法,这里设置为rr,即轮询算法
  34.     lb_algo rr
  35.     # 设置DR模式,返回请求时,不走LVS,直接返回到客户端。
  36.     lb_kind DR
  37.     # 虚拟地址的子网掩码
  38.     nat_mask 255.255.255.0
  39.     # 会话保持时间(对动态网页非常有用),单位为秒
  40.     persistence_timeout 50
  41.     #指定转发协议类型,有TCP和UDP两种
  42.     protocol TCP

  43.     # 配置后端真实服务器信息(这里指ngx)
  44.     # 当然如果只是lvs+keepalived+ingress高可用的话,在这里就可以直接写ingress的信息
  45.     real_server 192.168.1.2 80 {
  46.         # 节点的权重,数字越大权重越高,被转发至此服务器的请求也就相应的多
  47.         weight 1
  48.         #realserver的状态监测设置 单位秒
  49.         TCP_CHECK {
  50.             # 连接超时时间
  51.             connect_timeout 3
  52.             # 重试次数
  53.             nb_get_retry 3
  54.             # 重试间隔
  55.             delay_before_retry 3
  56.         }
  57.     }

  58.     real_server 192.168.1.3 80 {
  59.         weight 1
  60.         TCP_CHECK {
  61.             connect_timeout 3
  62.             nb_get_retry 3
  63.             delay_before_retry 3
  64.         }
  65.     }
  66. }

  67. virtual_server 192.168.1.188 443 {
  68.     delay_loop 6
  69.     lb_algo rr
  70.     lb_kind DR
  71.     nat_mask 255.255.255.0
  72.     persistence_timeout 50
  73.     protocol TCP

  74.     real_server 192.168.1.2 443 {
  75.         weight 1
  76.         TCP_CHECK {
  77.             connect_timeout 3
  78.             nb_get_retry 3
  79.             delay_before_retry 3
  80.         }
  81.     }

  82.     real_server 192.168.1.3 443 {
  83.         weight 1
  84.         TCP_CHECK {
  85.             connect_timeout 3
  86.             nb_get_retry 3
  87.             delay_before_retry 3
  88.         }
  89.     }
  90. }
复制代码
2.配置lvs02(keepalived backup)
  1. [root@lvs02-slave ~]# vim /etc/keepalived/keepalived.conf
  2. global_defs {
  3. # 这里将邮件设置的相关信息都注释掉了
  4. # router_id是keepalived的一个标识,最好不同的keepalived配置成不一样
  5.    router_id LVS_DEVEL_BACKUP
  6. }

  7. vrrp_instance VI_1 {
  8.     # MASTER表示是主节点,备份节点是BACKUP
  9.     state BACKUP
  10.     # 工作接口用于选举,这里写网卡名称,这个不同的服务器,可能有所不同
  11.     interface ens33
  12.     # vrrp虚拟路由标识,如果是一组虚拟路由内的MASTER和BACKUP节点的该值要保持一致,如果是多组就定义多个,范围0-255
  13.     virtual_router_id 51
  14.     # 优先级,MASTER节点的值必须大于BACKUP的值
  15.     priority 99
  16.     # MASTER与BACKUP同步的时间间隔,单位为秒
  17.     advert_int 1
  18.     # lvs对应的真实IP
  19.     mcast_src_ip=192.168.1.6
  20.     authentication {
  21.         auth_type PASS
  22.         auth_pass 1111
  23.     }
  24.     # 虚拟IP的址
  25.     virtual_ipaddress {
  26.         192.168.1.188
  27.     }
  28. }

  29. #定义lvs集群服务 这里就相当于设置lvs路由 也可以说是防火墙规则,当有请求来请求虚拟地址时转发至下面配置的真实服务器
  30. virtual_server 192.168.1.188 80 {
  31.     # 健康检查的时间,单位为秒
  32.     delay_loop 6
  33.     # 负载调度算法,这里设置为rr,即轮询算法
  34.     lb_algo rr
  35.     # 设置DR模式,返回请求时,不走LVS,直接返回到客户端。
  36.     lb_kind DR
  37.     # 虚拟地址的子网掩码
  38.     nat_mask 255.255.255.0
  39.     # 会话保持时间(对动态网页非常有用),单位为秒
  40.     persistence_timeout 50
  41.     #指定转发协议类型,有TCP和UDP两种
  42.     protocol TCP

  43.     # 配置后端真实服务器信息(这里指ngx)
  44.     # 当然如果只是lvs+keepalived+ingress高可用的话,在这里就可以直接写ingress的信息
  45.     real_server 192.168.1.2 80 {
  46.         # 节点的权重,数字越大权重越高,被转发至此服务器的请求也就相应的多
  47.         weight 1
  48.         #realserver的状态监测设置 单位秒
  49.         TCP_CHECK {
  50.             # 连接超时时间
  51.             connect_timeout 3
  52.             # 重试次数
  53.             nb_get_retry 3
  54.             # 重试间隔
  55.             delay_before_retry 3
  56.         }
  57.     }

  58.     real_server 192.168.1.3 80 {
  59.         weight 1
  60.         TCP_CHECK {
  61.             connect_timeout 3
  62.             nb_get_retry 3
  63.             delay_before_retry 3
  64.         }
  65.     }
  66. }

  67. virtual_server 192.168.1.188 443 {
  68.     delay_loop 6
  69.     lb_algo rr
  70.     lb_kind DR
  71.     nat_mask 255.255.255.0
  72.     persistence_timeout 50
  73.     protocol TCP

  74.     real_server 192.168.1.2 443 {
  75.         weight 1
  76.         TCP_CHECK {
  77.             connect_timeout 3
  78.             nb_get_retry 3
  79.             delay_before_retry 3
  80.         }
  81.     }

  82.     real_server 192.168.1.3 443 {
  83.         weight 1
  84.         TCP_CHECK {
  85.             connect_timeout 3
  86.             nb_get_retry 3
  87.             delay_before_retry 3
  88.         }
  89.     }
  90. }
复制代码
三、关闭ingress所在节点的arp查询功能并设置回环IP

ingress pod所在节点都要执行
  1. [root@k8s-node2 ~]# vim /home/fands/lvs-rs.sh
  2. vip=192.168.1.188
  3. mask='255.255.255.255'
  4. dev=lo:0

  5. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  6. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  7. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  8. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

  9. sysctl -w net.ipv4.ip_forward=1
  10. ifconfig $dev $vip broadcast $vip netmask $mask up
  11. route add -host $vip dev $dev

  12. [root@ngx01 conf.d]# chmod +755 lvs-rs.sh
  13. [root@ngx01 conf.d]# bash lvs-rs.sh
复制代码
四、验证

这个方式验证方法跟方式一相同,不管是其中哪一个ingress pod 挂掉都不影响正常使用,其中lvs挂掉之后虚拟IP都会进行漂移至另一台lvs上不影响业务使用;可自行验证

总结

本文所有高可用的方式都是将域名解析至keepalived的VIP
  1. 遇到的问题如下:
复制代码
当使用ingress配置了https时,再使用nginx反向代理ingress的443端口的话,此时访问域名会发现访问地址被强制转了https,此时在ingress处并没有添加强制转https的配置,甚至还想
  1. 能通过http访问
复制代码

这样的话需要在ingress配置 将
  1. 强制https关闭
复制代码
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   annotations:
  5.     nginx.ingress.kubernetes.io/ssl-redirect: "false"
复制代码
到此这篇关于Nginx ingress controller高可用的实现的文章就介绍到这了,更多相关Nginx ingress controller高可用 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/server/322297pfz.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具