使用Kubernetes管理Kubernetes集群

新一代的Kubernetes多集群生命周期管理機(jī)制

Kubernetes 1.0版本發(fā)布已經(jīng)過去了4年,繁榮的社區(qū)和廣泛用戶群體使得Kubernetes的成熟度超出了預(yù)期油讯,大部分用戶常用的功能性需求都得到了滿足。但是忍啤,根據(jù)CNCF的調(diào)查财著,很多非功能性的需求尚待完善,比如凯肋,用戶所面臨的最困難的挑戰(zhàn)之一仍然是管理多個Kubernetes集群的生命周期,包括集群部署汽馋、升級和變更等侮东。Kubernetes社區(qū)未來的一個階段的重點就是幫助用戶更好的部署和維護(hù)Kubernetes,使其無縫的融入和對接現(xiàn)有的企業(yè)環(huán)境豹芯。


企業(yè)環(huán)境運行Kubernetes的挑戰(zhàn)

為什么集群的生命周期管理變得越來越重要悄雅?

Kubernetes現(xiàn)在已經(jīng)可以支持超大規(guī)模的集群,單集群可以支撐5000個節(jié)點铁蹈,15萬個POD宽闲。但是由于大規(guī)模集群的維護(hù)和調(diào)度過于復(fù)雜,比如握牧,有些企業(yè)應(yīng)用需要分級容诬,不同級別的應(yīng)用需要使用不同的資源池,有些業(yè)務(wù)應(yīng)用需要帶有GPU支持的集群沿腰,有些應(yīng)用需要Windows container的支持览徒,甚至不同應(yīng)用依賴不同版本的Kubernetes,所以在企業(yè)環(huán)境中通過多集群的方式實現(xiàn)多租戶和資源調(diào)度已經(jīng)成為了最佳實踐颂龙。

企業(yè)環(huán)境對于多集群的需求

當(dāng)你需要管理多個集群习蓬,每個集群都有不同的規(guī)模、版本措嵌、升級計劃躲叼、硬件資源池,自動化的管理工具和理念就必不可少了企巢。

我們知道押赊,Kubernetes的很多原則和理念改變了傳統(tǒng)資源管理和交付的模式,其中聲明式API和自愈機(jī)制的引入提升了用戶部署和管理應(yīng)用的效率包斑。它允許用戶通過yaml文件描述對象部署的期望狀態(tài)(比如部署3個POD實例)流礁,并持續(xù)觀測當(dāng)前狀態(tài),如果和預(yù)期不一致(只剩2個POD實例)罗丰,就通過控制器使其達(dá)到期望狀態(tài)(添加1個POD實例神帅,使總數(shù)為預(yù)期的3個)。
既然這種模式如此的成功萌抵,能不能把它適用到更多的場景中呢找御?比如元镀,能不能用Kubernetes的思想來管理Kubernetes的集群呢?
實際上社區(qū)中已經(jīng)有人這么做了霎桅,Cluster API 就是在這個背景下栖疑,由google,vmware等公司共同發(fā)起的項目滔驶。https://github.com/kubernetes-sigs/cluster-api

什么是Cluster API遇革?

Cluster API是一個Kubernetes項目,它將聲明式的揭糕、Kubernetes風(fēng)格的API用于集群創(chuàng)建萝快、配置和管理。通過利用Kubernetes API的結(jié)構(gòu)化和可擴(kuò)展的特性著角,構(gòu)建更高級別的云環(huán)境無關(guān)的工具揪漩,聲明式的、自動化的改善用戶體驗吏口。

當(dāng)前奄容,Cluster API已經(jīng)可以支持AWS, Azure, GCP, Openstack, VMware, Bare metal等絕大多數(shù)基礎(chǔ)設(shè)施環(huán)境。在目前的版本中产徊,該API包含五個customresourcedefinition(CRD):Cluster嫩海、Machine、MachineSet囚痴、MachineDeployment和MachineClass。

將這幾個CRD和大家熟悉的Kubernetes的對象類比一下审葬,


Cluster API對象和Kubernetes對象的類比

