新一代的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)境豹芯。
為什么集群的生命周期管理變得越來越重要悄雅?
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)成為了最佳實踐颂龙。
當(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的對象類比一下审葬,
說明:以下的幾個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的工作原理非常簡單诚撵,用戶通過以上的幾個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)建出來萄涯。
大約幾分鐘后,workload cluster就可以交付給用戶使用了唆鸡。
我們可以關(guān)閉或者刪除一個workload cluster的節(jié)點的虛擬機(jī)來模擬故障場景窃判。Cluster API會自動檢測所有節(jié)點的狀態(tài),并且驅(qū)動vsphere重新生成一個虛擬機(jī)進(jìn)行替代喇闸,使得Kubernetes集群的狀態(tài)與預(yù)期描述的一致袄琳。像不像Kubernetes管理POD的功能询件?
以上實驗的具體的細(xì)節(jié)可參考官方文檔,https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/master/docs/getting_started.md
解決多集群生命周期的管理只是企業(yè)環(huán)境使用Kubernetes的第一步唆樊,后續(xù)還有什么問題是需要考慮的宛琅?
-
權(quán)限和資源管理。如何將企業(yè)內(nèi)部不同業(yè)務(wù)部門和基礎(chǔ)設(shè)施的資源池匹配起來逗旁,并配置合理的權(quán)限嘿辟。
-
日常運維相關(guān)。集群的備份恢復(fù)片效、合規(guī)狀態(tài)檢查红伦、策略變更和監(jiān)控等功能。