实现Ingress-Nginx Controller高可用方案

news2024/11/27 12:58:03

文章目录

  • 前提准备
    • 1.修改Ingress-Controller 运行模式为`hostNetwork`并生效
    • 2.给部署ingress-controller的节点打标签
    • 3.查看ingress-controller的部署情况
  • 方式一:LVS+Keepalived+Nginx+Ingress
  • 一、部署ipvsadm和keepalived
  • 二、配置keepalived
    • 1.配置lvs01(keepalived master)
    • 2.配置lvs02(keepalived backup)
  • 三、启动两台keepalived
  • 四、安装ngx并配置代理ingress启动
    • 1.yum安装并配置ngx
    • 2.ngx反向代理ingress
    • 3.启动ngx
    • 4.关闭后端服务器ngx的arp查询功能并设置回环IP
    • 5.再次查看keepalived状态和lvs路由转发规则
  • 五、验证
    • 1.验证此架构是否可以正常处理请求
    • 2.验证后端真实服务器ngx是否高可用
    • 3.验证lvs+keepalived是否高可用
  • 方式二:Nginx+Keepalived+Ingress
  • 一、部署keepalived及nginx
  • 二、配置nginx
    • 1.修改ngx主配置文件
    • 2.ngx反向代理ingress并启动
  • 三、配置keepalived
    • 1. 配置ngx01-master
    • 2. 配置ngx02-slave
    • 3.配置检查nginx运行状态的脚本
  • 四、验证
  • 方式三:LVS+Keepalived+Ingress
  • 一、部署ipvsadm和keepalived
  • 二、配置keepalived
    • 1.配置lvs01(keepalived master)
    • 2.配置lvs02(keepalived backup)
  • 三、关闭ingress所在节点的arp查询功能并设置回环IP
  • 四、验证
  • 总结


前提准备

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

1.修改Ingress-Controller 运行模式为hostNetwork并生效

apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.3.0
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  minReadySeconds: 0
  revisionHistoryLimit: 10
...
    spec:
      #共享宿主机的网络协议栈(不给ingress controller分配独立的网路命名空间,与宿主机网络命名空间共享)
      hostNetwork: True
      containers:
      - args:
        - /nginx-ingress-controller
        - --election-id=ingress-controller-leader
        - --controller-class=k8s.io/ingress-nginx
        - --ingress-class=nginx
        - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
        - --validating-webhook=:8443
        - --validating-webhook-certificate=/usr/local/certificates/cert
        - --validating-webhook-key=/usr/local/certificates/key
        ...
        volumeMounts:
        - mountPath: /usr/local/certificates/
          name: webhook-cert
          readOnly: true
      dnsPolicy: ClusterFirst
      #添加节点调度器
      nodeSelector:
        #节点上含有的标签
        ingress: "yes"
      serviceAccountName: ingress-nginx
      terminationGracePeriodSeconds: 300
      volumes:
      - name: webhook-cert
        secret:
          secretName: ingress-nginx-admission

在这里插入图片描述

在这里插入图片描述

2.给部署ingress-controller的节点打标签

[root@k8s-master ~]# kubectl label nodes/k8s-node1 ingress=yes
[root@k8s-master ~]# kubectl label nodes/k8s-node2 ingress=yes

在这里插入图片描述

3.查看ingress-controller的部署情况

[root@k8s-master ~]# kubectl get pod -n ingress-nginx -o wide 
NAME                                   READY   STATUS      RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
ingress-nginx-admission-create-7gnc4   0/1     Completed   0          59d   10.244.107.200   k8s-node3   <none>           <none>
ingress-nginx-admission-patch-ldmt4    0/1     Completed   0          59d   10.244.107.199   k8s-node3   <none>           <none>
ingress-nginx-controller-qcfj8         1/1     Running     1          14d   192.168.1.3      k8s-node2   <none>           <none>
ingress-nginx-controller-zf5vd         1/1     Running     2          14d   192.168.1.2      k8s-node1   <none>           <none>

