K8S集群Master高可用實踐

本文將在前文基礎上介紹k8s集群的高可用實踐,一般來講,k8s集群高可用主要包含以下幾個內容:
1、etcd集群高可用
2、集群dns服務高可用
3、kube-apiserver、kube-controller-manager、kube-scheduler等master組件的高可用

其中etcd實現的辦法較為容易,具體實現辦法可參考前文:
http://blog.51cto.com/ylw6006/2095871

集群dns服務高可用,可以通過配置dns的pod副本數為2,通過配置label實現2個副本運行在在不同的節點上實現高可用。

kube-apiserver服務的高可用,可行的方案較多,具體介紹可參考文檔:
https://jishu.io/kubernetes/kubernetes-master-ha/

kube-controller-manager、kube-scheduler等master組件的高可用相對容易實現,運行多份實例即可。

一、環境介紹

master節點1: 192.168.115.5/24 主機名:vm1
master節點2: 192.168.115.6/24 主機名:vm2
VIP地址: 192.168.115.4/24 (使用keepalived實現)
Node節點1: 192.168.115.6/24 主機名:vm2
Node節點2: 192.168.115.7/24 主機名:vm3

操作系統版本:centos 7.2 64bit
K8s版本:1.9.6 二進制部署

本文演示環境是在前文的基礎上,已有k8s集群(1個master節點、2個node節點上),實現k8s集群master組件的高可用,關于k8s環境的部署請參考前文鏈接!
1、配置Etcd集群和TLS認證 ——>?http://blog.51cto.com/ylw6006/2095871
2、Flannel網絡組件部署 ——>?http://blog.51cto.com/ylw6006/2097303
3、升級Docker服務 ——>?http://blog.51cto.com/ylw6006/2103064
4、K8S二進制部署Master節點 ——>?http://blog.51cto.com/ylw6006/2104031
5、K8S二進制部署Node節點 ——>?http://blog.51cto.com/ylw6006/2104692

二、證書更新

在vm1節點上完成證書的更新,重點是要把master相關ip全部全部加入到列表里面

# mkdir api-ha && cd api-ha
# cat k8s-csr.json    
{"CN": "kubernetes","hosts": ["127.0.0.1","192.168.115.4","192.168.115.5","192.168.115.6","10.254.0.1","kubernetes","kubernetes.default","kubernetes.default.svc","kubernetes.default.svc.cluster","kubernetes.default.svc.cluster.local"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "FuZhou","L": "FuZhou","O": "k8s","OU": "System"}]
}# cfssl gencert -ca=/etc/ssl/etcd/ca.pem \-ca-key=/etc/ssl/etcd/ca-key.pem \-config=/etc/ssl/etcd/ca-config.json \-profile=kubernetes k8s-csr.json | cfssljson -bare kubernetes# mv *.pem /etc/kubernetes/ssl/

三、配置master組件

1、復制vm1的kube-apiserver、kube-controller-manager、kube-scheduler文件到vm2節點上

# cd /usr/local/sbin
# scp -rp  kube-apiserver  kube-controller-manager  kube-scheduler  vm2:/usr/local/sbin/

2、復制vm1的證書文件到vm2節點上

# cd /etc/kubernetes/ssl
# scp -rp ./* vm2:/etc/kubernetes/ssl

3、配置服務并啟動服務

# cat /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target[Service]
ExecStart=/usr/local/sbin/kube-apiserver \--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \--advertise-address=0.0.0.0 \--bind-address=0.0.0.0 \--insecure-bind-address=127.0.0.1 \--authorization-mode=RBAC \--runtime-config=rbac.authorization.k8s.io/v1alpha1 \--kubelet-https=true \--enable-bootstrap-token-auth=true \--token-auth-file=/etc/kubernetes/token.csv \--service-cluster-ip-range=10.254.0.0/16 \--service-node-port-range=1024-65535 \--tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \--tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \--client-ca-file=/etc/ssl/etcd/ca.pem \--service-account-key-file=/etc/ssl/etcd/ca-key.pem \--etcd-cafile=/etc/ssl/etcd/ca.pem \--etcd-certfile=/etc/ssl/etcd/server.pem \--etcd-keyfile=/etc/ssl/etcd/server-key.pem \--etcd-servers=https://192.168.115.5:2379,https://192.168.115.6:2379,https://192.168.115.7:2379 \--enable-swagger-ui=true \--allow-privileged=true \--apiserver-count=3 \--audit-log-maxage=30 \--audit-log-maxbackup=3 \--audit-log-maxsize=100 \--audit-log-path=/var/lib/audit.log \--event-ttl=1h \--v=2
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536[Install]
WantedBy=multi-user.target
# cat /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes[Service]
ExecStart=/usr/local/sbin/kube-scheduler \--address=127.0.0.1 \--master=http://127.0.0.1:8080 \--leader-elect=true \--v=2
Restart=on-failure
RestartSec=5[Install]
WantedBy=multi-user.target
# cat /usr/lib/systemd/system/kube-controller-manager.service 
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes[Service]
ExecStart=/usr/local/sbin/kube-controller-manager \--address=127.0.0.1 \--master=http://127.0.0.1:8080 \--allocate-node-cidrs=true \--service-cluster-ip-range=10.254.0.0/16 \--cluster-cidr=172.30.0.0/16 \--cluster-name=kubernetes \--cluster-signing-cert-file=/etc/ssl/etcd/ca.pem \--cluster-signing-key-file=/etc/ssl/etcd/ca-key.pem \--service-account-private-key-file=/etc/ssl/etcd/ca-key.pem \--root-ca-file=/etc/ssl/etcd/ca.pem \--leader-elect=true \--v=2
Restart=on-failure
RestartSec=5[Install]
WantedBy=multi-user.target
# systemctl enable kube-apiserver
# systemctl enable kube-controller-manager
# systemctl enable kube-scheduler
# systemctl start kube-apiserver
# systemctl start kube-controller-manager
# systemctl start kube-scheduler