說明:以下的幾個CRD yaml文件都可以自動生成模板深滚,在創(chuàng)建cluster的時候,并不都是必須的涣觉。

Cluster這個CRD是全新的Kubernetes集群的抽象痴荐。它可以定義Kubernetes集群配置,例如POD網(wǎng)絡(luò)CIDR和service網(wǎng)絡(luò)CIDR官册,以及集群是運行在何種云平臺之上生兆。

kind: Cluster
metadata:
  name: workload-cluster-1
spec:
  clusterNetwork:
    services:
      cidrBlocks: ["100.64.0.0/13"]
    pods:
      cidrBlocks: ["100.96.0.0/11"]
    serviceDomain: "cluster.local"
  providerSpec:
    value:
      apiVersion: vsphere.cluster.k8s.io/v1alpha1
      kind: VsphereClusterProviderSpec
      server: "vcsa-01a.corp.local"
      username: "administrator@vsphere.local"
      sshAuthorizedKeys:
      - "ssh-rsa AAAAB3N..."

Machine類似于POD,它負(fù)責(zé)描述單個Kubernetes節(jié)點(虛擬機(jī))膝宁。只需很少的配置(主要是Kubernetes版本信息)鸦难,其他配置通過嵌入云環(huán)境相關(guān)的ProviderSpec。

apiVersion: cluster.k8s.io/v1alpha1
kind: MachineList
items:
- apiVersion: cluster.k8s.io/v1alpha1
  kind: Machine
  metadata:
    name: "workload-cluster-1-controlplane-1"
    labels:
      cluster.k8s.io/cluster-name: "workload-cluster-1"
  spec:
    providerSpec:
      value:
        apiVersion: vsphere.cluster.k8s.io/v1alpha1
        kind: VsphereMachineProviderSpec
        datacenter: "RegionA01"
        datastore: "RegionA01-ISCSI01-COMP01"
        resourcePool: "pks-comp-1"
        folder: "vm"
        network:
          devices:
          - networkName: "VM-RegionA01-vDS-COMP"
            dhcp4: true
            dhcp6: false
        numCPUs: 2
        memoryMiB: 2048
        diskGiB: 50
        template: "ubuntu-1804-kube-v1.13.6"
    versions:
      kubelet: "1.13.6"
      controlPlane: "1.13.6"

MachineDeloyment 類似于Deployment员淫。它允許對節(jié)點配置進(jìn)行更新合蔽,定義工作節(jié)點的升級方式(rolling,recreate)介返,它還允許回滾到以前的某個版本的配置拴事。用戶可以修改yaml文件來動態(tài)調(diào)整集群節(jié)點的數(shù)量沃斤。

apiVersion: "cluster.k8s.io/v1alpha1"
kind: MachineDeployment
metadata:
  name: sample-machinedeployment
spec:
  replicas: 3
  template:
    spec:
      providerSpec:
        value:
          apiVersion: vsphere.cluster.k8s.io/v1alpha1
          kind: VsphereMachineProviderSpec
          datacenter: "RegionA01"
          datastore: "RegionA01-ISCSI01-COMP01"
          resourcePool: "pks-comp-1"
          network:
            devices:
            - networkName: "VM-RegionA01-vDS-COMP"
              dhcp4: true
              dhcp6: false
          numCPUs: 2
          memoryMiB: 2048
          diskGiB: 50
          template: "ubuntu-1804-kube-v1.13.6"
      versions:
        kubelet: "1.13.6"

MachineSet類似于ReplicaSet,管理一組Machine的擴(kuò)縮容刃宵。與ReplicaSet類似衡瓶,實踐中盡量使用MachineDeloyment來管理一組資源的部署而不應(yīng)該直接操作ReplicaSet。

apiVersion: cluster.k8s.io/v1alpha1
kind: MachineSet
metadata:
  name: "workload-cluster-1-machineset-1"
