Fork me on GitHub

Kubernetes 中的核心组件与基本对象概述

k8s

Kubernetes 是 Google 基于 Borg 开源的容器编排调度,用于管理容器集群自动化部署、扩容以及运维的开源平台。作为云原生计算基金会 CNCF(Cloud Native Computing Foundation)最重要的组件之一(CNCF 另一个毕业项目 Prometheus ),它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,Kubernetes 可以帮你将系统自动地达到和维持在这个状态,Kubernetes 也可以对容器(Docker)进行集群管理和服务编排(Docker Swarm 类似的功能),对于大多开发者来说,以容器的方式运行一个程序是一个最基本的需求,跟多的是 Kubernetes 能够提供路由网关、水平扩展、监控、备份、灾难恢复等一系列运维能力(强烈建议阅读官方文档)。

使用 Kubernetes,可以快速高效地响应客户需求:

  • 动态地对应用进行扩容。
  • 无缝地发布新特性。
  • 仅使用需要的资源以优化硬件使用。

Kubernetes 这个名字源自希腊语,意思是“舵手”,也是“管理者”,“治理者”等词的源头。k8s 是 Kubernetes 的简称(用数字『8』替代中间的8个字母『ubernete』)。

为何要使用容器技术

下面是一些关键点:

  • 以应用程序为中心的管理: 将抽象级别从在虚拟硬件上运行操作系统上升到了在使用特定逻辑资源的操作系统上运行应用程序。
  • 开发和运维的关注点分离: 提供构建和部署的分离;这样也就将应用从基础设施中解耦。
  • 敏捷的应用创建和部署: 相对使用虚拟机镜像,容器镜像的创建更加轻巧高效。
  • 持续开发,持续集成以及持续部署: 提供频繁可靠地构建和部署容器镜像的能力,同时可以快速简单地回滚(因为镜像是固化的)。
  • 松耦合,分布式,弹性,自由的微服务: 应用被分割为若干独立的小型程序,可以被动态地部署和管理 -- 而不是一个运行在单机上的超级臃肿的大程序。
  • 开发,测试,生产环境保持高度一致: 无论是再笔记本电脑还是服务器上,都采用相同方式运行。
  • 兼容不同的云平台或操作系统上: 可运行与 Ubuntu,RHEL,on-prem 或者 Google Container Engine,覆盖了开发,测试和生产的各种不同环境。
  • 资源分离: 带来可预测的程序性能。
  • 资源利用: 高性能,大容量。

Kubernetes 不是 PaaS(平台即服务)

  • Kubernetes 并不对支持的应用程序类型有任何限制。 它并不指定应用框架,限制语言类型,Kubernetes 旨在支持各种多种多样的负载类型:只要一个程序能够在容器中运行,它就可以在Kubernetes中运行。
  • 由于 Kubernetes 运行再应用层而不是硬件层,所以它提供了一些一般 PaaS 提供的功能,比如部署,扩容,负载均衡,日志,监控,等等。无论如何,Kubernetes 不是一个单一应用,所以这些解决方案都是可选可插拔的。
  • Kubernetes 并不是单单的"编排系统";“编排”的技术定义为按照指定流程执行一系列动作:执行A,然后B,然后C。相反,Kubernetes 有一系列控制进程组成,持续地控制从当前状态到指定状态的流转。无需关注你是如何从A到C:只需结果如此。这样将使得系统更加易用,强大,健壮和弹性。

Kubernetes 核心组件

Kubernetes 集群可以部署在物理机或虚拟机上,用于协调高度可用的计算机集群,这些计算机群集被连接作为单个单元工作。 Kubernetes 的抽象性允许您将容器化的应用程序部署到集群,而不必专门将其绑定到单个计算机。为了利用这种新的部署模型,应用程序需要以将它们与各个主机分离的方式打包: 它们需要被容器化。容器化应用程序比过去的部署模型更灵活和可用,其中应用程序直接安装到特定机器上,作为深入集成到主机中的软件包。

