1. Kubernetes介绍
1.1 Kubernetes是什么
Kubernetes是⼀个可移植、可扩展的 “分布式开源平台”,这个平台主要是⽤来管理我们运⾏的容器化应⽤,只不过这个平台它是⼀个分布式的,那Kubernetes这个分布式平台是如何实现的呢。 Kubernetes是将多个OS节点组织在⼀起,构建出⼀个庞⼤的虚拟资源池,⽽后对⽤户提供操作该集群的接⼝,⽤户就可以通过Kubernetes提供的对应接⼝对容器进⾏增删查改等操作。 所以对于⽤户⽽⾔,它⽆需关⼼Kubernetes底层是如何对容器进⾏的创建、⼜是如何调度到对应的节点的,它只需要专注于⾃⼰的业务逻辑代码开发即可;
当我们需要使⽤Kubernetes交付应⽤时,仅需要通过yaml⽂件的⽅式来描述对应容器的状态,Kubernetes则会按照yaml⽂件中所描述的容器状态信息;进⾏容器的“⾃动化”创建。
Kubernetes会时刻监控着容器的状态,如果有容器故障,则会尝试重启容器,使其能容器运⾏的状态能达到⽤户所期望的值;
1.2 为什么需要Kubernetes
⽬前使⽤容器打包和运⾏应⽤程序,已经是业界主流的⼀种⽅式,在⽣产环境中,我们需要管理运⾏应⽤程序的容器,同时还要确保它不会停机,例:⼀个容器发⽣故障,需要重新拉起该容器。如果系统能⾃动为其处理,那么容器的管理会不会更加的容易
这就是 Kubernetes 需要解决的问题!Kubernetes 它可以轻松的实现应⽤的扩展、服务发现、负载均衡、容器的故障转移、以及容器编排
等。
垂直扩容
:新的服务器节点能够很容易的进⾏增加和删除。⽔平扩容
:容器实例能通过副本控制器进⾏轻松的扩容,缩容弹性伸缩
:能根据容器的资源使⽤情况,进⾏⾃动的扩缩容服务发现和负载均衡
: Kubernetes 为容器提供负载均衡功能,
进⾏流量调度,从⽽使得应⽤运⾏更加稳定。存储编排
:Kubernetes允许⾃动挂载各种存储类系统,例如本地存
储、NFS、GFS、Ceph、公共云存储等。⾃动部署和回滚
:如果应⽤部署过程中出现错误,可以实现⾃动回滚⾃动完成装箱计算
:Kubernetes允许指定每个容器所需的CPU和内
存资源,能够更好的管理容器的资源使⽤。⾃我修复
:Kubernetes 会重新启动失败的容器、替换容器、对运
⾏状况检查不响应的容器进⾏杀死密钥与配置管理
:Kubernetes 允许你存储和管理敏感信息,例如
密码、令牌和 ssh 密钥。可以在不重建容器镜像的情况下,部署和
更新密钥
1.3 Kubernetes不是什么
Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。它提供了 PaaS 产品共有的⼀些普遍适⽤的功能, 例如部署、扩展、负载均衡、⽇志记录和监视。 Kubernetes 默认解决⽅案都是可选和可插拔的。但在重要的地⽅保留了⽤户的选择和灵活性。
不限制⽀持的应⽤程序类型
:如果只要应⽤程序可以在容器中运⾏,
那么它应该可以在 Kubernetes 上很好地运⾏。不部署源代码,也不构建你的应⽤程序
:CI/CD⼯作流取决于组织的
⽂化和偏好以及技术要求。不提供应⽤程序级别的服务作为内置服务
:例如中间件(例如,消息
中间件)、 数据处理框架(例如,Spark)、数据库(例如,
mysql)、缓存、集群存储系统 (例如,Ceph)。但这些组件都可
以在 Kubernetes 上运⾏不要求⽇志记录、监视或警报解决⽅案
: 它提供了⼀些集成作为概念
证明,并提供了收集和导出指标的机制。不提供或不要求配置语⾔/系统
:它提供了声明性API,该声明性
API可以由任意形式的声明性规范所构成。RESTful;不提供也不采⽤任何的机器配置、维护、管理或⾃我修复系统。
1.4 Kubernetes集群角色
Kubernetes集群需要建⽴在多个物理主机上,将多个物理主机的资源抽象出来,组织成⼀个平台,⽽后进⾏统⼀管理,当然它需要多个物理主机,不⼀定必须是物理机,也可以是虚拟机VM等等;所以从这个⻆度来说,Kubernetes是⼀个集群,但是在Kubernetes集群内部,这些节点⼜被划分成了两类⻆⾊;
- ⼀类⻆⾊为主节点,叫Master,负责管理集群;
- ⼀类⻆⾊为⼯作节点,叫Node,负责运⾏应⽤;
这也就意味着我们将来运⾏的所有容器,都应该运⾏在Node节点,⽽Master负责管理有多少个Node节点,同时还负责管理每个Node节点应该运⾏哪个容器或哪些容器的控制中⼼,因此在Kubernetes中Master被称之为Control plane控制平⾯,⽽Node就是我们的data plane叫数据平⾯;
Registry:Kubernetes主要是在Node上运⾏容器化应⽤,那么容器化应⽤需要依托镜像,⽽镜像⼜来⾃于Registry,但Registry并不是Kubernetes集群的组成部分,但我们必须要有⼀个私有的Registry,
当然也可以使⽤公共的镜像仓库;
Client:⽆论客户端是通过API接⼝,还是WebUI接⼝、异或者CLI接⼝与Master交互,其实都是向Master发送请求,⽐如客户端申请创建容器、删除容器等,都是由Master负责在Node节点上对容器进⾏增删改查,⽽这些操作必须要通过Master,由Master控制着完成的,虽然我们将其称Master,但它并⾮是⼀个组件,⽽是由多个组件组成的;
2. Kubernetes集群组件
通过创建⼀个Pod或者Deployment资源来了解Kubernetes集群组件以
及之间的关系。
2.1 Master节点组件
2.1.1 kube-APIServer
Kubernetes API 主要提供前端请求接⼊,然后验证客户端身份,以及客户端提交的请求。所有的组件都必须通过APIServer进⾏交互;
2.1.2 Kube-Scheduler
负责监视APIServer新创建,但未指定运⾏⾄哪个节点的 Pod,然后选择合适的节点让 Pod 在上⾯运⾏;
调度决策考虑的因素有很多,其中有 Pod亲和性、反亲和、节点亲和、数据位置等
2.1.3 Kube-ControllManager
控制器通过 APIServer 监控集群当前运⾏的容器状态,当控制器监控到运⾏的容器状态不符合期望状态时,控制器会致⼒于将当前状态转变为期望的状态,简单来说就是⾃动调节当前系统运⾏状态;
控制循环的例⼦:房间⾥的温度⾃动调节器。当你设置了温度,告诉了温度⾃动调节器你的 期望状态(Desired State)。 房间的实际温度是当前状态(Current State) 通过对设备的控制,温度⾃动调节器让其当前状态接近期望状态。
这些控制器包括:
节点控制器
(Node Controller): 负责在节点出现故障时进⾏通知和响应;
副本控制器
(ReplicaSet Controller):监视容器运⾏的副本,时刻让其维持期望状态;
任务控制器
(Job controller): 监测⼀次性任务的 Job 对象,然后创建Pods来运⾏这些任务直⾄完成;
…
2.2 Node节点组件
2.2.1 Kube-kubelet
kubelet 是集群中每个 Node 节点上运⾏的代理程序,⽤于接收APIServer 提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运⾏状态且健康,主要作⽤就是管理容器的启动、停⽌、销毁、
重建等;
2.2.2 Kube-kubeproxy
kube-proxy 是集群中每个节点上运⾏的⽹络代理,它主要维护每台节点上的 Iptables、IPVS 规则创建和删除,这些规则允许从集群内部或集群外部与 Pod 进⾏⽹路通信;kube-proxy负责实现容器的负载均衡,然后将指定的流量调度到对应的容器,通过iptables或ipvs规则来实现
2.2.3 ContainerRuntime
容器运⾏环境是负责运⾏容器的软件,Kubernetes ⽀持容器运⾏时,⽐如 Docker、Containerd等;
2.3 Add-One附件组件
2.3.1 CoreDNS
每创建⼀个内部负载均衡,则⾃动创建⼀条对应的DNS记录,这样就可以
让Pod通过域名的⽅式访问对应的负载均衡; 因为k8s分配的负载均衡
IP不稳定,删除和添加都会发⽣变化,但如果分配⼀个稳定的DNS名称,
则⽆需关系负载均衡的IP;
2.3.2 network
⽹络插件,为每个Pod分配⼀个IP地址,确保多个不同节点的Pod能够直
接通信,⽽⽆需经过NAT地址转换等;
2.3.3 Dashboard
为Kubernetes提供图形界⾯,通过图形界⾯管理Kubernetes;
2.4 Pod的创建流程图
3. Kubernetes快速入门总结
Kubernetes CLuster
Master:
API Server
Scheduler :调度器 负责将Pod调度到对应的Node节点上;
Controller Manager: 控制器管理器 致力于将当前状态转为期望状态;
ReplicasSet Controller: 副本控制器;
Nodes:
Kubelet:
watch API Server,Pod需要绑定到当前节点; PodSpec
APIServer 将PodSpec规范,下发给Kubelet, 容器名称,容器镜像,容器存储等等
kubelet根据这些信息,Registry获取镜像,通过CNI网络插件获取IP地址,通过CSI存储卷相关信息;
通过DOcker来运行对应的容器(Container)
kube-proxy:
Watch API Server,获取Service资源 Endpoints资源变更;
Service: 分配负载均衡IP地址(虚拟VIP)
Endpoints:获取到对应容器的IP地址集合;负载均衡后端节点
kubeproxy:VIP + Endpoints IP集合,转为对应的Iptables、IPVS规则,然后应用到所有的节点;
container Runtime: Docker Containerd ....等 运行容器的软件;
addons:
CoreDNS:
为负载均衡提供一个稳定的名称;
Network:
Flannel host-gw模式,在节点上创建了一推的路由条目;去往1网段的网关是多少; 去往2网段网关是发多少
集群如果没有这个网络插件的话,是没有办法实现跨集群通信的;
Dashboard:
图形界面;命令行操作Kubernetes;