spec:
  replicas: 2
  selector:
    matchLabels:
      machineset-name: "workload-cluster-1-machineset-1"
      cluster.k8s.io/cluster-name: "workload-cluster-1"
  template:
    spec:
      providerSpec:
        value:
          apiVersion: vsphere.cluster.k8s.io/v1alpha1
          kind: VsphereMachineProviderSpec
          datacenter: "RegionA01"
          datastore: "RegionA01-ISCSI01-COMP01"
          resourcePool: "pks-comp-1"
          network:
            devices:
            - networkName: "VM-RegionA01-vDS-COMP"
              dhcp4: true
              dhcp6: false
          numCPUs: 2
          memoryMiB: 2048
          diskGiB: 50
          template: "ubuntu-1804-kube-v1.13.6"
      versions:
        kubelet: "1.13.6"

MachineClass和StorageClass很像牲证,定義Machine的規(guī)格哮针。所有節(jié)點都會從指定規(guī)格的虛擬機(jī)模板中clone出來。

apiVersion: "cluster.k8s.io/v1alpha1"
kind: MachineClass
metadata:
   name: vsphere-small
providerSpec:
   apiVersion: vsphere.cluster.k8s.io/v1alpha1
   kind: VsphereMachineProviderSpec
   numCPUs: 2
   memoryMiB: 2048
   diskGiB: 50
   template: "ubuntu-1804-kube-v1.13.6"

Cluster API是如何工作的从隆?

Cluster API工作原理

Cluster API的工作原理非常簡單诚撵,用戶通過以上的幾個CRD定義需要的Kubernetes集群的規(guī)格。通過熟悉的kubectl apply命令把yaml傳遞給management cluster键闺,managerment cluster會根據(jù)需要驅(qū)動不同的云平臺創(chuàng)建虛擬機(jī)安裝部署Kubernetes binary寿烟,并交付集群給用戶。
那么management cluster是怎么來的辛燥?是否后續(xù)的運維工作也需要依賴它呢筛武?實際上,初始的management cluster一般是一個單機(jī)版的Kubernetes挎塌,比如minikube或者Kind徘六。當(dāng)置備出第一個workload cluster以后,可以將management cluster的功能轉(zhuǎn)移到任何一個workload cluster榴都,這樣后續(xù)的工作就不在依賴單機(jī)版的Kubernetes待锈。一個有意思的地方是,你會發(fā)現(xiàn)嘴高,某一個workload cluster同時也是management cluster竿音,在管理和監(jiān)控著它自己。

下面是一個在vsphere環(huán)境使用Cluster API的例子拴驮。
首先春瞬,使用Cluster API項目提供的工具生成一組部署的yaml模板。

$ docker run --rm \
  -v "$(pwd)":/out \
  -v "$(pwd)/envvars.txt":/envvars.txt:ro \
  gcr.io/cluster-api-provider-vsphere/release/manifests:latest \
  -c workload-cluster-1

根據(jù)需求調(diào)整yaml文件中的內(nèi)容套啤,比如虛擬機(jī)模板的名稱宽气、集群節(jié)點的數(shù)量等。
然后依次創(chuàng)建這些資源對象潜沦,

$ kubectl apply -f ./out/workload-cluster-1/cluster.yaml
cluster.cluster.k8s.io/workload-cluster-1 created

$ kubectl apply -f ./out/workload-cluster-1/machines.yaml
machine.cluster.k8s.io/workload-cluster-1-controlplane-1 created

$ kubectl apply -f ./out/workload-cluster-1/machineset.yaml
machineset.cluster.k8s.io/workload-cluster-1-machineset-1 created

這時可以在vcenter中看到Kubernetes集群的虛擬機(jī)陸續(xù)被創(chuàng)建出來萄涯。


Cluster API 驅(qū)動vsphere創(chuàng)建虛擬機(jī)

大約幾分鐘后,workload cluster就可以交付給用戶使用了唆鸡。


集群節(jié)點創(chuàng)建完畢
Kubernetes集群可以交付給用戶

我們可以關(guān)閉或者刪除一個workload cluster的節(jié)點的虛擬機(jī)來模擬故障場景窃判。Cluster API會自動檢測所有節(jié)點的狀態(tài),并且驅(qū)動vsphere重新生成一個虛擬機(jī)進(jìn)行替代喇闸,使得Kubernetes集群的狀態(tài)與預(yù)期描述的一致袄琳。像不像Kubernetes管理POD的功能询件?


