Kubernetes
Kubernetes
介绍
Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S。K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久。K8S主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。2015年7月,Kubernetes v1.0正式发布,截止到2017年9月29日最新稳定版本是v1.8。Kubernetes目标是让部署容器化应用简单高效。
Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统。Kubernetes 的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原语上进行自助运营。Kubernetes 也提供稳定、兼容的基础(平台),用于构建定制化的workflows 和更高级的自动化任务。
Kubernetes 具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。Kubernetes 还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。
Kubernetes优势
-
容器编排
-
轻量级
-
开源
-
弹性伸缩
-
负载均衡
特性
1、自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
2、弹性伸缩
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
3、自动部署和回滚
K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
4、服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
5、机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
6、存储编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。 批处理 提供一次性任务,定时任务;满足批量数据处理和分析的场景。
7、自动装箱 建构于容器之上,基于资源依赖及其他约東自动完成容器部署且不影响其可用性,并通过调度机制混合关键型应用和非关键型应用的工作负载于同一节点以提升资源利用率。
8、水平扩展 支持通过简单命令或 UI 手动水平扩展,以及基于 CPU 等资源负载率的自动水平扩展机制。
9、服务发现和负载均衡 Kubernetes 通过其附加组件之一的 KubeDNS (或 CoreDNS )为系统内置了服务发现功能,它会为每个 Service 配置 DNS 名称,并允许集群内的客户端直接使用此名称发出访问请求,而 Service 则通过 iptables 或 ipvs 内建了负载均衡机制。
10、自动发布和回滚 Kubernetes 支持“灰度”更新应用程序或其配置信息,它会监控更新过程中应用程序的健康状态,以确保它不会在同一时刻杀掉所有实例,而此过程中一旦有故障发生,就会立即自动执行回滚操作。
11、密钥和配置管理 Kubernetes 的 ConfigMap 实现了配置数据与 Docker 镜像解耦,需要时,仅对配置做出变更而无须重新构建 Docker 镜像,这为应用开发部署带来了很大的灵活性。 此外,对于应用所依赖的一些敏感数据,如用户名和密码、令牌、密钥等信息, Kubernetes 专门提供了 Secret 对象为其解耦,既便利了应用的快速开发和交付,又提供了一定程度上的安全保障。
12、存储编排 Kubernetes 支持 Pod 对象按需自动挂载不同类型的存储系统,这包括节点本地存储、公有云服务商的云存储(如 AWS 和 GCP 等),以及网络存储系统(例如, NFS 、 ISCSI、GlusterFS 、 Ceph 、 Cinder 和 Flocker 等)。
13、批量处理执行 除了服务型应用, Kubernetes 还支持批处理作业及 CI (持续集成),如果需要,一样可以实现容器故障后恢复。
术语
官方把 kubernetes 术语分为 12 个分类: 系统结构、社区、核心对象、扩展、基础、网络、操作、安全、存储、工具、用户类型、工作负载
由于 k8s 的术语实在太多了,想要全部记住作为新学者还是有点压力,所以我们课程中只讲解一些常用的术语。想要了解更多 kubernetes 术语,请参照官方术语表。 地址:https://kubernetes.io/docs/reference/glossary/?fundamental=true
Pods
在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod,Pod是最小的,管理,创建,计划的最小单元。
Labels
标签其实就一对 key/value ,被关联到对象上,比如Pod;标签的使用我们倾向于能够标示对象的特殊特点,并且对用户而言是有意义的(就是一眼就看出了这个Pod是数据库),但是标签对内核系统是没有直接意义的。标签可以用来划分特定组的对象(比如,所有女的),标签可以在创建一个对象的时候直接给与,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的
"labels": {
"key1" : "value1",
"key2" : "value2"
}
Node
- Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或minion)。
- Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。
- node可以是任何形式的计算设备,只要此设备上能够有传统意义上的CPU、内存、存储空间,并且能装上k8s的集- - 群代理程序,它都可以作为整个k8s集群一个成员
- 只要能装上kunelet就能成为一个节点
- Node是Pod真正运行的主机,可以物理机,也可以是虚拟机。为了管理Pod,每个Node节点上至少要运行container runtime(比如docker或者rkt)、kubelet和kube-proxy服务。
pod
- 运行于Node节点上,若干相关容器的组合。
- K8s的最小调度逻辑单元
- pod可以理解为是容器的外壳,它为容器做了一层抽象的封装
- Pod是Kurbernetes进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。
- 一个Pod可以包含一个容器或者多个相关容器。同一个pod中的不同容器可以共享存储卷
- 一个pod上无论是有一个容器还是有多个容器,一旦将此pod调度到某node上运行时,这一个pod内的所有容器只能运行在同一个node上
可能还是不是挺明白,我举个例子:经常有人把pod比作豌豆荚,容器就是豌豆荚里的豌豆,那么豌豆有可能是一个,也有可能是多个,为什么不直接使用容器呢,而是用pod来封装一个或多个容器呢
我这里举个例子,如果有一套lnmp架构的系统,一般不会运行在一个容器中,而是在多个容器中,但是这样他们之间的相互连接就变得十分困难,而pod提供了共享网络和存储,所以他们可以通过localhost进行内部的通信,虽然网络和存储是共享的,但是cpu和内存就不是,也是就说我们可以单独对pod中的容器做资源使用的限制
标签
-
标签是附加到容器,复制控制器和服务的键值,标签也是k8s特色的管理方式,便于分类管理资源对象
-
一个Label是 一个key=value的键值对,其中key与value由用户自己指定。
- key:只能使用 字母 数字 _ - . (只能以字母数字开头,不能超过63给字符)
- value: 可以为空 只能使用 字母 数字开头
-
一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系。
-
一个资源拥有多个标签,可以实现不同维度的管理。
-
可以使用标签选择器来指定能使用哪些标签。
标签选择器
- 标签选择器是Kubernetes中的核心分组原语。用户使用它们来选择一组对象。
- 标签选择器就是一种根据标签来过滤符合条件的资源对象的机制
- 用来控制pod
分别的作用
pod=调度和管理的最小单位,逻辑单元
node=是工作的,运行容器,运行Pod的服务节点的
标签=无非就是给他打个标签,便于分类管理资源
标签选择器=控制pod,根据标签来过滤符合条件的对象进行删除,停止
架构
Kubernetes 架构是一个比较典型的二层架构和 server-client 架构。Master 作为中央的管控节点,会去与 Node 进行一个连接。
所有 UI 的、clients、这些 user 侧的组件,只会和 Master 进行连接,把希望的状态或者想执行的命令下发给 Master,Master 会把这些命令或者状态下发给相应的节点,进行最终的执行。