方式一:LVS+Keepalived+Nginx+Ingress

在这里插入图片描述

serverIP
lvs01-master(keepalived)192.168.1.5
lvs02-slave(keepalived)192.168.1.6
nginx01192.168.1.7
nginx02192.168.1.8
ingress-ngx-controller01192.168.1.2
ingress-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

lvs01和lvs02节点都部署

[root@localhost ~]# yum install ipvsadm keepalived

二、配置keepalived

1.配置lvs01(keepalived master)

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

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

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

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

    real_server 192.168.1.8 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 192.168.1.188 443 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.7 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.8 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

2.配置lvs02(keepalived backup)

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

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

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

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

    real_server 192.168.1.8 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 192.168.1.188 443 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.7 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.8 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

三、启动两台keepalived

分别启动两台keepalived并加入开机自启后查看此时的网络变化以及ipvs

[root@lvs01-master ~]# systemctl start keepalived 
[root@lvs01-master ~]# systemctl enable keepalived 

如下状态 keepalived已经正常运行了,可以看到简短日志指的是健康检查未检测到后端真是服务器节点然后在ipvs中删除了就不会路由请求了
在这里插入图片描述
在keepalived master节点查看网卡是否生成了虚拟VIP

[root@lvs01-master ~]# ip a 

在这里插入图片描述
再查看路由转发情况(此时的lvs01 02节点都会有此路由转发的规则)

[root@lvs01-master ~]# ipvsadm -Ln

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


四、安装ngx并配置代理ingress启动

ngx01 nginx02 同操作

1.yum安装并配置ngx

[root@ngx01 ~]# yum -y install nginx nginx-all-modules
[root@ngx01 ~]# vim /etc/nginx/nginx.conf
#这里将默认的server块配置的端口监听改为除80以外的端口,因为80端口会用来代理ingress配合keepalived做检测
...
    server {
        listen       90;
        listen       [::]:90;
        server_name  _;
        root         /usr/share/nginx/html;
...
    }

2.ngx反向代理ingress

upstream ingress-server-http{
  server 192.168.1.3:80 max_fails=2 fail_timeout=30s;
  server 192.168.1.2:80 max_fails=2 fail_timeout=30s;
}

upstream ingress-server-https{
  server 192.168.1.3:443 max_fails=2 fail_timeout=30s;
  server 192.168.1.2:443 max_fails=2 fail_timeout=30s;
}


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

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

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

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


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

        }
        add_header backendCode $upstream_status;
        add_header BackendIP "$upstream_addr;" always;
}

3.启动ngx

[root@ngx01 ~]# nginx
[root@ngx01 ~]# ps -ef |grep nginx 
root      65865      1  0 22:48 ?        00:00:00 nginx: master process nginx
nginx     65866  65865  0 22:48 ?        00:00:00 nginx: worker process
root      65868  65838  0 22:48 pts/1    00:00:00 grep --color=auto nginx

在这里插入图片描述


4.关闭后端服务器ngx的arp查询功能并设置回环IP

[root@ngx01 ~]# vim /etc/nginx/conf.d/lvs-rs.sh
vip=192.168.1.188
mask='255.255.255.255'
dev=lo:0

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

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

[root@ngx01 conf.d]# chmod +755 lvs-rs.sh 
[root@ngx01 conf.d]# bash lvs-rs.sh 

5.再次查看keepalived状态和lvs路由转发规则

后端服务器ngx启动并配置后查看keepalived日志,发现监听到了后端服务器并将路由加入了转发规则内

[root@lvs01-master ~]# journalctl -f -u keepalived

在这里插入图片描述

[root@lvs01-master ~]# ipvsadm

在这里插入图片描述

五、验证

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

k8s创建一个pod应用,并暴露ingress 模拟用户访问,此时需要将ingress的域名解析绑定为 虚拟VIP
在这里插入图片描述
浏览器模拟用户访问
在这里插入图片描述

