Nginx?ingress?controller高可用的實(shí)現(xiàn)
前提準(zhǔn)備
既然要實(shí)現(xiàn)ingress controller的高可用必須是多實(shí)例部署ingress,這里我們可以使用Daemonset+nodeseletor的模式進(jìn)行部署多實(shí)例,這樣就可以將ingress部署多個(gè)實(shí)例且能根據(jù)標(biāo)簽選擇固定node(IP);
1.修改Ingress-Controller 運(yùn)行模式為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:
#共享宿主機(jī)的網(wǎng)絡(luò)協(xié)議棧(不給ingress controller分配獨(dú)立的網(wǎng)路命名空間,與宿主機(jī)網(wǎng)絡(luò)命名空間共享)
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
#添加節(jié)點(diǎn)調(diào)度器
nodeSelector:
#節(jié)點(diǎn)上含有的標(biāo)簽
ingress: "yes"
serviceAccountName: ingress-nginx
terminationGracePeriodSeconds: 300
volumes:
- name: webhook-cert
secret:
secretName: ingress-nginx-admission


2.給部署ingress-controller的節(jié)點(diǎn)打標(biāo)簽
[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

| 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、當(dāng)客戶端請求web2.study.com我們的服務(wù)時(shí),DNS會解析出這個(gè)域名對應(yīng)的IP為47.9x.5x.xx;
2、然后根據(jù)路由器上的nat將47.9x.5x.xx的請求都轉(zhuǎn)發(fā)至VIP讓LVS進(jìn)行處理;
3、lvs(四層)再根據(jù)負(fù)載策略(這里是rr)將請求轉(zhuǎn)發(fā)至后端服務(wù)器(nginx01,02)
4、nginx(七層)接收到請求后 根據(jù)相應(yīng)的域名(這里可以設(shè)置泛域名) 轉(zhuǎn)發(fā)至ingress處理;
ps:這里加nginx主要進(jìn)行七層負(fù)載,根據(jù)客戶端請求的域名來進(jìn)行處理,代理ingress的同時(shí),也可以當(dāng)作正常的nginx(添加相應(yīng)的vhost就行)處理業(yè)務(wù);
一、部署ipvsadm和keepalived
lvs01和lvs02節(jié)點(diǎn)都部署
[root@localhost ~]# yum install ipvsadm keepalived
二、配置keepalived
1.配置lvs01(keepalived master)
[root@lvs01-master ~]# vim /etc/keepalived/keepalived.conf
global_defs {
# 這里將郵件設(shè)置的相關(guān)信息都注釋掉了
# router_id是keepalived的一個(gè)標(biāo)識,最好不同的keepalived配置成不一樣
router_id LVS_DEVEL_MASTER
}
vrrp_instance VI_1 {
# MASTER表示是主節(jié)點(diǎn),備份節(jié)點(diǎn)是BACKUP
state MASTER
# 工作接口用于選舉,這里寫網(wǎng)卡名稱,這個(gè)不同的服務(wù)器,可能有所不同
interface ens33
# vrrp虛擬路由標(biāo)識,如果是一組虛擬路由內(nèi)的MASTER和BACKUP節(jié)點(diǎn)的該值要保持一致,如果是多組就定義多個(gè),范圍0-255
virtual_router_id 51
# 優(yōu)先級,MASTER節(jié)點(diǎn)的值必須大于BACKUP的值
priority 100
# MASTER與BACKUP同步的時(shí)間間隔,單位為秒
advert_int 1
# lvs對應(yīng)的真實(shí)IP
mcast_src_ip=192.168.1.5
authentication {
auth_type PASS
auth_pass 1111
}
# 虛擬IP的地址
virtual_ipaddress {
192.168.1.188
}
}
#定義lvs集群服務(wù) 這里就相當(dāng)于設(shè)置lvs路由 也可以說是防火墻規(guī)則,當(dāng)有請求來請求虛擬地址時(shí)轉(zhuǎn)發(fā)至下面配置的真實(shí)服務(wù)器
virtual_server 192.168.1.188 80 {
# 健康檢查的時(shí)間,單位為秒
delay_loop 6
# 負(fù)載調(diào)度算法,這里設(shè)置為rr,即輪詢算法
lb_algo rr
# 設(shè)置DR模式,返回請求時(shí),不走LVS,直接返回到客戶端。
lb_kind DR
# 虛擬地址的子網(wǎng)掩碼
nat_mask 255.255.255.0
# 會話保持時(shí)間(對動態(tài)網(wǎng)頁非常有用),單位為秒
persistence_timeout 50
#指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種
protocol TCP
# 配置后端真實(shí)服務(wù)器信息(這里指ngx)
# 當(dāng)然如果只是lvs+keepalived+ingress高可用的話,在這里就可以直接寫ingress的信息
real_server 192.168.1.7 80 {
# 節(jié)點(diǎn)的權(quán)重,數(shù)字越大權(quán)重越高,被轉(zhuǎn)發(fā)至此服務(wù)器的請求也就相應(yīng)的多
weight 1
#realserver的狀態(tài)監(jiān)測設(shè)置 單位秒
TCP_CHECK {
# 連接超時(shí)時(shí)間
connect_timeout 3
# 重試次數(shù)
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 {
# 這里將郵件設(shè)置的相關(guān)信息都注釋掉了
# router_id是keepalived的一個(gè)標(biāo)識,最好不同的keepalived配置成不一樣
router_id LVS_DEVEL_BACKUP
}
vrrp_instance VI_1 {
# MASTER表示是主節(jié)點(diǎn),備份節(jié)點(diǎn)是BACKUP
state BACKUP
# 工作接口用于選舉,這里寫網(wǎng)卡名稱,這個(gè)不同的服務(wù)器,可能有所不同
interface ens33
# vrrp虛擬路由標(biāo)識,如果是一組虛擬路由內(nèi)的MASTER和BACKUP節(jié)點(diǎn)的該值要保持一致,如果是多組就定義多個(gè),范圍0-255
virtual_router_id 51
# 優(yōu)先級,MASTER節(jié)點(diǎn)的值必須大于BACKUP的值
priority 99
# MASTER與BACKUP同步的時(shí)間間隔,單位為秒
advert_int 1
# lvs對應(yīng)的真實(shí)IP
mcast_src_ip=192.168.1.6
authentication {
auth_type PASS
auth_pass 1111
}
# 虛擬IP的址
virtual_ipaddress {
192.168.1.188
}
}
#定義lvs集群服務(wù) 這里就相當(dāng)于設(shè)置lvs路由 也可以說是防火墻規(guī)則,當(dāng)有請求來請求虛擬地址時(shí)轉(zhuǎn)發(fā)至下面配置的真實(shí)服務(wù)器
virtual_server 192.168.1.188 80 {
# 健康檢查的時(shí)間,單位為秒
delay_loop 6
# 負(fù)載調(diào)度算法,這里設(shè)置為rr,即輪詢算法
lb_algo rr
# 設(shè)置DR模式,返回請求時(shí),不走LVS,直接返回到客戶端。
lb_kind DR
# 虛擬地址的子網(wǎng)掩碼
nat_mask 255.255.255.0
# 會話保持時(shí)間(對動態(tài)網(wǎng)頁非常有用),單位為秒
persistence_timeout 50
#指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種
protocol TCP
# 配置后端真實(shí)服務(wù)器信息(這里指ngx)
# 當(dāng)然如果只是lvs+keepalived+ingress高可用的話,在這里就可以直接寫ingress的信息
real_server 192.168.1.7 80 {
# 節(jié)點(diǎn)的權(quán)重,數(shù)字越大權(quán)重越高,被轉(zhuǎn)發(fā)至此服務(wù)器的請求也就相應(yīng)的多
weight 1
#realserver的狀態(tài)監(jiān)測設(shè)置 單位秒
TCP_CHECK {
# 連接超時(shí)時(shí)間
connect_timeout 3
# 重試次數(shù)
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并加入開機(jī)自啟后查看此時(shí)的網(wǎng)絡(luò)變化以及ipvs
[root@lvs01-master ~]# systemctl start keepalived [root@lvs01-master ~]# systemctl enable keepalived
如下狀態(tài) keepalived已經(jīng)正常運(yùn)行了,可以看到簡短日志指的是健康檢查未檢測到后端真是服務(wù)器節(jié)點(diǎn)然后在ipvs中刪除了就不會路由請求了

在keepalived master節(jié)點(diǎn)查看網(wǎng)卡是否生成了虛擬VIP
[root@lvs01-master ~]# ip a

再查看路由轉(zhuǎn)發(fā)情況(此時(shí)的lvs01 02節(jié)點(diǎn)都會有此路由轉(zhuǎn)發(fā)的規(guī)則)
[root@lvs01-master ~]# ipvsadm -Ln

如上我們可以看到有兩條TCP規(guī)則,分別代表的是keepalived里的"virtual_server"的配置,但是現(xiàn)在他們下面沒有真實(shí)的服務(wù)器 是因?yàn)槲覀兒蠖苏鎸?shí)的服務(wù)器ngx還沒啟動~
四、安裝ngx并配置代理ingress啟動
ngx01 nginx02 同操作
1.yum安裝并配置ngx
[root@ngx01 ~]# yum -y install nginx nginx-all-modules
[root@ngx01 ~]# vim /etc/nginx/nginx.conf
#這里將默認(rèn)的server塊配置的端口監(jiān)聽改為除80以外的端口,因?yàn)?0端口會用來代理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 { # 設(shè)定虛擬主機(jī)配置
listen 80; # 監(jiān)聽的端口
server_name web2.study.com; # 監(jiān)聽的地址,多個(gè)域名用空格隔開
location / { # 默認(rèn)請求 ,后面 "/" 表示開啟反向代理,也可以是正則表達(dá)式
#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; # 監(jiān)聽地址的默認(rèn)網(wǎng)站根目錄位置
proxy_set_header Host $http_host; # 重寫請求頭中的host字段
#proxy_set_header X-Forward-For $remote_addr;
# 配置XFF,記錄HTTP的請求端真實(shí)的IP
proxy_pass http://ingress-server-http; # 代理轉(zhuǎn)發(fā)
#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 { # 設(shè)定虛擬主機(jī)配置
#listen 80; # 監(jiān)聽的端口
listen 443 ssl;
server_name web2.study.com; # 監(jiān)聽的地址,多個(gè)域名用空格隔開
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 / { # 默認(rèn)請求 ,后面 "/" 表示開啟反向代理,也可以是正則表達(dá)式
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.關(guān)閉后端服務(wù)器ngx的arp查詢功能并設(shè)置回環(huán)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狀態(tài)和lvs路由轉(zhuǎn)發(fā)規(guī)則
后端服務(wù)器ngx啟動并配置后查看keepalived日志,發(fā)現(xiàn)監(jiān)聽到了后端服務(wù)器并將路由加入了轉(zhuǎn)發(fā)規(guī)則內(nèi)
[root@lvs01-master ~]# journalctl -f -u keepalived

[root@lvs01-master ~]# ipvsadm

五、驗(yàn)證
1.驗(yàn)證此架構(gòu)是否可以正常處理請求
k8s創(chuàng)建一個(gè)pod應(yīng)用,并暴露ingress 模擬用戶訪問,此時(shí)需要將ingress的域名解析綁定為 虛擬VIP

瀏覽器模擬用戶訪問


如上 實(shí)現(xiàn)了nginx反向代理ingress的輪詢流程
2.驗(yàn)證后端真實(shí)服務(wù)器ngx是否高可用
接下來驗(yàn)證每次請求都會負(fù)載到哪臺后端真實(shí)服務(wù)器nginx來轉(zhuǎn)發(fā)到ingress的呢,這就需要在ingress-controller上進(jìn)行配置了
修改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

如上圖可以發(fā)現(xiàn)現(xiàn)在我們的請求都是經(jīng)過nginx01 IP為1.7這臺機(jī)器轉(zhuǎn)發(fā)過來的
現(xiàn)關(guān)閉1.7這臺ngx01模擬故障,客戶端接著請求看是否會把請求轉(zhuǎn)發(fā)至另一臺1.8nginx02上
[root@ngx01 conf.d]# killall nginx

當(dāng)ngx01宕機(jī)后,我們也可以通過keepalived的日志看到ngx01會被健康檢測剔除
此時(shí)lvs的路由規(guī)則如下

3.驗(yàn)證lvs+keepalived是否高可用
當(dāng) keepalived master節(jié)點(diǎn)和backup節(jié)點(diǎn)同時(shí)在線且運(yùn)行正常時(shí),虛擬VIP會在keepalived master上, 如下:
lvs01-master節(jié)點(diǎn):

lvs02-backup節(jié)點(diǎn):

此時(shí)將lvs01 master節(jié)點(diǎn)的 keeaplived服務(wù)停止模擬宕機(jī)故障,看虛擬Vip是否會漂移到lvs02 backup節(jié)點(diǎn)上
[root@lvs01-master ~]# systemctl stop keepalived
再次查看lvs02 backup節(jié)點(diǎn)

可以看到虛擬vip已經(jīng)漂移過來了,并可以正常的提供服務(wù),可以通過keepalived的日志來查看漂移過程;
ps:附加一個(gè)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做負(fù)載均衡,同時(shí)兼顧反向代理的角色,直接通過七層代理協(xié)議來通過域名來分發(fā)請求,當(dāng)并發(fā)少時(shí)可以使用這種方式
ps:每日PV1000萬以下或并發(fā)請求1萬以下都可以考慮用Nginx;構(gòu)建大型網(wǎng)站或者提供重要服務(wù)且機(jī)器較多時(shí),可多加考慮利用LVS。
一、部署keepalived及nginx
兩臺同操作
[root@localhost ~]# yum -y install nginx keepalived nginx-all-modules
二、配置nginx
1.修改ngx主配置文件
兩臺同操作
[root@localhost ~]# vim /etc/nginx/nginx.conf
#這里將默認(rèn)的server塊配置的端口監(jiān)聽改為除80以外的端口,因?yàn)?0端口會用來代理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 { # 設(shè)定虛擬主機(jī)配置
listen 80; # 監(jiān)聽的端口
server_name *.study.com; # 監(jiān)聽的地址,多個(gè)域名用空格隔開
location / { # 默認(rèn)請求 ,后面 "/" 表示開啟反向代理,也可以是正則表達(dá)式
proxy_set_header Host $http_host; # 重寫請求頭中的host字段
proxy_pass http://ingress-server-http; # 代理轉(zhuǎn)發(fā)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
add_header backendCode $upstream_status;
add_header BackendIP "$upstream_addr;" always;
}
server { # 設(shè)定虛擬主機(jī)配置
#listen 80; # 監(jiān)聽的端口
listen 443 ssl;
server_name *.study.com; # 監(jiān)聽的地址,多個(gè)域名用空格隔開
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 / { # 默認(rèn)請求 ,后面 "/" 表示開啟反向代理,也可以是正則表達(dá)式
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 #修改為實(shí)際網(wǎng)卡名
virtual_router_id 51 #每個(gè)虛擬路由器惟一標(biāo)識,范圍:0-255,同一組虛擬路由器的vrid必須一致
priority 100 #優(yōu)先級,備服務(wù)設(shè)置90
advert_int 1 #指定VRRP心跳包通告間隔時(shí)間,默認(rèn)為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 #每個(gè)虛擬路由器惟一標(biāo)識,范圍: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運(yùn)行狀態(tài)的腳本
兩臺同操作
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
四、驗(yàn)證
驗(yàn)證步驟跟第一種方式類似,keepalived起來之后看下虛擬vip,然后模擬kill掉其中一臺的nginx服務(wù)看 IP是否會漂移到另一臺上;
不同的是:
第一種方式兩臺lvs服務(wù)器掛掉一臺VIP會漂移至另一臺;
這種方式是兩臺服務(wù)器中的nginx服務(wù)掛掉一個(gè)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配置的真實(shí)服務(wù)器(real_server)換成ingress controller的pod所在節(jié)點(diǎn)IP地址 和 關(guān)閉ingress controller的pod所在節(jié)點(diǎn)的arp查詢功能并設(shè)置回環(huán)IP即可
一、部署ipvsadm和keepalived
lvs01和lvs02節(jié)點(diǎn)都部署
[root@localhost ~]# yum install ipvsadm keepalived
二、配置keepalived
1.配置lvs01(keepalived master)
[root@lvs01-master ~]# vim /etc/keepalived/keepalived.conf
global_defs {
# 這里將郵件設(shè)置的相關(guān)信息都注釋掉了
# router_id是keepalived的一個(gè)標(biāo)識,最好不同的keepalived配置成不一樣
router_id LVS_DEVEL_MASTER
}
vrrp_instance VI_1 {
# MASTER表示是主節(jié)點(diǎn),備份節(jié)點(diǎn)是BACKUP
state MASTER
# 工作接口用于選舉,這里寫網(wǎng)卡名稱,這個(gè)不同的服務(wù)器,可能有所不同
interface ens33
# vrrp虛擬路由標(biāo)識,如果是一組虛擬路由內(nèi)的MASTER和BACKUP節(jié)點(diǎn)的該值要保持一致,如果是多組就定義多個(gè),范圍0-255
virtual_router_id 51
# 優(yōu)先級,MASTER節(jié)點(diǎn)的值必須大于BACKUP的值
priority 100
# MASTER與BACKUP同步的時(shí)間間隔,單位為秒
advert_int 1
# lvs對應(yīng)的真實(shí)IP
mcast_src_ip=192.168.1.5
authentication {
auth_type PASS
auth_pass 1111
}
# 虛擬IP的地址
virtual_ipaddress {
192.168.1.188
}
}
#定義lvs集群服務(wù) 這里就相當(dāng)于設(shè)置lvs路由 也可以說是防火墻規(guī)則,當(dāng)有請求來請求虛擬地址時(shí)轉(zhuǎn)發(fā)至下面配置的真實(shí)服務(wù)器
virtual_server 192.168.1.188 80 {
# 健康檢查的時(shí)間,單位為秒
delay_loop 6
# 負(fù)載調(diào)度算法,這里設(shè)置為rr,即輪詢算法
lb_algo rr
# 設(shè)置DR模式,返回請求時(shí),不走LVS,直接返回到客戶端。
lb_kind DR
# 虛擬地址的子網(wǎng)掩碼
nat_mask 255.255.255.0
# 會話保持時(shí)間(對動態(tài)網(wǎng)頁非常有用),單位為秒
persistence_timeout 50
#指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種
protocol TCP
# 配置后端真實(shí)服務(wù)器信息(這里指ngx)
# 當(dāng)然如果只是lvs+keepalived+ingress高可用的話,在這里就可以直接寫ingress的信息
real_server 192.168.1.2 80 {
# 節(jié)點(diǎn)的權(quán)重,數(shù)字越大權(quán)重越高,被轉(zhuǎn)發(fā)至此服務(wù)器的請求也就相應(yīng)的多
weight 1
#realserver的狀態(tài)監(jiān)測設(shè)置 單位秒
TCP_CHECK {
# 連接超時(shí)時(shí)間
connect_timeout 3
# 重試次數(shù)
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 {
# 這里將郵件設(shè)置的相關(guān)信息都注釋掉了
# router_id是keepalived的一個(gè)標(biāo)識,最好不同的keepalived配置成不一樣
router_id LVS_DEVEL_BACKUP
}
vrrp_instance VI_1 {
# MASTER表示是主節(jié)點(diǎn),備份節(jié)點(diǎn)是BACKUP
state BACKUP
# 工作接口用于選舉,這里寫網(wǎng)卡名稱,這個(gè)不同的服務(wù)器,可能有所不同
interface ens33
# vrrp虛擬路由標(biāo)識,如果是一組虛擬路由內(nèi)的MASTER和BACKUP節(jié)點(diǎn)的該值要保持一致,如果是多組就定義多個(gè),范圍0-255
virtual_router_id 51
# 優(yōu)先級,MASTER節(jié)點(diǎn)的值必須大于BACKUP的值
priority 99
# MASTER與BACKUP同步的時(shí)間間隔,單位為秒
advert_int 1
# lvs對應(yīng)的真實(shí)IP
mcast_src_ip=192.168.1.6
authentication {
auth_type PASS
auth_pass 1111
}
# 虛擬IP的址
virtual_ipaddress {
192.168.1.188
}
}
#定義lvs集群服務(wù) 這里就相當(dāng)于設(shè)置lvs路由 也可以說是防火墻規(guī)則,當(dāng)有請求來請求虛擬地址時(shí)轉(zhuǎn)發(fā)至下面配置的真實(shí)服務(wù)器
virtual_server 192.168.1.188 80 {
# 健康檢查的時(shí)間,單位為秒
delay_loop 6
# 負(fù)載調(diào)度算法,這里設(shè)置為rr,即輪詢算法
lb_algo rr
# 設(shè)置DR模式,返回請求時(shí),不走LVS,直接返回到客戶端。
lb_kind DR
# 虛擬地址的子網(wǎng)掩碼
nat_mask 255.255.255.0
# 會話保持時(shí)間(對動態(tài)網(wǎng)頁非常有用),單位為秒
persistence_timeout 50
#指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種
protocol TCP
# 配置后端真實(shí)服務(wù)器信息(這里指ngx)
# 當(dāng)然如果只是lvs+keepalived+ingress高可用的話,在這里就可以直接寫ingress的信息
real_server 192.168.1.2 80 {
# 節(jié)點(diǎn)的權(quán)重,數(shù)字越大權(quán)重越高,被轉(zhuǎn)發(fā)至此服務(wù)器的請求也就相應(yīng)的多
weight 1
#realserver的狀態(tài)監(jiān)測設(shè)置 單位秒
TCP_CHECK {
# 連接超時(shí)時(shí)間
connect_timeout 3
# 重試次數(shù)
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
}
}
}
三、關(guān)閉ingress所在節(jié)點(diǎn)的arp查詢功能并設(shè)置回環(huán)IP
ingress pod所在節(jié)點(diǎn)都要執(zhí)行
[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
四、驗(yàn)證
這個(gè)方式驗(yàn)證方法跟方式一相同,不管是其中哪一個(gè)ingress pod 掛掉都不影響正常使用,其中l(wèi)vs掛掉之后虛擬IP都會進(jìn)行漂移至另一臺lvs上不影響業(yè)務(wù)使用;可自行驗(yàn)證
總結(jié)
本文所有高可用的方式都是將域名解析至keepalived的VIP
遇到的問題如下:當(dāng)使用ingress配置了https時(shí),再使用nginx反向代理ingress的443端口的話,此時(shí)訪問域名會發(fā)現(xiàn)訪問地址被強(qiáng)制轉(zhuǎn)了https,此時(shí)在ingress處并沒有添加強(qiáng)制轉(zhuǎn)https的配置,甚至還想能通過http訪問;
這樣的話需要在ingress配置 將強(qiáng)制https關(guān)閉;
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"到此這篇關(guān)于Nginx ingress controller高可用的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Nginx ingress controller高可用 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx 配置靜態(tài)緩存及靜態(tài)緩存文件沒有生成的問題及解決方案
這篇文章主要介紹了nginx 配置靜態(tài)緩存及靜態(tài)緩存文件沒有生成的問題及解決方案,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Nginx實(shí)現(xiàn)動態(tài)封禁IP的設(shè)計(jì)方案
為了封禁某些爬蟲或者惡意用戶對服務(wù)器的請求,我們需要建立一個(gè)動態(tài)的 IP 黑名單,對于黑名單中的 IP ,我們將拒絕提供服務(wù),并且可以設(shè)置封禁失效時(shí)間,所以本文給大家介紹了Nginx實(shí)現(xiàn)動態(tài)封禁IP的設(shè)計(jì)方案,需要的朋友可以參考下2024-12-12
Nginx啟動成功卻無法訪問網(wǎng)頁的問題分析和解決方案(完整的排除方案)
我是用的阿里云的服務(wù)器,所以我的問題就在于阿里云服務(wù)器必須單獨(dú)開端口,在找到這個(gè)問題之前,我已經(jīng)把所有能試的方法試過了一遍都沒有問題,在增加端口之后直接成功了,如果你也遇到了這樣的問題,就和我一起排除吧2023-12-12
Nginx編譯參數(shù)大全 configure參數(shù)中文詳解
這篇文章主要介紹了Nginx編譯參數(shù)大全,Nginx configure參數(shù)中文詳解,需要的朋友可以參考下2014-04-04
配置Nginx實(shí)現(xiàn)訪問本地靜態(tài)資源的完整指南
Nginx 是一個(gè)高性能的 HTTP 服務(wù)器和反向代理服務(wù)器,廣泛用于靜態(tài)資源的托管和負(fù)載均衡,在開發(fā)和生產(chǎn)環(huán)境中,我們常常需要使用 Nginx 來提供本地靜態(tài)資源的訪問,本文將詳細(xì)介紹如何配置 Nginx 以便訪問本地靜態(tài)資源,需要的朋友可以參考下2024-08-08