master

Kubernetes 的 Master 包含四个主要的组件:API Server、Controller、Scheduler 以及 etcd。
-
API Server:是用来处理 API 操作的,Kubernetes 中所有的组件都会和 API Server 进行连接,组件与组件之间一般不进行独立的连接,都依赖于 API Server 进行消息的传送;
-
Controller:控制器,它用来完成对集群状态的一些管理。
-
Scheduler:调度器,完成调度的操作。例如,一个用户提交了 Container,调度器依据它对 CPU、对 memory 请求大小,找一台合适的节点,进行放置;
-
etcd:是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中,etcd 本身是一个高可用系统,通过 etcd 保证整个 Kubernetes 的 Master 组件的高可用性。
Node
Kubernetes 的 Node 是真正运行业务负载的,每个业务负载会以 Pod 的形式运行。一个 Pod 中运行的一个或者多个容器,真正去运行这些 Pod 的组件的是叫做 kubelet,也就是 Node 上最为关键的组件,它通过 API Server 接收到所需要 Pod 运行的状态,然后提交到下面画的这个 Container Runtime 组件中。

在 OS 上去创建容器所需要运行的环境,最终把容器或者 Pod 运行起来,也需要对存储跟网络进行管理。Kubernetes 并不会直接进行网络存储的操作,他们会靠 Storage Plugin 或者是网络的 Plugin 来进行操作。用户自己或者云厂商都会去写相应的 Storage Plugin 或者 Network Plugin,去完成存储操作或网络操作。
在 Kubernetes 自己的环境中,也会有 Kubernetes 的 Network,它是为了提供 Service network 来进行搭网组网的。真正完成 service 组网的组件的是 Kube-proxy,它是利用了 iptable 的能力来进行组建 Kubernetes 的 Network,就是 cluster network,以上就是 Node 上面的四个组件。
Kubernetes 的 Node 并不会直接和用户进行交互,它的交互只会通过 Master。而用户是通过 Master 向节点下发这些信息的。Kubernetes 每个 Node 上,都会运行我们刚才提到的这几个组件。
交互流程

用户可以通过 UI 或者 CLI 提交一个 Pod 给 Kubernetes 进行部署,这个 Pod 请求首先会通过 CLI 或者 UI 提交给 Kubernetes API Server,下一步 API Server 会把这个信息写入到它的存储系统 etcd,之后 Scheduler 会通过 API Server 的 watch 或者叫做 notification 机制得到这个信息:有一个 Pod 需要被调度。
然后 Scheduler 会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向告诉API Server 这个 Pod 需要被调度到某一个节点上。
接着 API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中,然后 API Server 会通知相应的节点进行这次 Pod 真正的执行启动。相应节点的 kubelet 会得到这个通知,kubelet 就会去调 Container runtime 来真正去启动配置这个容器和这个容器的运行环境,去调度 Storage Plugin 来去配置存储,network Plugin 去配置网络。
浙公网安备 33010602011771号