注意:

vm1上的api-server配置文件需要將--advertise-address、--bind-address兩個參數修改為全網監聽

四、安裝和配置keepalived

# yum -y install keepalived
# cat /etc/keepalived/keepalived.conf   
! Configuration File for keepalived  
global_defs {  notification_email {   ylw@fjhb.cn}   notification_email_from admin@fjhb.cnsmtp_server 127.0.0.1  smtp_connect_timeout 30  router_id LVS_MASTER  
}  vrrp_script check_apiserver {script "/etc/keepalived/check_apiserver.sh"interval 3
}  vrrp_instance VI_1 {  state MASTERinterface ens33virtual_router_id 60  priority 100  advert_int 1  authentication {  auth_type PASS  auth_pass k8s.59iedu.com}  virtual_ipaddress {  192.168.115.4/24}track_script {   check_apiserver}
}
# cat /usr/lib/systemd/system/keepalived.service  
[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target kube-apiserver.service
Require=kube-apiserver.service[Service]
Type=forking
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID[Install]
WantedBy=multi-user.target

注意:

vm2節點上需要修改state為BACKUP, priority為99 (priority值必須小于master節點配置值)

# cat /etc/keepalived/check_apiserver.sh
#!/bin/bash
flag=$(systemctl status kube-apiserver &> /dev/null;echo $?)
if [[ $flag != 0 ]];thenecho "kube-apiserver is down,close the keepalived"systemctl stop keepalived
fi
# chmod +x /etc/keepalived/check_apiserver.sh 
# systemctl daemon-reload
# systemctl enable keepalived
# systemctl start keepalived

五、修改客戶端配置

1、Kubelet.kubeconfig 、bootstrap.kubeconfig、kube-proxy.kubeconfig 配置

# grep 'server' /etc/kubernetes/kubelet.kubeconfig 
server: https://192.168.115.4:6443
# grep 'server' /etc/kubernetes/bootstrap.kubeconfig 
server: https://192.168.115.4:6443
# grep 'server' /etc/kubernetes/kube-proxy.kubeconfig server: https://192.168.115.4:6443

2、confing配置

# grep 'server' /root/.kube/config 
server: https://192.168.115.4:6443

3、重啟客戶端服務

# systemctl restart kubelet 
# systemctl restart kube-proxy

六、測試

1、關閉服務前的集群狀態,VIP在vm1節點上
K8S集群Master高可用實踐

K8S集群Master高可用實踐

2、在vm1上將kube-apiserver服務停止,可以看到VIP消息,但任何可以連接master獲取pod信息
K8S集群Master高可用實踐
日志顯示vip被自動移除
K8S集群Master高可用實踐
3、在vm2上能看到自動注冊上了VIP,且kubectl客戶端連接正常
K8S集群Master高可用實踐
K8S集群Master高可用實踐
4、在vm1上將kube-apiserver、keepalived服務啟動,由于配置的是主從模式,所以會搶占VIP
K8S集群Master高可用實踐
5、在vm2上可以看到VIP的釋放,keepalived重新進入backup狀態
K8S集群Master高可用實踐
6、在整個過程中可以用其他的客戶端來連接master VIP來測試服務器的連續性
K8S集群Master高可用實踐

七、使用haproxy改進

只用keepalived實現master ha,當api-server的訪問量大的時候,會有性能瓶頸問題,通過配置haproxy,可以同時實現master的ha和流量的負載均衡。
1、安裝和配置haproxy,兩臺master做同樣的配置

# yum -y install haproxy
# cat /etc/haproxy/haproxy.cfg
globallog         127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxydaemonstats socket /var/lib/haproxy/statsdefaultsmode                    tcplog                     globaloption                  tcplogoption                  dontlognulloption                  redispatchretries                 3timeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout check           10smaxconn                 3000listen statsmode   httpbind :10086stats   enablestats   uri     /admin?statsstats   auth    admin:adminstats   admin   if TRUEfrontend  k8s_https *:8443mode      tcpmaxconn      2000default_backend     https_sribackend https_sribalance      roundrobinserver s1 192.168.115.5:6443  check inter 10000 fall 2 rise 2 weight 1server s2 192.168.115.6:6443  check inter 10000 fall 2 rise 2 weight 1

2、修改kube-apiserver配置,ip地址根據實際情況修改

# grep 'address' /usr/lib/systemd/system/kube-apiserver.service     --advertise-address=192.168.115.5 \--bind-address=192.168.115.5 \--insecure-bind-address=127.0.0.1 \

3、修改keepalived啟動腳本和配置文件,vrrp腳本的ip地址根據實際情況修改

# cat /usr/lib/systemd/system/keepalived.service            
[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target 
Require=haproxy.service
########以下輸出省略#########
# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived  
global_defs {  notification_email {   ylw@fjhb.cn}   notification_email_from admin@fjhb.cn  smtp_server 127.0.0.1  smtp_connect_timeout 30  router_id LVS_MASTER  
}  vrrp_script check_apiserver {script "curl -o /dev/null -s -w %{http_code} -k  https://192.168.115.5:6443"interval 3timeout 3fall 2rise 2
}  
########以下輸出省略#########

4、修改kubelet和kubectl客戶端配置文件,指向haproxy的端口8443

# grep '192' /etc/kubernetes/bootstrap.kubeconfig server: https://192.168.115.4:8443
# grep '192' /etc/kubernetes/kubelet.kubeconfig server: https://192.168.115.4:8443
# grep '192' /etc/kubernetes/kube-proxy.kubeconfig 
server: https://192.168.115.4:8443
# grep '192' /root/.kube/config 
server: https://192.168.115.4:8443

5、重啟服務驗證
master

# systemctl daemon-reload
# systemctl enable haproxy 
# systemctl start haproxy 
# systemctl restart keepalived 
# systemctl restart kube-apiserver 

kubelet

# systemctl restart kubelet
# systemctl restart kube-proxy

K8S集群Master高可用實踐
K8S集群Master高可用實踐

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282310.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282310.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282310.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉載]智能科普:VR、AR、MR的區別

智能科普:VR、AR、MR的區別 http://news.zol.com.cn/553/5534833.html news.zol.com.cn 2015-11-23 16:00近日, 獲得谷歌5億美元融資的技術公司Magic Leap在WSJD展會中放出了一段實錄視頻,引起不小騷動。如今,也有媒體稱他們為MR公…

PHP項目中,記錄錯誤日志

一、場景介紹: 環境:LNMP 我們通常是通過nginx的錯誤日志來分析分錯的,也就是我們在各個server中定義的error_log。 比如下面這樣,就是將錯誤日志定義在/etc/nginx/logs/error/www.xiaobudiu.top.log,發生錯誤&#xf…

持續集成指南:GitLab 的 CI/CD 工具配置與使用

1前言寫代碼這項工作,本質就是將工作自動化,減少手工操作提供效率,因為人的本質都是懶狗,程序員也不能例外,為了各種意義的效率提升(懶),我們需要持續集成工具,將代碼測試…

php 錯誤日志 redis' already loaded in Unknown on line 0

環境介紹:LNMP 報錯信息:注:這個php_errors.log 是我在php.ini 中定義的錯誤日志路徑 問題原因: 報錯信息給出的意思是:redis和memcache 模塊已經加載過問題解決: php加載模塊有兩種方式,一種是…

第一周作業

我的Git賬號:AI1452349541 和代碼圖 這是我在電腦和手機上下的網易有道詞典 , C也下了。 ***學習內容總結*** 感覺任務并不是很難,有些任務沒完成是 因為還沒買電腦不好弄,下周電腦一定到位。 ***遇到的問題…

升級MariaDB為10.1版本

2019獨角獸企業重金招聘Python工程師標準>>> CentOS中升級mariadb為10.1GA版本。 1、如果有,停止服務 systemctl stop mariadb 2、卸載原來的數據庫服務 yum -y remove mari* 3、刪除數據庫文件 rm -rf /var/lib/mysql/* 4.創建/etc/yum.repos.d/MariaDB…

第一篇文章

第一次寫博客。歡迎各位大牛捧場轉載于:https://www.cnblogs.com/clnchanpin/p/6753665.html

羊了個羊的Ignite大會又來啦

據說最近羊了個羊非常火啊~可惜沒有時間精力研究。不過,薅微軟羊毛的機會我是一定不會錯過的,這不,薅羊毛的機會來了,哈哈哈。作為經常薅微軟羊毛的老司機,今天收到了微軟的郵件,告知有新的羊毛…

清除谷歌瀏覽器的dns緩存

谷歌地址欄輸入: chrome://net-internals/#dns出現下面界面:找到DNS選項,選擇clear host cache即可效果:這樣,谷歌瀏覽器上的dns緩存就清理掉了。應用場景: 本地環境和線上環境用的是一個host,這…

生產YUM源搭建

企業內部YUM源搭建轉載于:https://www.cnblogs.com/xiangtanglaojing/p/7603581.html

什么樣的代碼稱得上是好代碼?

“軟件自有其美感所在” --《重構》圖片:崇禮瀚海梁的山花 拍攝于2022年8月13日 攝影師:劉先生這篇內容寫作于4年前(2018年),是自己多年軟件開發工作的一點感悟,現在看來雖有偏頗,但總體思想方…

Coding and Paper Letter(十四)

2019獨角獸企業重金招聘Python工程師標準>>> 資源整理。 1 Coding: 1.R語言包ungeviz,ggplot2的拓展包,專門用來作不確定性的可視化。 ungeviz 2.計算機圖形學相關開源項目。 計算機圖形學光線追蹤開源項目C源碼。 computer graphics ray tra…

QBC運算符含義

HQL運算符 QBC運算符 含義 Restrictions.eq() 等于 <> Restrictions.not(Exprission.eq()) 不等于 > Restrictions.gt() …

eclipse安裝反編譯插件

一、下載插件 1、官方地址&#xff1a;http://jd.benow.ca/ 2、百度網盤&#xff1a;http://pan.baidu.com/s/1eSJ7Tiq 密碼&#xff1a;sr6p 二、打開eclipse&#xff0c;點擊“Help > Install New Software” 三、Name填&#xff1a;JD-Eclipse Update Site&#xff08;可…

PHP 項目中緩存的多種應用實現

一、CDN緩存原理和介紹 1、各地部署多套靜態存儲服務&#xff0c;本質上是空間成本換時間 2、CDN是域名和真實服務器中間的一個環節&#xff0c;添加cdn節點后&#xff0c;用戶訪問時&#xff0c;自動選擇最近的節點內容&#xff0c;不存在再請求原始服務器 3、CDN本質上是一種…

【tomcat】servlet原理及其生命周期

1.什么是servlet&#xff1f; Servlet&#xff08;Servlet Applet&#xff09;&#xff0c;全稱Java Servlet,是用Java編寫的服務器端程序。而這些Servlet都要實現Servlet這個接口。其主要功能在于交互式的瀏覽和修改數據&#xff0c;生成動態Web內容。Servlet運行于支持Java的…

實現一個監控 IP 的 windows 服務

實現一個監控 IP 的 windows 服務Intro我們公司的 VPN 用自己的電腦連公司的臺式機的時候需要用 IP 地址&#xff0c;有一次嘗試去連的時候發現連不上&#xff0c;第二天到公司發現 IP 變掉了&#xff0c;不是之前連的 IP 了&#xff0c;于是就想寫一個簡單 Windows 服務來監控…

微信企業號開發:啟用回調模式

微信企業號開發怎樣啟用回調模式&#xff1f;就是簡單的登陸PC版微信&#xff0c;點擊應用中心&#xff0c;選擇須要應用&#xff0c;再點擊回調模式啟用&#xff1f;似乎不是這么簡單。&#xff01;能夠看到核心的僅僅有三個URL。Token&#xff0c;EncodingAESKey這三個參數能…

MVC中提交表單的4種方式

一&#xff0c;MVC HtmlHelper方法 Html.BeginForm(actionName,controllerName,method,htmlAttributes){} BeginRouteForm 方法 (HtmlHelper, String, Object, FormMethod) 二&#xff0c;傳統Form表單Aciton屬性提交 三&#xff0c;JqueryAjax 提交表單 四&#xff0c;MVC C…

photoshop制作網站圓形圖標ico

1、選擇左側工具欄中的橢圓工具2、鼠標直接在圖片上選擇區域3、在圖片上鼠標右鍵建立選區&#xff0c;在彈出的對話框直接點確定變成這樣&#xff1a;4、點擊選擇&#xff0c;然后點擊反選變成這樣5、圖層欄&#xff0c;在圖片上右鍵復制圖層&#xff0c;彈出對話框直接確定即可…