在这里插入图片描述

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


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

接下来验证每次请求都会负载到哪台后端真实服务器nginx来转发到ingress的呢,这就需要在ingress-controller上进行配置了

修改ingress的日志输出格式,并查看ingress的访问日志

[root@k8s-master ~]# vim /etc/kubernetes/manifests/ingress-controller.yaml 
apiVersion: v1
data:
  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
_method", "http_referrer": "$http_referer","http_user_agent": "$http_user_agent" }'
kind: ConfigMap
...

在这里插入图片描述

[root@k8s-master ~]# kubectl apply -f /etc/kubernetes/manifests/ingress-controller.yaml

在这里插入图片描述
如上图可以发现现在我们的请求都是经过nginx01 IP为1.7这台机器转发过来的

现关闭1.7这台ngx01模拟故障,客户端接着请求看是否会把请求转发至另一台1.8nginx02上

[root@ngx01 conf.d]# killall nginx 

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

在这里插入图片描述


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

当 keepalived master节点和backup节点同时在线且运行正常时,虚拟VIP会在keepalived master上, 如下:

lvs01-master节点:
在这里插入图片描述
lvs02-backup节点:
在这里插入图片描述
此时将lvs01 master节点的 keeaplived服务停止模拟宕机故障,看虚拟Vip是否会漂移到lvs02 backup节点上

[root@lvs01-master ~]# systemctl stop keepalived

再次查看lvs02 backup节点
在这里插入图片描述
可以看到虚拟vip已经漂移过来了,并可以正常的提供服务,可以通过keepalived的日志来查看漂移过程;

ps:附加一个https的访问
在这里插入图片描述


方式二:Nginx+Keepalived+Ingress

在这里插入图片描述

serverIP
ngx01-master(keepalived)192.168.1.5
ngx02-slave(keepalived)192.168.1.6
ingress-ngx-controller01192.168.1.2
ingress-ngx-controller02192.168.1.3

这种方式是直接用nginx做负载均衡,同时兼顾反向代理的角色,直接通过七层代理协议来通过域名来分发请求,当并发少时可以使用这种方式

ps:每日PV1000万以下或并发请求1万以下都可以考虑用Nginx;构建大型网站或者提供重要服务且机器较多时,可多加考虑利用LVS。

一、部署keepalived及nginx

两台同操作

[root@localhost ~]# yum -y install nginx keepalived nginx-all-modules

二、配置nginx

1.修改ngx主配置文件

两台同操作

[root@localhost ~]# vim /etc/nginx/nginx.conf
#这里将默认的server块配置的端口监听改为除80以外的端口,因为80端口会用来代理ingress配合keepalived做检测
...
    server {
        listen       90;
        listen       [::]:90;
        server_name  _;
        root         /usr/share/nginx/html;
...
    }

2.ngx反向代理ingress并启动

两台ngx同操作

[root@localhost ~]# vim /etc/nginx/conf.d/proxy-ingress.conf
upstream ingress-server-http{
  server 192.168.1.3:80 max_fails=2 fail_timeout=30s;
  server 192.168.1.2:80 max_fails=2 fail_timeout=30s;
}

upstream ingress-server-https{
  server 192.168.1.3:443 max_fails=2 fail_timeout=30s;
  server 192.168.1.2:443 max_fails=2 fail_timeout=30s;
}

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


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

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


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

        }
        add_header backendCode $upstream_status;
        add_header BackendIP "$upstream_addr;" always;
}

三、配置keepalived

1. 配置ngx01-master

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
global_defs {
   router_id NGINX_MASTER
}

vrrp_script check_nginx {
  script "/etc/keepalived/check_nginx.sh"
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33 #修改为实际网卡名
    virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,同一组虚拟路由器的vrid必须一致
    priority 100 #优先级,备服务设置90
    advert_int 1 #指定VRRP心跳包通告间隔时间,默认为1秒
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟IP
    virtual_ipaddress {
        192.168.1.99/24
    }
    track_script {
        check_nginx
    }
}

