实现Ingress-Nginx Controller高可用方案

文章目录


前提准备

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

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

bash 复制代码
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的节点打标签

bash 复制代码
[root@k8s-master ~]# kubectl label nodes/k8s-node1 ingress=yes
[root@k8s-master ~]# kubectl label nodes/k8s-node2 ingress=yes

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

bash 复制代码
[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

server IP
lvs01-master(keepalived) 192.168.1.5
lvs02-slave(keepalived) 192.168.1.6
nginx01 192.168.1.7
nginx02 192.168.1.8
ingress-ngx-controller01 192.168.1.2
ingress-ngx-controller02 192.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节点都部署

bash 复制代码
[root@localhost ~]# yum install ipvsadm keepalived

二、配置keepalived

1.配置lvs01(keepalived master)

bash 复制代码
[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)

bash 复制代码
[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

bash 复制代码
[root@lvs01-master ~]# systemctl start keepalived 
[root@lvs01-master ~]# systemctl enable keepalived 

如下状态 keepalived已经正常运行了,可以看到简短日志指的是健康检查未检测到后端真是服务器节点然后在ipvs中删除了就不会路由请求了

在keepalived master节点查看网卡是否生成了虚拟VIP

bash 复制代码
[root@lvs01-master ~]# ip a 


再查看路由转发情况(此时的lvs01 02节点都会有此路由转发的规则)

bash 复制代码
[root@lvs01-master ~]# ipvsadm -Ln

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

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

ngx01 nginx02 同操作

1.yum安装并配置ngx

bash 复制代码
[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

bash 复制代码
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

bash 复制代码
[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

bash 复制代码
[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日志,发现监听到了后端服务器并将路由加入了转发规则内

bash 复制代码
[root@lvs01-master ~]# journalctl -f -u keepalived
bash 复制代码
[root@lvs01-master ~]# ipvsadm

五、验证

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

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

浏览器模拟用户访问

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

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

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

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

bash 复制代码
[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
...
bash 复制代码
[root@k8s-master ~]# kubectl apply -f /etc/kubernetes/manifests/ingress-controller.yaml


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

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

bash 复制代码
[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节点上

bash 复制代码
[root@lvs01-master ~]# systemctl stop keepalived

再次查看lvs02 backup节点

可以看到虚拟vip已经漂移过来了,并可以正常的提供服务,可以通过keepalived的日志来查看漂移过程;

ps:附加一个https的访问

方式二:Nginx+Keepalived+Ingress

server IP
ngx01-master(keepalived) 192.168.1.5
ngx02-slave(keepalived) 192.168.1.6
ingress-ngx-controller01 192.168.1.2
ingress-ngx-controller02 192.168.1.3

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

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

一、部署keepalived及nginx

两台同操作

bash 复制代码
[root@localhost ~]# yum -y install nginx keepalived nginx-all-modules

二、配置nginx

1.修改ngx主配置文件

两台同操作

bash 复制代码
[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同操作

bash 复制代码
[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

bash 复制代码
[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

bash 复制代码
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脚本如下

bash 复制代码
[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

bash 复制代码
systemctl start keepalived

四、验证

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

不同的是:

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

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

方式三:LVS+Keepalived+Ingress

server IP
lvs01-master(keepalived) 192.168.1.5
lvs02-slave(keepalived) 192.168.1.6
ingress-ngx-controller01 192.168.1.2
ingress-ngx-controller02 192.168.1.3

这种方式和第一种方式步骤相同,只不过不用添加ngx这一步了,

只需要 将keepalived配置的真实服务器(real_server)换成ingress controller的pod所在节点IP地址关闭ingress controller的pod所在节点的arp查询功能并设置回环IP即可

一、部署ipvsadm和keepalived

lvs01和lvs02节点都部署

bash 复制代码
[root@localhost ~]# yum install ipvsadm keepalived

二、配置keepalived

1.配置lvs01(keepalived master)

bash 复制代码
[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)

bash 复制代码
[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所在节点都要执行

bash 复制代码
[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关闭

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

相关推荐
极简网络科技22 分钟前
Docker、Wsl 打包迁移环境
运维·docker·容器
黑客老李26 分钟前
JavaSec | SpringAOP 链学习分析
java·运维·服务器·开发语言·学习·apache·memcached
杨浦老苏27 分钟前
轻量级Docker管理工具Docker Switchboard
运维·docker·群晖
江湖有缘30 分钟前
【Docker管理工具】部署Docker可视化管理面板Dpanel
运维·docker·容器
一加一等于二42 分钟前
docker部署postgresql17,并且安装插件
docker·postgresql
RussellFans1 小时前
Linux 文本三剑客(grep, awk, sed)
linux·运维·服务器
猴哥聊项目管理2 小时前
什么是DevOps智能平台的核心功能?
运维·项目管理·制造·devops·软件·项目管理软件·软件分享
Chuncheng's blog2 小时前
CentOS 7如何编译安装升级gcc至7.5版本?
linux·运维·c++·centos
猫咪老师19952 小时前
多系统一键打包docker compose下所有镜像并且使用
java·docker·容器
aitav02 小时前
⚡️ Linux Docker 基本命令参数详解
linux·运维·docker