1. 程式人生 > >私有云中Kubernetes Cluster HA方案

私有云中Kubernetes Cluster HA方案

摘要:發現很多Kubernetes剛入門的同學對Kubernetes的Master高可用方案很感興趣,官方又只給出了GCE上部署高可用的方案,因此我覺得有必要把我之前做的Kubernetes Master HA方案分享一下。

Kubernetes Master HA架構圖

輸入圖片說明

配置與說明

  1. 所有元件可以通過kubelet static pod的方式啟動和管理,由kubelet static pod機制保證宿主機上各個元件的高可用, 注意kubelet要新增配置--allow-privileged=true;
  2. 管理static pod的kubelet的高可用通過systemd來負責;
  3. 當然,你也可以直接通過程序來部署這些元件,systemd來直接管理這些程序;(我們選擇的是這種方式,降低複雜度。)
  4. 上圖中,etcd和Master部署在一起,三個Master節點分別部署了三個etcd,這三個etcd組成一個叢集;(當然,如果條件允許,建議將etcd叢集和Master節點分開部署。)
  5. 每個Master中的apiserver、controller-manager、scheduler都使用hostNetwork, controller-manager和scheduler通過localhost連線到本節點的apiserver,而不會和其他兩個Master節點的apiserver連線;
  6. 外部的rest-client、kubectl、kubelet、kube-proxy等都通過TLS證書,在LB節點做TLS Termination,LB出來就是http請求發到經過LB策略(RR)到對應的apiserver instance;
  7. apiserver到kubelet server和kube-proxy server的訪問也類似,Https到LB這裡做TLS Termination,然後http請求出來到對應node的kubelet/kube-proxy server;
  8. apiserver的HA通過經典的haproxy + keepalived來保證,叢集對外暴露VIP;
  9. controller-manager和scheduler的HA通過自身提供的leader選舉功能(–leader-elect=true),使得3個controller-manager和scheduler都分別只有一個是leader,leader處於正常工作狀態,當leader失敗,會重新選舉新leader來頂替繼續工作;
  10. 因此,該HA方案中,通過haproxy+keepalived來做apiserver的LB和HA,controller-manager和scheduler通過自身的leader選舉來達到HA,etcd通過raft協議保證etcd cluster資料的一致性,達到HA;
  11. 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"
    }
  12. 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
  13. 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
  14. 如果你通過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) 和單一租賃的特性。本文將幫助您瞭解雲端計算和大資料技術的組成部分,瞭解