容器技术
将应用程序与程序依赖都打包到镜像中,供开发者复制、分发。使用容器技术,不仅提高了打包的速度,还拥有更高的资源利用率。最重要的是,能保持运行环境的一致性,真正做到“一次构建,随处运行”(build once, run anywhere)。这为开发人员、运维人员与测试人员带来了极大的便利,大大提高了效率,降低了运维成本。
基于基础的容器技术,Kubernetes是一套容器集群管理系统
,是一个开源平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能,充分发挥容器技术的潜力,给企业带来真正的便利。Kubernetes拥有自动包装、自我修复、横向缩放、服务发现、负载均衡、自动部署、升级回滚、存储编排等特性
应用架构大致经历了单体架构、多层架构和微服务架构3个阶段.
微服务架构
使用Kubernetes能充分对承载微服务的容器进行管理,对其进行动态扩容和缩容、版本控制、容灾处理、服务注册与发现、监控、动态调节CPU与内存等。对于微服务的应用来说,Kubernetes这样的平台是必需的。
3.1 物理机vs虚拟机
3.2 虚拟机vs容器
3.3 容器和k8s
容器技术本身只是单机版的应用,并没有解决容器的编排问题
。例如,容器没有Web管理界面,也无法实现任务调度策略、监控报警等。随着越来越多的开发者使用了容器技术,编排平台的重要性日益突出。所有人都翘首以盼能使用优秀的容器平台,直到Kubernetes开源,才圆了开发人员的梦。
3.4 容器的舵手——Kubernetes
Kubernetes项目由Google公司在2014年启动。Kubernetes建立在Google公司超过10多年的运维经验基础之上,Google所有的应用都运行在容器上,然后与社区中最好的想法和实践相结合。
Kubernetes是一套容器集群管理系统,是一个开源平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。Kubernetes拥有自动包装、自我修复、横向缩放、服务发现、负载均衡、自动部署、升级回滚、存储编排等特性。
(1) API Server进程
Kubernetes API Server的核心功能是提供Kubernetes各类资源对象(如Pod、RC、Service等)的增、删、改、查及Watch(监控)等
对资源的任何操作都要经过apiserver
对于用户来说,访问API Server进程有3种方式。
(2)etcd
可以将etcd理解为Kubernetes的“数据库”,用于保存集群中所有的配置和各个对象的状态信息
(3)调度器(kube-scheduler)
调度负责Pod调度,用于监听最近创建但还未分配Node的Pod资源,会为Pod自动分配相应的Node
(4)控制器管理器(kube-controller-manager)
负责对象管理
1.2 Node
Node的组成如图2-3所示。Node主要由3个部分组成,分别是kubelet、kube-proxy和容器运行时(container runtime)
(1)kubectl
kubelet是在每个Node上都运行的主要代理进程。kubelet以PodSpec为单位来运行任务,PodSpec是一种描述Pod的YAML或JSON对象。kubelet会运行由各种机制提供(主要通过API Server)的一系列PodSpec,并确保这些PodSpec中描述的容器健康运行。kubelet负责维护容器的生命周期,同时也负责存储卷(volume)等资源的管理。
Kubernetes 使用名为 kubectl 的命令行实用程序与集群 API 服务器通信
(2)kub-proxy
负责服务发现
kube-proxy主要用于管理Service的访问入口,包括从集群内的其他Pod到Service的访问,以及从集群外访问Service。
(3)容器进行时
容器运行时是负责运行容器的软件。Kubernetes支持多种运行时,包括Docker、containerd、cri-o、rktlet以及任何基于Kubernetes CRI(容器运行时接口)的实现。
1.3组件间的基本交互过程
以创建pod为例
(1)kubectl命令将转换为对API Server的调用。
(2)API Server验证请求并将其保存到etcd中。
(3)etcd通知API Server。
(4)API Server调用调度器。
(5)调度器决定在哪个节点运行Pod,并将其返回给API Server。
(6)API Server将对应节点保存到etcd中。
(7)etcd通知API Server。
(8)API Server在相应的节点中调用kubelet。
(9)kubelet与容器运行时API发生交互,与容器守护进程通信以创建容器。
(10)kubelet将Pod状态更新到API Server中。
(11)API Server把最新的状态保存到etcd中。
2.1pod
Pod是Kubernetes处理的最基本单元。容器本身并不会直接分配到主机上,而是会封装到名为Pod的对象中。Pod通常表示单个应用程序,由一个或多个关系紧密的容器构成,如图所示
2.2控制器
一般来说,用户不会直接创建Pod,而是创建控制器,让控制器来管理Pod。
1.ReplicationController和ReplicaSet控制器
ReplicationController可定义Pod模板,并可以设置相应控制参数以实现水平伸缩,以调节正在运行的相同的Pod数。
ReplicationController负责保证在集群中部署的Pod数量与配置中的Pod数量一致。如果Pod或主机出现故障,ReplicationController会自动启用新的Pod进行补充。
ReplicationController还可以执行滚动更新,将一组Pod逐个切换到最新版本,从而最大限度地减少对应用程序可用性的影响。
ReplicaSet控制器
可以看作ReplicationController的另一种版本,其Pod识别功能使它在Pod管理上更具灵活性。由于ReplicaSet控制器具有副本筛选功能,因此ReplicaSet控制器才有逐渐取代ReplicationController的趋势,但ReplicaSet控制器无法实现滚动更新,无法像ReplicationController那样在后端轮流切换到最新版本。
“滚动升级”(Rolling Update),比如在当前系统中有10个对应的旧版本的Pod,则最佳的系统升级方式是旧版本的Pod每停止一个,就同时创建一个新版本的Pod,在整个升级过程中此消彼长,而运行中的Pod数量始终是10个,几分钟以后,当所有的Pod都已经是新版本时,系统升级完成。
2.Deployment控制器
Deployment控制器以ReplicaSet控制器为基础,是更高级的概念,增加了更灵活的生命周期管理功能。
Deployment控制器是一种高级对象,旨在简化Pod的生命周期管理。只要简单更改Deployment控制器的配置文件,Kubernetes就会自动调节ReplicaSet控制器,管理应用程序不同版本之间的切换,还可以实现自动维护事件历史记录及自动撤销功能,如图所示。正是由于这些强大的功能,Deployment控制器可能是使用频率最高的对象。
3.StatefulSet控制器
4.DaemonSet控制器
5.Job控制器和CronJob控制器
2.3服务与存储
1.service组件和Ingress
services是内部负载均衡器的一种组件,会将相同功能的Pod在逻辑上组合到一起
2.存储卷和持久存储卷
2.标签和注解
docker
Kubernetes关键组件
3.2.1 如何解决CPU数量不够的问题
3.2.2 如何解决不支持交换内存的问题
3.2.3 如何解决网络连接错误的问题
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。