私有云中Kubernetes Cluster HA方案
摘要:發現很多Kubernetes剛入門的同學對Kubernetes的Master高可用方案很感興趣,官方又只給出了GCE上部署高可用的方案,因此我覺得有必要把我之前做的Kubernetes Master HA方案分享一下。
Kubernetes Master HA架構圖
配置與說明
- 所有元件可以通過kubelet static pod的方式啟動和管理,由kubelet static pod機制保證宿主機上各個元件的高可用, 注意kubelet要新增配置
--allow-privileged=true
; - 管理static pod的kubelet的高可用通過systemd來負責;
- 當然,你也可以直接通過程序來部署這些元件,systemd來直接管理這些程序;(我們選擇的是這種方式,降低複雜度。)
- 上圖中,etcd和Master部署在一起,三個Master節點分別部署了三個etcd,這三個etcd組成一個叢集;(當然,如果條件允許,建議將etcd叢集和Master節點分開部署。)
- 每個Master中的apiserver、controller-manager、scheduler都使用hostNetwork, controller-manager和scheduler通過localhost連線到本節點的apiserver,而不會和其他兩個Master節點的apiserver連線;
- 外部的rest-client、kubectl、kubelet、kube-proxy等都通過TLS證書,在LB節點做TLS Termination,LB出來就是http請求發到經過LB策略(RR)到對應的apiserver instance;
- apiserver到kubelet server和kube-proxy server的訪問也類似,Https到LB這裡做TLS Termination,然後http請求出來到對應node的kubelet/kube-proxy server;
- apiserver的HA通過經典的haproxy + keepalived來保證,叢集對外暴露VIP;
- controller-manager和scheduler的HA通過自身提供的leader選舉功能(–leader-elect=true),使得3個controller-manager和scheduler都分別只有一個是leader,leader處於正常工作狀態,當leader失敗,會重新選舉新leader來頂替繼續工作;
- 因此,該HA方案中,通過haproxy+keepalived來做apiserver的LB和HA,controller-manager和scheduler通過自身的leader選舉來達到HA,etcd通過raft協議保證etcd cluster資料的一致性,達到HA;
keepalived的配置可參考如下:
vrrp_script check_script { script "/etc/keepalived/check_haproxy.py http://caicloud:[email protected]/haproxy?stats" interval 5 # check every 5 seconds weight 5 fall 2 # require 2 fail for KO rise 1 # require 1 successes for OK } vrrp_instance VI_01 { state MASTER (BACKUP) interface eth1 track_interface { eth1 } vrrp_garp_master_repeat 5 vrrp_garp_master_refresh 10 virtual_router_id 51 priority 100 (97) advert_int 1 authentication { auth_type PASS auth_pass username } virtual_ipaddress { 192.168.205.254 dev eth1 label eth1:vip } track_script { check_script } notify "etc/keepalived/notify_state.sh" }
haproxy的配置可參考如下:
global log 127.0.0.1 local0 maxconn 32768 pidfile /run/haproxy.pid # turn on stats unix socket stats socket /run/haproxy.stats tune.ssl.default-dh-param 2048 default log global mode http option httplog option dontlognull retries 3 timeout connect 5000ms timeout client 50000ms timeout server 50000ms timeout check 50000ms timeout queue 50000ms frontend frontend-apisver-http bind *:8080 option forwardfor acl local_net src 192.168.205.0/24 http-request allow if local_net http-request deny default_backend backend-apiserver-http frontedn frontend-apiserver-https # haproxy enable ssl bind *:443 ssl crt /etc/kubernetes/master-lb.pem option forwardfor default_backend backend-apiserver-http backend backend-apiserver-http balance roundrobin option forward-for server master-1 192.168.205.11:8080 check server master-2 192.168.205.12:8080 check server master-3 192.168.205.13:8080 check listen admin_stats bind 0.0.0.0:80 log global mode http maxconn 10 stats enable #Hide HAPRoxy version, a necessity for any public-facing site stats hide-version stats refresh 30s stats show-node stats realm Haproxy\ Statistics stats auth caicloud:caicloud stats uri /haproxy?stats
LB所在的節點,注意確保ip_vs model已載入、ip_forward和ip_nonlocal_bind已開啟;
# make sure ip_vs kernel model is loaded modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr # enable ip_forward and ip_nonlocal_bind echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
如果你通過pod來部署K8S的元件,可參考官方給出的Yaml:
- apiserver
apiVersion: v1 kind: Pod metadata: name: kube-apiserver spec: hostNetwork: true containers: - name: kube-apiserver image: gcr.io/google_containers/kube-apiserver:9680e782e08a1a1c94c656190011bd02 command: - /bin/sh - -c - /usr/local/bin/kube-apiserver --address=127.0.0.1 --etcd-servers=http://127.0.0.1:4001 --cloud-provider=gce --admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota --service-cluster-ip-range=10.0.0.0/16 --client-ca-file=/srv/kubernetes/ca.crt --basic-auth-file=/srv/kubernetes/basic_auth.csv --cluster-name=e2e-test-bburns --tls-cert-file=/srv/kubernetes/server.cert --tls-private-key-file=/srv/kubernetes/server.key --secure-port=443 --token-auth-file=/srv/kubernetes/known_tokens.csv --v=2 --allow-privileged=False 1>>/var/log/kube-apiserver.log 2>&1 ports: - containerPort: 443 hostPort: 443 name: https - containerPort: 7080 hostPort: 7080 name: http - containerPort: 8080 hostPort: 8080 name: local volumeMounts: - mountPath: /srv/kubernetes name: srvkube readOnly: true - mountPath: /var/log/kube-apiserver.log name: logfile - mountPath: /etc/ssl name: etcssl readOnly: true - mountPath: /usr/share/ssl name: usrsharessl readOnly: true - mountPath: /var/ssl name: varssl readOnly: true - mountPath: /usr/ssl name: usrssl readOnly: true - mountPath: /usr/lib/ssl name: usrlibssl readOnly: true - mountPath: /usr/local/openssl name: usrlocalopenssl readOnly: true - mountPath: /etc/openssl name: etcopenssl readOnly: true - mountPath: /etc/pki/tls name: etcpkitls readOnly: true volumes: - hostPath: path: /srv/kubernetes name: srvkube - hostPath: path: /var/log/kube-apiserver.log name: logfile - hostPath: path: /etc/ssl name: etcssl - hostPath: path: /usr/share/ssl name: usrsharessl - hostPath: path: /var/ssl name: varssl - hostPath: path: /usr/ssl name: usrssl - hostPath: path: /usr/lib/ssl name: usrlibssl - hostPath: path: /usr/local/openssl name: usrlocalopenssl - hostPath: path: /etc/openssl name: etcopenssl - hostPath: path: /etc/pki/tls name: etcpkitls
- controller-manager
apiVersion: v1 kind: Pod metadata: name: kube-controller-manager spec: containers: - command: - /bin/sh - -c - /usr/local/bin/kube-controller-manager --master=127.0.0.1:8080 --cluster-name=e2e-test-bburns --cluster-cidr=10.245.0.0/16 --allocate-node-cidrs=true --cloud-provider=gce --service-account-private-key-file=/srv/kubernetes/server.key --v=2 --leader-elect=true 1>>/var/log/kube-controller-manager.log 2>&1 image: gcr.io/google_containers/kube-controller-manager:fda24638d51a48baa13c35337fcd4793 livenessProbe: httpGet: path: /healthz port: 10252 initialDelaySeconds: 15 timeoutSeconds: 1 name: kube-controller-manager volumeMounts: - mountPath: /srv/kubernetes name: srvkube readOnly: true - mountPath: /var/log/kube-controller-manager.log name: logfile - mountPath: /etc/ssl name: etcssl readOnly: true - mountPath: /usr/share/ssl name: usrsharessl readOnly: true - mountPath: /var/ssl name: varssl readOnly: true - mountPath: /usr/ssl name: usrssl readOnly: true - mountPath: /usr/lib/ssl name: usrlibssl readOnly: true - mountPath: /usr/local/openssl name: usrlocalopenssl readOnly: true - mountPath: /etc/openssl name: etcopenssl readOnly: true - mountPath: /etc/pki/tls name: etcpkitls readOnly: true hostNetwork: true volumes: - hostPath: path: /srv/kubernetes name: srvkube - hostPath: path: /var/log/kube-controller-manager.log name: logfile - hostPath: path: /etc/ssl name: etcssl - hostPath: path: /usr/share/ssl name: usrsharessl - hostPath: path: /var/ssl name: varssl - hostPath: path: /usr/ssl name: usrssl - hostPath: path: /usr/lib/ssl name: usrlibssl - hostPath: path: /usr/local/openssl name: usrlocalopenssl - hostPath: path: /etc/openssl name: etcopenssl - hostPath: path: /etc/pki/tls name: etcpkitls
- scheduler
apiVersion: v1 kind: Pod metadata: name: kube-scheduler spec: hostNetwork: true containers: - name: kube-scheduler image: gcr.io/google_containers/kube-scheduler:34d0b8f8b31e27937327961528739bc9 command: - /bin/sh - -c - /usr/local/bin/kube-scheduler --master=127.0.0.1:8080 --v=2 --leader-elect=true 1>>/var/log/kube-scheduler.log 2>&1 livenessProbe: httpGet: path: /healthz port: 10251 initialDelaySeconds: 15 timeoutSeconds: 1 volumeMounts: - mountPath: /var/log/kube-scheduler.log name: logfile - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: default-token-s8ejd readOnly: true volumes: - hostPath: path: /var/log/kube-scheduler.log name: logfile
- etcd
apiVersion: v1 kind: Pod metadata: name: etcd-server spec: hostNetwork: true containers: - image: gcr.io/google_containers/etcd:2.0.9 name: etcd-container command: - /usr/local/bin/etcd - --name - ${NODE_NAME} - --initial-advertise-peer-urls - http://${NODE_IP}:2380 - --listen-peer-urls - http://${NODE_IP}:2380 - --advertise-client-urls - http://${NODE_IP}:4001 - --listen-client-urls - http://127.0.0.1:4001 - --data-dir - /var/etcd/data - --discovery - ${DISCOVERY_TOKEN} ports: - containerPort: 2380 hostPort: 2380 name: serverport - containerPort: 4001 hostPort: 4001 name: clientport volumeMounts: - mountPath: /var/etcd name: varetcd - mountPath: /etc/ssl name: etcssl readOnly: true - mountPath: /usr/share/ssl name: usrsharessl readOnly: true - mountPath: /var/ssl name: varssl readOnly: true - mountPath: /usr/ssl name: usrssl readOnly: true - mountPath: /usr/lib/ssl name: usrlibssl readOnly: true - mountPath: /usr/local/openssl name: usrlocalopenssl readOnly: true - mountPath: /etc/openssl name: etcopenssl readOnly: true - mountPath: /etc/pki/tls name: etcpkitls readOnly: true volumes: - hostPath: path: /var/etcd/data name: varetcd - hostPath: path: /etc/ssl name: etcssl - hostPath: path: /usr/share/ssl name: usrsharessl - hostPath: path: /var/ssl name: varssl - hostPath: path: /usr/ssl name: usrssl - hostPath: path: /usr/lib/ssl name: usrlibssl - hostPath: path: /usr/local/openssl name: usrlocalopenssl - hostPath: path: /etc/openssl name: etcopenssl - hostPath: path: /etc/pki/tls name: etcpkitls
相關推薦
私有云中Kubernetes Cluster HA方案
摘要:發現很多Kubernetes剛入門的同學對Kubernetes的Master高可用方案很感興趣,官方又只給出了GCE上部署高可用的方案,因此我覺得有必要把我之前做的Kubernetes Ma
新一代免費私有云平臺Nano v0.5.1釋出 - 新增中文化支援/故障遷移/主機遷移
大家好,又一個重大更新發布了。 首先,為了便於國內使用者使用,0.5.1加入了中文支援,大部分介面和資訊已經漢化。只需要在頁面切換即可,瀏覽器會自動儲存,持續生效。 其次,增加了故障切換功能以加強叢集的高可用性。對於使用了NFS共享儲存的計算資源池,只需要在修改介面開啟新增的故障切換開關即可。當計算資
晒一晒老司機寫的“超融合私有云”解決方案
超融合私有云定義 超融合是指將所有虛擬化計算資源(記憶體、cpu、儲存、網路等)整合到一個物理設施,並且能夠方便橫向擴充套件容量。傳統的雲架構相比較,超融合私有云不需要藉助外掛儲存及光纖交換機。大大簡化了架構,並節省大筆開支,同時也降低了管理難度。 超融合私有云
【內含福利】Meetup廈門站:聚焦K8S容器混合雲、私有云領域實踐方案
在Kubernetes日益普及的今天,在公有云、私有云的多個環境中部署Kubernetes叢集已經成為常規做法。然而隨著叢集數量的增加,環境複雜多樣,如何制定高效地管理叢集方案,並讓容器輕鬆落地,成為一大難題。 為此9月8日,Cloud Native Days專注於雲原生領
AWS 吹走了私有云天空中最後一片烏雲
戳藍字“CSDN雲端計算”關注我們哦! 長久以來,私有云廠商都被一朵烏雲籠罩著:私有云是否是一個偽命題,這個世界是否終將被公有云統治?無論如何振振有詞,當 2006 年 3 月 14 日亞馬遜向全世界公開其公有云服務 AWS 時,IT 的歷史車輪就碾入了公有云紀元,傳統 IT 廠商
搜狗BizCloud:基於Kubernetes的私有云實踐_Kubernetes中文社群
【編者的話】隨著搜狗業務的快速增長,需要更有效地控制成本,提升研發效率,我們基於Docker和Kubernetes構建了一站式私有云管理平臺——BizCloud,此平臺涵蓋服務管理、彈性伸縮、灰度釋出、自動運維、持續整合等功能。本文將簡要介紹BizCloud的設計思路、架構及服務發現、授權、灰
Google Kubernetes引擎1.10版正式上線,支援虛擬私有云_Kubernetes中文社群
各大公有云廠商近日都有加強支援Kubernetes佈局的策略,微軟在Build大會就宣佈加強Kubernetes,只要點選操作就能完成叢集構建;甲骨文容器引擎也升級,Kubernetes也能靠GPU執行高速運算;Rackspace則是補齊Kubernetes託管服務這張關鍵拼圖。而近日出招的則
惠普基於Kubernetes的容器私有云平臺實踐
目錄 1、背景和挑戰 現狀和挑戰 新技術的發展 X86化——資源數量急速膨脹 2、惠普PAAS平臺解決方案 惠普PAAS平臺總體技術機構 應用的容器化改造– 微服務化 應用的容器化實踐– 整合外部服務 應用的容器化實踐– 應用和資料庫整合 應用的容器化實踐– 資料庫叢集 PAAS平臺功
私有云落地解決方案之網路篇-網路架構
作者:【吳業亮】 網路需求: 1、不同的外網企業使用者訪問虛擬機器時,相互之間不能影響,業務必須隔離。同時,每個虛擬機器業務可使用的頻寬資源也要限制在一定範圍內,避免佔用大量資源。 2、內部網路中的虛擬機器和Portal系統都配置私網地址,要求對外發布
華為雲私有云解決方案的年終答卷
2018年悄然而至,正好是華為成立30週年,通過三十年的風風雨雨,華為從一個一窮二白的民族企業成長為了令世界矚目的國際大公司,就在不久前,華為輪值CEO胡厚崑在新年獻詞中表示,2017年華為全年銷售收入預計約6000億元人民幣,同比增長約15%,這對於三十而立的
私有云落地解決方案之openstack高可用(pike版本)-cinder
作者:【吳業亮】 建立使用者 # openstack user create --domain default --project service --password Changeme_123
私有云落地解決方案之openstack高可用(pike版本)-架構
作者:【吳業亮】 本架構借鑑redhat架構 1、API 服務:包括 *-api, neutron-server,glance-registry, nova-novncproxy,keystone,httpd 等。由 HAProxy 提供負載均衡,將請求
私有云落地解決方案之openstack高可用(pike版本)-horizon
作者:【吳業亮】 安裝rpm包 # yum -y install openstack-dashboard 修改配置檔案 /etc/openstack-dashboard/local_sett
私有云落地解決方案之網路篇-關鍵技術-快速重路由FRR
作者:【吳業亮】 場景需求: 網際網路出口分別為RouterB和RouterC,交換機SwitchA採用雙GE鏈路上行至兩臺核心交換機SwitchB和SwitchC,核心交換機SwitchB和SwitchC分別採用雙GE鏈路上行至出口的Router。要求
私有云落地解決方案之openstack高可用(pike版本)-訊息佇列
作者:【吳業亮】 1、安裝軟體包 yum install erlang rabbitmq-server –y 2、啟動服務並設定開機啟動 systemctl enable rabbitm
私有云落地解決方案之網路篇-關鍵技術-vlan間通訊
一、華為三層交換機實現不同網段和不同vlan間互通 目標實現:pc1和pc2之間互通 1、拓撲圖 2、三層交換機配置: <S1>display current-configu
企業私有云技術設計方案
1 概述 1.1 文件內容 本文件為某企業私有云技術路線設計文件。1.2 背景描述 1.2.1 某企業私有云業務線規劃 近些年由於國內IDC市場發展迅速,某企業從戰略層面考慮,建造了自己的高等級資料中心,企業的決策者從未來發展的角度考慮,單純做資料中心場地銷售在現
私有云落地解決方案之openstack高可用(pike版本)-叢集引數
作者:【吳業亮】 一、新增服務 將訊息佇列加入叢集監控中 crm configure primitive rabbitmq-server systemd:rabbitmq-server \ params environment_file="/etc
SAP公有云和私有云解決方案概述
SAP公有云解決方案見下圖最右側,比較著名的有SAP SuccessFactors和SAP Cloud for Customer(C4C)等,作為SAP軟體即服務(SaaS)的解決方案。 而最左側的SAP HANA Enterprise Cloud,是SA
將OpenStack私有云部署到Hadoop MapReduce環境中
隨著企業開始同時利用雲端計算和大資料技術,現在應當考慮如何將這些工具結合使用。在這種情況下,企業將實現最佳的分析處理能力,同時利用私有云的快速彈性 (rapid elasticity) 和單一租賃的特性。本文將幫助您瞭解雲端計算和大資料技術的組成部分,瞭解