什么是K8S?
K8s三要素 - 部署 弹性 管理
Kubernetes 是一个自动化的容器编排平台,它负责应用的部署、应用的弹性以及应用的管理,这些都是基于容器的。
K8S的核心功能
1.服务发现与负载均衡;
K8s支持服务的发现与负载的均衡。
2.容器的自动装箱
我们也会把它叫做 scheduling,就是“调度”,把一个容器放到一个集群的某一个机器上。
3.存储的编排
Kubernetes 会帮助我们去做存储的编排,让存储的生命周期与容器的生命周期能有一个连接。
4.自动化的容器的恢复
Kubernetes 会帮助我们去做自动化的容器的恢复。在一个集群中,经常会出现宿主机的问题或者说是 OS 的问题,导致容器本身的不可用,Kubernetes 会自动地对这些不可用的容器进行恢复。
5.应用的自动发布与回滚与配置密文管理
Kubernetes 会帮助我们去做应用的自动发布与应用的回滚,以及与应用相关的配置密文的管理。
6.批处理
对于 job 类型任务,Kubernetes 可以去做批量执行。
7.水平伸缩
为了让这个集群、这个应用更富有弹性,Kubernetes 也支持水平的伸缩。
K8s三大核心功能
1.调度
K8s可以把一个容器放到一个集群的某一个机器上,k8s的调度器会观察这个容器的大小,规格,比如CPU Memory,然后调度器会在集群中找一台比较空闲的机器来进行一次placement。
2.自动修复
K8S具有节点健康检查的功能,它会监测这个集群中所有的宿主机,当一个宿主机出现故障时,K8S会将该节点上的容器自动转移到健康节点上。
3.水平伸缩
k8s有业务负载检查的能力,它会检测业务上所承担的负载,对业务进行水平扩容,减少负载。
K8s架构
Kubernetesde的架构跟Zookeeper一样是一个比较典型的CS二层架构:
Master - Client和Node的沟通枢纽
Master Server作为中央的管控节点,会去与 Node 进行一个连接,用户会通过UI, CLI的client与 Master 进行连接,把希望的状态或者想执行的命令下发给 Master,Master 会把这些命令或者状态下发给相应的节点,进行最终的执行。
Master的四个主要的组件
API Server、Controller、Scheduler 以及 etcd。
-
API Server: 可以水平拓展顾名思义是用来处理 API 操作的,Kubernetes 中所有的组件都会和 API Server 进行连接,组件与组件之间一般不进行独立的连接,都依赖于 API Server 进行消息的传送;
-
Controller: 可热备是控制器,它用来完成对集群状态的一些管理。比如刚刚我们提到的两个例子之中,第一个自动对容器进行修复、第二个自动进行水平扩张,都是由 Kubernetes 中的 Controller 来进行完成的;
-
Scheduler:可热备是调度器,“调度器”顾名思义就是完成调度的操作,比如把一个用户提交的 Container,依据它对 CPU、对 memory 请求大小,找一台合适的节点,进行放置;
-
etcd: 保证高可用性是一个分布式存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中,etcd 本身是一个高可用系统,通过 etcd 保证整个 Kubernetes 的 Master 组件的高可用性。
Node - 真正承担业务负载的服务器
NodeKubernetes的 Node 是真正运行业务负载的,每个业务负载会以 Pod 的形式运行。
kubelet
一个 Pod 中运行的一个或者多个容器,kubelet作为Node上最关键的组件是负责真正去运行这些 Pod 的组件的 ,它通过 API Server 接收到所需要 Pod 运行的状态,然后提交到 Container Runtime 组件中。
Node的四个组件\
Container runtime
负责真正去启动配置容器和容器的运行环境
Storage Plugin/Network Plugin
K8s在OS上创建容器运行的环境并将Pod启动起来的过程中不会直接对网络和存储进行操作,而是通过Storage/Network Plugin对其管理
Kube-proxy
Kubernetes也会有 Kubernetes 的 Network,它是为了提供 Service network 来进行搭网组网的。真正完成 service 组网的组件的是Kube-proxy,它是利用了 iptable 的能力来进行组建 Kubernetes 的 Network,就是 cluster network。
Tips: Kubernetes 的 Node 并不会直接和 user 进行 interaction,它的 interaction 只会通过Master。而 User 是通过 Master 向节点下发这些信息的。Kubernetes 每个 Node 上,都会运行我们刚才提到的这几个组件。
K8s部署流程
1.用户通过UI或者 CLI 提交一个 Pod 给 Kubernetes 进行部署,这个 Pod 请求首先会通过 CLI 或者 UI 提交给 Kubernetes API Server。
2.API Server 会把这个信息写入到它的存储系统 etcd
3.Scheduler 会通过 API Server 的 watch 或者叫做 notification 机制得到这个信息:有一个 Pod 需要被调度。
4.Scheduler 会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向 API Server report 说:“OK!这个 Pod 需要被调度到某一个节点上。”
5.API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中
6.API Server 会通知相应的节点进行这次 Pod 真正的执行启动。
7.相应节点的 kubelet 会得到这个通知,kubelet 就会去调 Container runtime 来真正去启动配置这个容器和这个容器的运行环境,去调度 Storage Plugin 来去配置存储,network Plugin 去配置网络。