Nginx?ingress?controller高可用的實現(xiàn)
前提準備
既然要實現(xiàn)ingress controller的高可用必須是多實例部署ingress,這里我們可以使用Daemonset+nodeseletor
的模式進行部署多實例,這樣就可以將ingress部署多個實例且能根據(jù)標簽選擇
固定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: #共享宿主機的網(wǎng)絡協(xié)議棧(不給ingress controller分配獨立的網(wǎng)路命名空間,與宿主機網(wǎng)絡命名空間共享) 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ào)度器 nodeSelector: #節(jié)點上含有的標簽 ingress: "yes" serviceAccountName: ingress-nginx terminationGracePeriodSeconds: 300 volumes: - name: webhook-cert secret: secretName: ingress-nginx-admission
2.給部署ingress-controller的節(jié)點打標簽
[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、當客戶端請求web2.study.com我們的服務時,DNS會解析出這個域名對應的IP為47.9x.5x.xx;
2、然后根據(jù)路由器上的nat將47.9x.5x.xx的請求都轉(zhuǎn)發(fā)至VIP讓LVS進行處理;
3、lvs(四層)再根據(jù)負載策略(這里是rr)將請求轉(zhuǎn)發(fā)至后端服務器(nginx01,02)
4、nginx(七層)接收到請求后 根據(jù)相應的域名(這里可以設置泛域名) 轉(zhuǎn)發(fā)至ingress處理;
ps:這里加nginx主要進行七層負載,根據(jù)客戶端請求的域名來進行處理,代理ingress的同時,也可以當作正常的nginx(添加相應的vhost就行)處理業(yè)務;
一、部署ipvsadm和keepalived
lvs01和lvs02節(jié)點都部署
[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表示是主節(jié)點,備份節(jié)點是BACKUP state MASTER # 工作接口用于選舉,這里寫網(wǎng)卡名稱,這個不同的服務器,可能有所不同 interface ens33 # vrrp虛擬路由標識,如果是一組虛擬路由內(nèi)的MASTER和BACKUP節(jié)點的該值要保持一致,如果是多組就定義多個,范圍0-255 virtual_router_id 51 # 優(yōu)先級,MASTER節(jié)點的值必須大于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路由 也可以說是防火墻規(guī)則,當有請求來請求虛擬地址時轉(zhuǎn)發(fā)至下面配置的真實服務器 virtual_server 192.168.1.188 80 { # 健康檢查的時間,單位為秒 delay_loop 6 # 負載調(diào)度算法,這里設置為rr,即輪詢算法 lb_algo rr # 設置DR模式,返回請求時,不走LVS,直接返回到客戶端。 lb_kind DR # 虛擬地址的子網(wǎng)掩碼 nat_mask 255.255.255.0 # 會話保持時間(對動態(tài)網(wǎng)頁非常有用),單位為秒 persistence_timeout 50 #指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種 protocol TCP # 配置后端真實服務器信息(這里指ngx) # 當然如果只是lvs+keepalived+ingress高可用的話,在這里就可以直接寫ingress的信息 real_server 192.168.1.7 80 { # 節(jié)點的權(quán)重,數(shù)字越大權(quán)重越高,被轉(zhuǎn)發(fā)至此服務器的請求也就相應的多 weight 1 #realserver的狀態(tài)監(jiān)測設置 單位秒 TCP_CHECK { # 連接超時時間 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 { # 這里將郵件設置的相關信息都注釋掉了 # router_id是keepalived的一個標識,最好不同的keepalived配置成不一樣 router_id LVS_DEVEL_BACKUP } vrrp_instance VI_1 { # MASTER表示是主節(jié)點,備份節(jié)點是BACKUP state BACKUP # 工作接口用于選舉,這里寫網(wǎng)卡名稱,這個不同的服務器,可能有所不同 interface ens33 # vrrp虛擬路由標識,如果是一組虛擬路由內(nèi)的MASTER和BACKUP節(jié)點的該值要保持一致,如果是多組就定義多個,范圍0-255 virtual_router_id 51 # 優(yōu)先級,MASTER節(jié)點的值必須大于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路由 也可以說是防火墻規(guī)則,當有請求來請求虛擬地址時轉(zhuǎn)發(fā)至下面配置的真實服務器 virtual_server 192.168.1.188 80 { # 健康檢查的時間,單位為秒 delay_loop 6 # 負載調(diào)度算法,這里設置為rr,即輪詢算法 lb_algo rr # 設置DR模式,返回請求時,不走LVS,直接返回到客戶端。 lb_kind DR # 虛擬地址的子網(wǎng)掩碼 nat_mask 255.255.255.0 # 會話保持時間(對動態(tài)網(wǎng)頁非常有用),單位為秒 persistence_timeout 50 #指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種 protocol TCP # 配置后端真實服務器信息(這里指ngx) # 當然如果只是lvs+keepalived+ingress高可用的話,在這里就可以直接寫ingress的信息 real_server 192.168.1.7 80 { # 節(jié)點的權(quán)重,數(shù)字越大權(quán)重越高,被轉(zhuǎn)發(fā)至此服務器的請求也就相應的多 weight 1 #realserver的狀態(tài)監(jiān)測設置 單位秒 TCP_CHECK { # 連接超時時間 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并加入開機自啟后查看此時的網(wǎng)絡變化以及ipvs
[root@lvs01-master ~]# systemctl start keepalived [root@lvs01-master ~]# systemctl enable keepalived
如下狀態(tài) keepalived已經(jīng)正常運行了,可以看到簡短日志指的是健康檢查未檢測到后端真是服務器節(jié)點然后在ipvs中刪除了就不會路由請求了
在keepalived master節(jié)點查看網(wǎng)卡是否生成了虛擬VIP
[root@lvs01-master ~]# ip a
再查看路由轉(zhuǎn)發(fā)情況(此時的lvs01 02節(jié)點都會有此路由轉(zhuǎn)發(fā)的規(guī)則)
[root@lvs01-master ~]# ipvsadm -Ln
如上我們可以看到有兩條TCP規(guī)則,分別代表的是keepalived里的"virtual_server"
的配置,但是現(xiàn)在他們下面沒有真實的服務器 是因為我們后端真實的服務器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塊配置的端口監(jiān)聽改為除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; # 監(jiān)聽的端口 server_name web2.study.com; # 監(jiān)聽的地址,多個域名用空格隔開 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; # 監(jiān)聽地址的默認網(wǎng)站根目錄位置 proxy_set_header Host $http_host; # 重寫請求頭中的host字段 #proxy_set_header X-Forward-For $remote_addr; # 配置XFF,記錄HTTP的請求端真實的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 { # 設定虛擬主機配置 #listen 80; # 監(jiān)聽的端口 listen 443 ssl; server_name web2.study.com; # 監(jiān)聽的地址,多個域名用空格隔開 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查詢功能并設置回環(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ī)則
后端服務器ngx啟動并配置后查看keepalived日志,發(fā)現(xiàn)監(jiān)聽到了后端服務器并將路由加入了轉(zhuǎn)發(fā)規(guī)則內(nèi)
[root@lvs01-master ~]# journalctl -f -u keepalived
[root@lvs01-master ~]# ipvsadm
五、驗證
1.驗證此架構(gòu)是否可以正常處理請求
k8s創(chuàng)建一個pod應用,并暴露ingress 模擬用戶訪問,此時需要將ingress的域名解析綁定為 虛擬VIP
瀏覽器模擬用戶訪問
如上 實現(xiàn)了nginx反向代理ingress的輪詢流程
2.驗證后端真實服務器ngx是否高可用
接下來驗證每次請求都會負載到哪臺后端真實服務器nginx來轉(zhuǎn)發(fā)到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
如上圖可以發(fā)現(xiàn)現(xiàn)在我們的請求都是經(jīng)過nginx01 IP為1.7這臺機器轉(zhuǎn)發(fā)過來的
現(xiàn)關閉1.7這臺ngx01模擬故障,客戶端接著請求看是否會把請求轉(zhuǎn)發(fā)至另一臺1.8nginx02上
[root@ngx01 conf.d]# killall nginx
當ngx01宕機后,我們也可以通過keepalived的日志看到ngx01會被健康檢測剔除
此時lvs的路由規(guī)則如下
3.驗證lvs+keepalived是否高可用
當 keepalived master節(jié)點和backup節(jié)點同時在線且運行正常時,虛擬VIP會在keepalived master上, 如下:
lvs01-master節(jié)點:
lvs02-backup節(jié)點:
此時將lvs01 master節(jié)點的 keeaplived服務停止模擬宕機故障,看虛擬Vip是否會漂移到lvs02 backup節(jié)點上
[root@lvs01-master ~]# systemctl stop keepalived
再次查看lvs02 backup節(jié)點
可以看到虛擬vip已經(jīng)漂移過來了
,并可以正常的提供服務,可以通過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做負載均衡,同時兼顧反向代理的角色,直接通過七層代理協(xié)議來通過域名來分發(fā)請求,當并發(fā)少時可以使用這種方式
ps:每日PV1000萬以下或并發(fā)請求1萬以下都可以考慮用Nginx;構(gòu)建大型網(wǎng)站或者提供重要服務且機器較多時,可多加考慮利用LVS。
一、部署keepalived及nginx
兩臺同操作
[root@localhost ~]# yum -y install nginx keepalived nginx-all-modules
二、配置nginx
1.修改ngx主配置文件
兩臺同操作
[root@localhost ~]# vim /etc/nginx/nginx.conf #這里將默認的server塊配置的端口監(jiān)聽改為除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; # 監(jiān)聽的端口 server_name *.study.com; # 監(jiān)聽的地址,多個域名用空格隔開 location / { # 默認請求 ,后面 "/" 表示開啟反向代理,也可以是正則表達式 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 { # 設定虛擬主機配置 #listen 80; # 監(jiān)聽的端口 listen 443 ssl; server_name *.study.com; # 監(jiān)聽的地址,多個域名用空格隔開 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 #修改為實際網(wǎng)卡名 virtual_router_id 51 #每個虛擬路由器惟一標識,范圍:0-255,同一組虛擬路由器的vrid必須一致 priority 100 #優(yōu)先級,備服務設置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運行狀態(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
四、驗證
驗證步驟跟第一種方式類似,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所在節(jié)點IP地址 和 關閉ingress controller的pod所在節(jié)點的arp查詢功能并設置回環(huán)IP即可
一、部署ipvsadm和keepalived
lvs01和lvs02節(jié)點都部署
[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表示是主節(jié)點,備份節(jié)點是BACKUP state MASTER # 工作接口用于選舉,這里寫網(wǎng)卡名稱,這個不同的服務器,可能有所不同 interface ens33 # vrrp虛擬路由標識,如果是一組虛擬路由內(nèi)的MASTER和BACKUP節(jié)點的該值要保持一致,如果是多組就定義多個,范圍0-255 virtual_router_id 51 # 優(yōu)先級,MASTER節(jié)點的值必須大于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路由 也可以說是防火墻規(guī)則,當有請求來請求虛擬地址時轉(zhuǎn)發(fā)至下面配置的真實服務器 virtual_server 192.168.1.188 80 { # 健康檢查的時間,單位為秒 delay_loop 6 # 負載調(diào)度算法,這里設置為rr,即輪詢算法 lb_algo rr # 設置DR模式,返回請求時,不走LVS,直接返回到客戶端。 lb_kind DR # 虛擬地址的子網(wǎng)掩碼 nat_mask 255.255.255.0 # 會話保持時間(對動態(tài)網(wǎng)頁非常有用),單位為秒 persistence_timeout 50 #指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種 protocol TCP # 配置后端真實服務器信息(這里指ngx) # 當然如果只是lvs+keepalived+ingress高可用的話,在這里就可以直接寫ingress的信息 real_server 192.168.1.2 80 { # 節(jié)點的權(quán)重,數(shù)字越大權(quán)重越高,被轉(zhuǎn)發(fā)至此服務器的請求也就相應的多 weight 1 #realserver的狀態(tài)監(jiān)測設置 單位秒 TCP_CHECK { # 連接超時時間 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 { # 這里將郵件設置的相關信息都注釋掉了 # router_id是keepalived的一個標識,最好不同的keepalived配置成不一樣 router_id LVS_DEVEL_BACKUP } vrrp_instance VI_1 { # MASTER表示是主節(jié)點,備份節(jié)點是BACKUP state BACKUP # 工作接口用于選舉,這里寫網(wǎng)卡名稱,這個不同的服務器,可能有所不同 interface ens33 # vrrp虛擬路由標識,如果是一組虛擬路由內(nèi)的MASTER和BACKUP節(jié)點的該值要保持一致,如果是多組就定義多個,范圍0-255 virtual_router_id 51 # 優(yōu)先級,MASTER節(jié)點的值必須大于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路由 也可以說是防火墻規(guī)則,當有請求來請求虛擬地址時轉(zhuǎn)發(fā)至下面配置的真實服務器 virtual_server 192.168.1.188 80 { # 健康檢查的時間,單位為秒 delay_loop 6 # 負載調(diào)度算法,這里設置為rr,即輪詢算法 lb_algo rr # 設置DR模式,返回請求時,不走LVS,直接返回到客戶端。 lb_kind DR # 虛擬地址的子網(wǎng)掩碼 nat_mask 255.255.255.0 # 會話保持時間(對動態(tài)網(wǎng)頁非常有用),單位為秒 persistence_timeout 50 #指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種 protocol TCP # 配置后端真實服務器信息(這里指ngx) # 當然如果只是lvs+keepalived+ingress高可用的話,在這里就可以直接寫ingress的信息 real_server 192.168.1.2 80 { # 節(jié)點的權(quán)重,數(shù)字越大權(quán)重越高,被轉(zhuǎn)發(fā)至此服務器的請求也就相應的多 weight 1 #realserver的狀態(tài)監(jiān)測設置 單位秒 TCP_CHECK { # 連接超時時間 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 } } }
三、關閉ingress所在節(jié)點的arp查詢功能并設置回環(huán)IP
ingress pod所在節(jié)點都要執(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
四、驗證
這個方式驗證方法跟方式一相同,不管是其中哪一個ingress pod 掛掉都不影響正常使用,其中l(wèi)vs掛掉之后虛擬IP都會進行漂移至另一臺lvs上不影響業(yè)務使用;可自行驗證
總結(jié)
本文所有高可用的方式都是將域名解析至keepalived的VIP
遇到的問題如下:
當使用ingress配置了https時,再使用nginx反向代理ingress的443端口的話,此時訪問域名會發(fā)現(xiàn)訪問地址被強制轉(zhuǎn)了https,此時在ingress處并沒有添加強制轉(zhuǎn)https的配置,甚至還想能通過http訪問
;
這樣的話需要在ingress配置 將強制https關閉
;
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false"
到此這篇關于Nginx ingress controller高可用的實現(xiàn)的文章就介紹到這了,更多相關Nginx ingress controller高可用 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Nginx實現(xiàn)UDP四層轉(zhuǎn)發(fā)的過程
為了解決VPN連接速度慢的問題,可以通過Nginx實現(xiàn)UDP的四層轉(zhuǎn)發(fā),首先檢查Nginx是否安裝了with-stream模塊,然后修改nginx.conf配置文件進行UDP端口的轉(zhuǎn)發(fā)設置,使用nginx-t檢查配置文件語法,無誤后重新加載Nginx,這樣通過國內(nèi)服務器中轉(zhuǎn),可以提升連接到國外服務器的速率2024-09-09Nginx通過nginx-rtmp-module模塊搭建流媒體服務器實現(xiàn)直播
近日有客戶咨詢想用Nginx搭建流媒體服務器實現(xiàn)直播,方便他們打造自己的平臺,經(jīng)過各種測試發(fā)現(xiàn)如下文章不錯,特分享給需要的朋友2023-10-10Nginx出現(xiàn)The plain HTTP request was sent to HTTPS port問題解決方法
這篇文章主要介紹了Nginx出現(xiàn)The plain HTTP request was sent to HTTPS port問題解決方法,需要的朋友可以參考下2015-04-04