2. 配置ngx02-slave

global_defs {
   router_id NNGINX_BACKUP
}

vrrp_script check_nginx {
  script "/etc/keepalived/check_nginx.sh"
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,同一组虚拟路由器的vrid必须一致
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.99/24
    }
    track_script {
        check_nginx
    }
}

3.配置检查nginx运行状态的脚本

两台同操作

check_nginx.sh 检测nginx脚本如下

[root@localhost ~]# vim /etc/keepalived/check_nginx.sh
nginx_status_http=$(ss -unptl |grep 80 |egrep -cv "grep|$$")
nginx_status_https=$(ss -unptl |grep 443 |egrep -cv "grep|$$")

if [ $nginx_status_http -ne 0 ] && [ $nginx_status_https -ne 0 ];then
  exit 0
  #echo "检测通过"
else
  exit 1
  #echo "检测不通过"
fi

然后启动keepalived

systemctl start keepalived

四、验证

验证步骤跟第一种方式类似,keepalived起来之后看下虚拟vip,然后模拟kill掉其中一台的nginx服务看 IP是否会漂移到另一台上;

不同的是:
第一种方式两台lvs服务器挂掉一台VIP会漂移至另一台;

这种方式是两台服务器中的nginx服务挂掉一个VIP就会漂移至另一台;

方式三:LVS+Keepalived+Ingress

在这里插入图片描述

serverIP
lvs01-master(keepalived)192.168.1.5
lvs02-slave(keepalived)192.168.1.6
ingress-ngx-controller01192.168.1.2
ingress-ngx-controller02192.168.1.3

这种方式和第一种方式步骤相同,只不过不用添加ngx这一步了,
只需要 将keepalived配置的真实服务器(real_server)换成ingress controller的pod所在节点IP地址关闭ingress controller的pod所在节点的arp查询功能并设置回环IP即可

一、部署ipvsadm和keepalived

lvs01和lvs02节点都部署

[root@localhost ~]# yum install ipvsadm keepalived

二、配置keepalived

1.配置lvs01(keepalived master)

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

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

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

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

    real_server 192.168.1.3 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 192.168.1.188 443 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.2 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.3 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

2.配置lvs02(keepalived backup)

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

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

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

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

    real_server 192.168.1.3 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 192.168.1.188 443 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.2 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.1.3 443 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

三、关闭ingress所在节点的arp查询功能并设置回环IP

ingress pod所在节点都要执行

[root@k8s-node2 ~]# vim /home/fands/lvs-rs.sh
vip=192.168.1.188
mask='255.255.255.255'
dev=lo:0

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

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

[root@ngx01 conf.d]# chmod +755 lvs-rs.sh 
[root@ngx01 conf.d]# bash lvs-rs.sh 

四、验证

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




总结

本文所有高可用的方式都是将域名解析至keepalived的VIP

遇到的问题如下:
当使用ingress配置了https时,
再使用nginx反向代理ingress的443端口的话,此时访问域名会发现访问地址被强制转了https,此时在ingress处并没有添加强制转https的配置,甚至还想能通过http访问
这样的话需要在ingress配置 将强制https关闭

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1802957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.haproxy负载均衡

haproxy负载均衡 一、haproxy介绍1、负载均衡类型 二、haproxy配置文件1、backend2、frontend 三、haproxy实现MySQL负载均衡 —— 4层1、后端两台MySQL配置双主复制2、安装配置haproxy2.1 安装软件2.2 编辑配置2.3 启动haproxy2.4 测试通过haproxy正常连接MySQL 四、haproxy实…

机器学习----奥卡姆剃刀定律

奥卡姆剃刀定律&#xff08;Occam’s Razor&#xff09;是一条哲学原则&#xff0c;通常表述为“如无必要&#xff0c;勿增实体”&#xff08;Entities should not be multiplied beyond necessity&#xff09;或“在其他条件相同的情况下&#xff0c;最简单的解释往往是最好的…

