使用Kubernetes管理Kubernetes集群

新一代的Kubernetes多集群生命周期管理机制

Kubernetes 1.0版本发布已经过去了4年,繁荣的社区和广泛用户群体使得Kubernetes的成熟度超出了预期,大部分用户常用的功能性需求都得到了满足。但是,根据CNCF的调查,很多非功能性的需求尚待完善,比如,用户所面临的最困难的挑战之一仍然是管理多个Kubernetes集群的生命周期,包括集群部署、升级和变更等。Kubernetes社区未来的一个阶段的重点就是帮助用户更好的部署和维护Kubernetes,使其无缝的融入和对接现有的企业环境。


企业环境运行Kubernetes的挑战

为什么集群的生命周期管理变得越来越重要?

Kubernetes现在已经可以支持超大规模的集群,单集群可以支撑5000个节点,15万个POD。但是由于大规模集群的维护和调度过于复杂,比如,有些企业应用需要分级,不同级别的应用需要使用不同的资源池,有些业务应用需要带有GPU支持的集群,有些应用需要Windows container的支持,甚至不同应用依赖不同版本的Kubernetes,所以在企业环境中通过多集群的方式实现多租户和资源调度已经成为了最佳实践。

企业环境对于多集群的需求

当你需要管理多个集群,每个集群都有不同的规模、版本、升级计划、硬件资源池,自动化的管理工具和理念就必不可少了。

我们知道,Kubernetes的很多原则和理念改变了传统资源管理和交付的模式,其中声明式API和自愈机制的引入提升了用户部署和管理应用的效率。它允许用户通过yaml文件描述对象部署的期望状态(比如部署3个POD实例),并持续观测当前状态,如果和预期不一致(只剩2个POD实例),就通过控制器使其达到期望状态(添加1个POD实例,使总数为预期的3个)。
既然这种模式如此的成功,能不能把它适用到更多的场景中呢?比如,能不能用Kubernetes的思想来管理Kubernetes的集群呢?
实际上社区中已经有人这么做了,Cluster API 就是在这个背景下,由google,vmware等公司共同发起的项目。https://github.com/kubernetes-sigs/cluster-api

什么是Cluster API?

Cluster API是一个Kubernetes项目,它将声明式的、Kubernetes风格的API用于集群创建、配置和管理。通过利用Kubernetes API的结构化和可扩展的特性,构建更高级别的云环境无关的工具,声明式的、自动化的改善用户体验。

当前,Cluster API已经可以支持AWS, Azure, GCP, Openstack, VMware, Bare metal等绝大多数基础设施环境。在目前的版本中,该API包含五个customresourcedefinition(CRD):Cluster、Machine、MachineSet、MachineDeployment和MachineClass。

将这几个CRD和大家熟悉的Kubernetes的对象类比一下,


Cluster API对象和Kubernetes对象的类比

说明:以下的几个CRD yaml文件都可以自动生成模板,在创建cluster的时候,并不都是必须的。

Cluster这个CRD是全新的Kubernetes集群的抽象。它可以定义Kubernetes集群配置,例如POD网络CIDR和service网络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,它负责描述单个Kubernetes节点(虚拟机)。只需很少的配置(主要是Kubernetes版本信息),其他配置通过嵌入云环境相关的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。它允许对节点配置进行更新,定义工作节点的升级方式(rolling,recreate),它还允许回滚到以前的某个版本的配置。用户可以修改yaml文件来动态调整集群节点的数量。

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的扩缩容。与ReplicaSet类似,实践中尽量使用MachineDeloyment来管理一组资源的部署而不应该直接操作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的规格。所有节点都会从指定规格的虚拟机模板中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集群的规格。通过熟悉的kubectl apply命令把yaml传递给management cluster,managerment cluster会根据需要驱动不同的云平台创建虚拟机安装部署Kubernetes binary,并交付集群给用户。
那么management cluster是怎么来的?是否后续的运维工作也需要依赖它呢?实际上,初始的management cluster一般是一个单机版的Kubernetes,比如minikube或者Kind。当置备出第一个workload cluster以后,可以将management cluster的功能转移到任何一个workload cluster,这样后续的工作就不在依赖单机版的Kubernetes。一个有意思的地方是,你会发现,某一个workload cluster同时也是management cluster,在管理和监控着它自己。

下面是一个在vsphere环境使用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

根据需求调整yaml文件中的内容,比如虚拟机模板的名称、集群节点的数量等。
然后依次创建这些资源对象,

$ 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集群的虚拟机陆续被创建出来。


Cluster API 驱动vsphere创建虚拟机

大约几分钟后,workload cluster就可以交付给用户使用了。


集群节点创建完毕
Kubernetes集群可以交付给用户

我们可以关闭或者删除一个workload cluster的节点的虚拟机来模拟故障场景。Cluster API会自动检测所有节点的状态,并且驱动vsphere重新生成一个虚拟机进行替代,使得Kubernetes集群的状态与预期描述的一致。像不像Kubernetes管理POD的功能?


节点自愈

以上实验的具体的细节可参考官方文档,https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/blob/master/docs/getting_started.md

解决多集群生命周期的管理只是企业环境使用Kubernetes的第一步,后续还有什么问题是需要考虑的?

  1. 权限和资源管理。如何将企业内部不同业务部门和基础设施的资源池匹配起来,并配置合理的权限。


    企业环境中用户和资源权限管理
  2. 日常运维相关。集群的备份恢复、合规状态检查、策略变更和监控等功能。


    Kubernetes运维需求
想了解更多企业环境使用Kubernetes的挑战和应对,敬请留意8月26日VMworld大会中VMware在企业Kubernetes管理领域的新产品和服务。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容

  • 内容来源:本文由IT大咖说(WeChat_ID:itdakashuo)转自数人云(ID:dmesos),好文请多支...
    IT大咖说阅读 1,843评论 0 16
  • 2017年的云计算市场,有一个领域获得了空前的关注 -- Kubernetes。 Kubernetes可以追溯到2...
    优云数智阅读 1,067评论 0 0
  • 我的东莞妹妹你只有在春节的时候归来在变色的故乡寻求年味所有的青春你卖给了世界工厂包括初恋、泪水和自豪飘零的岁月就像...
    阿亮的月亮阅读 1,321评论 38 52
  • 据传古有惩治大奸大恶之职,名曰人皮匠。人皮匠听命皇室,善剥人皮,以完整透薄为上,悬于城门闹市,威吓众人。闻有刘氏一...
    舒念小姐阅读 1,908评论 6 6
  • 亲爱的儿子昨晚11点多了你还没睡,因为知道妈妈今天要回老家心里不舒服,昨晚问我可不可以陪你一起睡,我同...
    五度练字玲阅读 290评论 0 1