Kubernetes 集群由两种类型的资源组成:

  • Master 节点是集群的调度节点 (Master 节点管理集群,而 Node 用于托管正在运行的应用程序)
  • Node 节点是应用程序实际运行的工作节点(Node节点使用 Master 公开的 Kubernetes API 与 Master 通信)

Master 负责管理集群,Node 协调集群中的所有活动,例如调度应用程序、维护应用程序的所需状态、扩展应用程序和滚动更新。每个工作节点都有一个 Kubelet,Node 节点上还应具有处理容器操作的工作,例如 Docker 或 rkt。

Master

Kubernetes 里的 Master 指的是集群控制节点,每个 Kubernetes 集群里需要有一个 Master节 点来负责整个集群的管理和控制,基本上 Kubernetes 所有的控制命令都是发给它,它来负责具体的执行过程,我们后面所有的执行命令基本都是在 Master 上运行的,它就是整个集群的“首脑”。

Master节点上运行着以下的一组进程

  • kube-apiserver 集群控制的入口,提供了 HTTP Rest 接口的关键服务进程,是 Kubernetes 里所有资源的增删改查等操作的唯一入口,也是集群控制的入口进行。

  • kube-controller-manager,Kubernetes 里所有资源对象的自动化控制中心,比如故障检测、自动扩展、滚动更新等。

  • kube-scheduler 负责 Pod 资源调度。

  • etcd 用于共享配置和服务发现,存储 Kubernetes 集群所有的网络配置和对象的状态信息

Node

除了 Master,Kubernetes 集群中的其它机器又被称为 Node 节点,是 Kubernetes 集群中的工作负载节点,每个 Node都会被 Master 分配一些工作负载(Docker 容器),当某个Node 宕机时,其上的工作负载会被 Master 自动转移到其它节点上。

每个 Node 节点上都运行着以下的一组关键进程:

  • kubelet:负责 Pod 对应的容器的创建,启动等任务,同时与Master节点密切协作。

  • kube-proxy:实现 Kubernetes Service 的通信与负载均衡机制的重要组件。

  • lube-proxyContainer Runtime(Docker, rkt, runc):负责本机的容器创建和管理工作。

基本对象与术语

Pod

Pod 是一组紧密关联的容器集合,它们共享 PID、IPC、Network 和 UTS namespace,是Kubernetes 调度的基本单位。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。

Label

Label 是识别 Kubernetes 对象的标签,以 key/value 的方式附加到对象上(key最长不能超过63字节,value 可以为空,也可以是不超过253字节的字符串)。 Label 不提供唯一性,并且实际上经常是很多对象(如 Pods)都使用相同的 label 来标志具体的应用。 Label 定义好后其他对象可以使用 Label Selector 来选择一组相同 label 的对象(比如 Service 用 label 来选择一组 Pod)。Label Selector支持以下几种方式:

  • 等式,如app=nginx和env!=production
  • 集合,如env in (production, qa)
  • 多个label(它们之间是AND关系),如app=nginx,env=test

Namespace

Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services,deployments 等都是属于某一个 namespace 的(默认是default),而 Node, PersistentVolumes 等则不属于任何 namespace。

ReplicationController

在旧版本的 Kubernetes 中,只有 ReplicationController对象。它的主要作用是确保Pod以你指定的副本数运行,即如果有容器异常退出,会自动创建新的 Pod 来替代;而异常多出来的容器也会自动回收。可以说,通过 ReplicationController,Kubernetes实现了集群的高可用性。

ReplicaSet

ReplicaSet 是 ReplicationController 的代替物,因此用法基本相同,唯一的区别在于 ReplicaSet 支持集合式的 selector。虽然也 ReplicaSet 可以独立使用,但建议使用 Deployment 来自动管理 ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持),并且 Deployment 还支持版本记录、回滚、暂停升级等高级特性。