容器化部署fastdfs文件存储

目录 一、软件信息 二、构建fastdfs镜像 三、docker 启动fdfs服务 四、k8s部署fdfs服务 1、fdfs部署文件 五、外部服务访问 一、软件信息 fastdfs版本&#xff1a;fastdfs:V5.11 libfastcommon版本: V1.0.36 fastdfs-nginx-module版本&#xff1a;V1.20 nginx版本&am…

【python】OpenCV—Blob Detection(11)

学习来自OpenCV基础&#xff08;10&#xff09;使用OpenCV进行Blob检测 文章目录 1、cv2.SimpleBlobDetector_create 中文文档2、默认 parameters3、配置 parameters附录——cv2.drawKeypoints 1、cv2.SimpleBlobDetector_create 中文文档 cv2.SimpleBlobDetector_create 是 O…

LeetCode72编辑距离

题目描述 解析 一般这种给出两个字符串的动态规划问题都是维护一个二维数组&#xff0c;尺寸和这两个字符串的长度相等&#xff0c;用二维做完了后可以尝试优化空间。这一题其实挺类似1143这题的&#xff0c;只不过相比1143的一种方式&#xff0c;变成了三种方式&#xff0c;就…

Linux基础2-基本指令4(cp,mv,cat,tac)

上篇文章我们说到了rmdir,rm,man,echo.重定向等知识。 Linux基础1-基本指令3-CSDN博客 本文继续梳理其他基础指令 1.本章重点 1.使用cp命令拷贝文件 2.使用mv命令移动文件 3.使用cat&#xff0c;tac查看小文本文件 2.cp命令 在linux中使用cp命令来拷贝粘贴文件 cp src(原文…

信息学奥赛初赛天天练-23-CSP-J2023基础题-指针、链表、哈夫曼树与哈夫曼编码的实战应用与技巧大揭秘

PDF文档公众号回复关键字:20240608 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 4 假设有一个链表的节点定义如下&#xff1a; struct Node {int data; Node* next; };现在有一个指向链表头部…

【深度学习】CICIDS 2019,入侵检测,SVM支持向量机,随机森林,DNN训练,混淆矩阵

文章目录 数据集介绍Python环境随机森林训练结果SVM支持向量机训练结果DNN训练结果所有代码下载 数据集介绍 下载&#xff1a;https://www.kaggle.com/datasets/tarundhamor/cicids-2019-dataset 数据个数&#xff1a; # 删除label中是WebDDoS的数据df df[df[Label] ! WebDD…

Java Web学习笔记26——Element常用组件

常见组件&#xff1a; 就是一个复制和粘贴的过程。 Table表格&#xff1a;用于展示多条结构类的数据&#xff0c;可对数据进行排序、筛选、对比或其他自定义操作。 常见组件-分页主键&#xff1a; Pagination&#xff1a;分页&#xff1a;当数据量比较多时&#xff0c;使用分…

第七届全国颗粒材料计算力学会议召开,DEMms多尺度离散模拟软件受关注

近日&#xff0c;第七届全国颗粒材料计算力学会议暨第四届计算颗粒技术国际研讨会在南京召开。会议聚焦颗粒材料的力学理论及模型、计算分析与软件开发、工程应用和相关前沿方向中的关键科学问题和难点技术问题&#xff0c;开展广泛的学术交流和讨论。 会议期间&#xff0c;积鼎…

【Python列表解锁】:掌握序列精髓,驾驭动态数据集合

文章目录 &#x1f680;一、列表&#x1f308;二、常规操作&#x1f4a5;增&#x1f4a5;删&#x1f4a5;改&#x1f4a5;查 ⭐三、补充操作 &#x1f680;一、列表 列表是一个能够存储多个同一或不同元素的序列 列表&#xff1a;list ---- [] 列表属于序列类型&#xff08;容器…