節(jié)點自愈

以上實驗的具體的細(xì)節(jié)可參考官方文檔,https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/master/docs/getting_started.md

解決多集群生命周期的管理只是企業(yè)環(huán)境使用Kubernetes的第一步唆樊,后續(xù)還有什么問題是需要考慮的宛琅?

  1. 權(quán)限和資源管理。如何將企業(yè)內(nèi)部不同業(yè)務(wù)部門和基礎(chǔ)設(shè)施的資源池匹配起來逗旁,并配置合理的權(quán)限嘿辟。


    企業(yè)環(huán)境中用戶和資源權(quán)限管理
  2. 日常運維相關(guān)。集群的備份恢復(fù)片效、合規(guī)狀態(tài)檢查红伦、策略變更和監(jiān)控等功能。


    Kubernetes運維需求
想了解更多企業(yè)環(huán)境使用Kubernetes的挑戰(zhàn)和應(yīng)對淀衣,敬請留意8月26日VMworld大會中VMware在企業(yè)Kubernetes管理領(lǐng)域的新產(chǎn)品和服務(wù)昙读。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膨桥,隨后出現(xiàn)的幾起案子蛮浑,更是在濱河造成了極大的恐慌,老刑警劉巖只嚣,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沮稚,死亡現(xiàn)場離奇詭異,居然都是意外死亡册舞,警方通過查閱死者的電腦和手機(jī)蕴掏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來调鲸,“玉大人盛杰,你說我怎么就攤上這事∠叩茫” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵徐伐,是天一觀的道長贯钩。 經(jīng)常有香客問我,道長办素,這世上最難降的妖魔是什么角雷? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮性穿,結(jié)果婚禮上勺三,老公的妹妹穿的比我還像新娘。我一直安慰自己需曾,他們只是感情好吗坚,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布祈远。 她就那樣靜靜地躺著,像睡著了一般商源。 火紅的嫁衣襯著肌膚如雪车份。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天牡彻,我揣著相機(jī)與錄音扫沼,去河邊找鬼。 笑死庄吼,一個胖子當(dāng)著我的面吹牛缎除,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播总寻,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼器罐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了废菱?” 一聲冷哼從身側(cè)響起技矮,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎殊轴,沒想到半個月后衰倦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡旁理,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年樊零,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孽文。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡驻襟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芋哭,到底是詐尸還是另有隱情沉衣,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布减牺,位于F島的核電站豌习,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拔疚。R本人自食惡果不足惜肥隆,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稚失。 院中可真熱鬧栋艳,春花似錦、人聲如沸句各。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旬昭,卻和暖如春篙螟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背问拘。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工遍略, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骤坐。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓绪杏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纽绍。 傳聞我的和親對象是個殘疾皇子蕾久,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 內(nèi)容來源:本文由IT大咖說(WeChat_ID:itdakashuo)轉(zhuǎn)自數(shù)人云(ID:dmesos),好文請多支...
    IT大咖說閱讀 1,842評論 0 16
  • 2017年的云計算市場盹愚,有一個領(lǐng)域獲得了空前的關(guān)注 -- Kubernetes。 Kubernetes可以追溯到2...
    優(yōu)云數(shù)智閱讀 1,063評論 0 0
  • 我的東莞妹妹你只有在春節(jié)的時候歸來在變色的故鄉(xiāng)尋求年味所有的青春你賣給了世界工廠包括初戀站故、淚水和自豪飄零的歲月就像...
    阿亮的月亮閱讀 1,320評論 38 52
  • 據(jù)傳古有懲治大奸大惡之職皆怕,名曰人皮匠。人皮匠聽命皇室西篓,善剝?nèi)似び冢酝暾副樯希瑧矣诔情T鬧市岂津,威嚇眾人虱黄。聞有劉氏一...
    舒念小姐閱讀 1,903評論 6 6
  • 親愛的兒子昨晚11點多了你還沒睡,因為知道媽媽今天要回老家心里不舒服吮成,昨晚問我可不可以陪你一起睡橱乱,我同...
    五度練字玲閱讀 287評論 0 1