Deployment

Deployment 确保任意时间都有指定数量的 Pod“副本”在运行。如果为某个 Pod 创建了 Deployment 并且指定3个副本,它会创建3个 Pod,并且持续监控它们。如果某个 Pod 不响应,那么 Deployment 会替换它,保持总数为3。如果之前不响应的 Pod 恢复了,现在就有4个 Pod 了,那么 Deployment 会将其中一个终止保持总数为3。如果在运行中将副本总数改为5,Deployment 会立刻启动2个新 Pod,保证总数为5。Deployment 还支持回滚和滚动升级。

当创建 Deployment 时,需要指定两个东西:

  • Pod 模板:用来创建 Pod 副本的模板
  • Label 标签:Deployment 需要监控的 Pod 的标签。

现在已经创建了 Pod 的一些副本,那么在这些副本上如何均衡负载呢?我们需要的是 Service。

StatefulSet

StatefulSet 是为了解决有状态服务的问题(对应 Deployments 和 ReplicaSets是为无状态服务而设计),其应用场景包括

  • 稳定的持久化存储,即 Pod 重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现
  • 稳定的网络标志,即 Pod 重新调度后其 PodName 和 HostName 不变,基于 Headless Service(即没有Cluster IP的Service)来实现
  • 有序部署,有序扩展,即 Pod 是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态),基于 init containers来实现
  • 有序收缩,有序删除(即从N-1到0)

DaemonSet

DaemonSet 保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:

  • 日志收集,比如 fluentd,logstash 等
  • 系统监控,比如 Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond 等
  • 系统程序,比如 kube-proxy, kube-dns, glusterd, ceph 等

Service

Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些endpoints 上。每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址或 DNS 来访问服务,而不需要了解后端容器的运行。

Job

Job 负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

Kubernetes 支持以下几种 Job:

  • 非并行 Job:通常创建一个 Pod 直至其成功结束
  • 固定结束次数的 Job:设置 .spec.completions,创建多个 Pod,直到 .spec.completions 个 Pod 成功结束
  • 带有工作队列的并行 Job:设置 .spec.Parallelism 但不设置 .spec.completions,当所有Pod结束并且至少一个成功时,Job 就认为是成功

CronJob

CronJob 即定时任务,就类似于 Linux 系统的 crontab,在指定的时间周期运行指定的任务。在 Kubernetes 1.5,使用 CronJob 需要开启 batch/v2alpha1 API,即–runtime-config=batch/v2alpha1。

Horizontal Pod Autoscaler(HPA)

Horizontal Pod Autoscaling 可以根据 CPU 使用率或应用自定义 metrics 自动扩展 Pod 数量(支持replication controller、deployment和replica set),从而合理的扩展性能与使用资源。

总结

上述只是对 Kubernetes 的一些简单概述,对于 Kubernetes 本身还是很复杂的,特别是要应用到生产环境中去,需要熟悉各组件的工作机制,另外还需要考虑到网络 ,存储,监控,故障转移,高可用,以及安全性等因素。

REFER:
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
https://www.cncf.io/projects/
https://yq.aliyun.com/articles/596889?spm=a2c4e.11153940.blogcont596633.18.66d317fa5uUaVV
https://github.com/rootsongjc/kubernetes-handbook
https://github.com/kubernetes/kubernetes
https://github.com/ramitsurana/awesome-kubernetes
https://www.youtube.com/watch?v=90kZRyPcRZw
https://www.youtube.com/watch?v=1xo-0gCVhTU
https://www.qikqiak.com/k8s-book/
https://jimmysong.io/kubernetes-handbook/
https://www.redhat.com/zh/topics/containers/what-is-kubernetes (红帽 OpenShift)

posted @ 2018-10-26 15:27  花儿笑弯了腰  阅读(1787)  评论(0编辑  收藏  举报