WWDC 2024前瞻:苹果如何用AI技术重塑iOS 18和Siri

苹果下周的全球开发者大会有望成为这家 iPhone 制造商历史上的关键时刻。在 WWDC 上&#xff0c;这家库比蒂诺科技巨头将展示如何选择将人工智能技术集成到其设备和软件中&#xff0c;包括通过与 OpenAI 的历史性合作伙伴关系。随着重大事件的临近&#xff0c;有关 iOS 18 及其…

高能来袭|联想拯救者携手《黑神话:悟空》玩转东方神话世界

从2020年首次发布实机演示视频以来&#xff0c;《黑神话&#xff1a;悟空》便在全球范围内获得了广泛关注&#xff0c;成为国产3A游戏的现象级爆款。6月&#xff0c;联想拯救者正式宣布成为《黑神话&#xff1a;悟空》全球官方合作伙伴&#xff0c;致力于共同革新国产游戏体验&…

老师必备!一文教你如何高效收集志愿填报信息

高考志愿填报季&#xff0c;对于每一位老师来说&#xff0c;无疑是一场信息收集与管理的硬仗。如何在众多的志愿信息中&#xff0c;高效、准确地掌握每位学生的志愿意向&#xff1f; 高考志愿填报的重要性。不仅是学生人生的一个重要转折点&#xff0c;也是老师教育生涯中的一次…

Elasticsearch 认证模拟题 - 15

一、题目 原索引 task1 的字段 title 字段包含单词 The&#xff0c;查询 the 可以查出 1200 篇文档。重建 task1 索引为 task1_new&#xff0c;重建后的索引&#xff0c; title 字段查询 the 单词&#xff0c;不能匹配到任何文档。 PUT task1 {"mappings": {"…

Latex中表格(3)

Latex中的表格 一、多行或多列单元格 这篇主要说Latex中表格出现多行或者多列单元格的形式. 一、多行或多列单元格 可能用到的宏包 \usepackage{booktabs}\usepackage{multirow} 代码&#xff1a; \begin{table}[h!] \centering \caption{Your caption here} \begin{tabul…

斯坦福天才少女创5亿独角兽!Pika获8000万融资,金牌团队首曝光

斯坦福天才少女创立的公司Pika&#xff0c;继续书写传奇。 GPT-4o深夜发布&#xff01;Plus免费可用&#xff01;https://www.zhihu.com/pin/1773645611381747712 没体验过OpenAI最新版GPT-4o&#xff1f;快戳最详细升级教程&#xff0c;几分钟搞定&#xff1a;升级ChatGPT-4o …

地图之战争迷雾/地图算法/自动导航(一)

战争迷雾 TiledMap 创建黑色覆盖块&#xff0c;然后使用碰撞组件&#xff0c;控制黑色块的显示和隐藏 地图算法 在有些游戏中&#xff0c;地图需要随机生成&#xff0c;比如游戏中的迷宫等&#xff0c;这就需要地图生成的算法&#xff1b;在角色扮演类游戏中&#xff0c;角色…

【AIGC】基于大模型+知识库的Code Review实践

一、背景描述 一句话介绍就是&#xff1a;基于开源大模型 知识库的 Code Review 实践&#xff0c;类似一个代码评审助手&#xff08;CR Copilot&#xff09;。信息安全合规问题&#xff1a;公司内代码直接调 ChatGPT / Claude 会有安全/合规问题&#xff0c;为了使用 ChatGPT…

华为云服务器-云容器引擎 CCE环境构建及项目部署

1、切换地区 2、搜索云容器引擎 CCE 3、购买集群 4、创建容器节点 通过漫长的等待(五分钟左右)&#xff0c;由创建中变为运行中&#xff0c;则表明容器已经搭建成功 购买成功后&#xff0c;返回容器控制台界面 5、节点容器管理 6、创建redis工作负载 7、创建mysql工作负载 8、…