K8S的意义与入门
专有名词
- 容器:包含了运行一个应用程序所需要的所有东西,包括:代码、运行时、各种依赖和配置。
- pod:K8s调度的最小单元,包含一个或多个容器。一个容器组中的容器具有紧密耦合性,共享资源,存储空间和IP。即同一个容器组中的容器可以通过localhost:xxx访问其他容器
- node:K8S中的执行角色为Node,一个Node一般是一个虚拟机或物理机,它上面事先运行着 docker 服务和 kubelet 服务( Kubernetes 的一个组件)。
容器编排的意义
- 提出背景: 随着微服务架构的出现,单体式架构被拆分成了很多细小的服务,运行在各自的容器中。那么该如何解决它们之间的 依赖管理,服务发现,资源管理,高可用 等问题呢?
- 容器编排的作用:
- 资源编排: 限制各容器的可用资源,资源分配和调度。
- 工作负载编排: k8s通过不同的 controller 将 Pod 调度到合适的 node 上,并且负责管理它们的生命周期。
- 服务编排: 负责服务发现和高可用等,如 Kubernetes 中可用通过 Service 来对内暴露服务,通过 Ingress 来对外暴露服务‘
Service :将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
Ingress :公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制;
K8S 的集群构成与原理
Master结构:
- Api server:是整个系统的对外接口,供客户端和其它组件调用;
- Etcd:Api server 的后台数据存储,相当于 Kubernetes 集群的数据中⼼;
- Scheduler:负责对集群内部的资源进行调度;
- Controller-manager:控制管理器,保证 Kubernetes 集群中的资源按照要求运⾏。
Node结构:
- Kubelet:负责与 Master 节点交互,相当于master的代理,接受master下发的任务,进⽽执⾏具体的任务;
- Kube-proxy:负责 Kubernetes 集群中的负载均衡;
- Container-runtime:提供容器运行环境,有 docker,rkt 或者其他容器实现标准,负责容器的操作,启动或者关闭等;
- Pod:k8s 的最小调度单元,1 个 pod 可以包含 1 个或多个容器,pod 可以理解为容器的集合。
Pod的创建流程
以创建 Pod 为例,来理解 Kubernetes 中的各组件的运⾏流程:
- 通过
api server
向集群发起创建 Pod 的指令,api server
将 yaml 中的配置的属性信息(metadata)写入 etcd 中。 api server
触发 watch 机制准备创建 pod,信息转发给调度器Scheduler
,Scheduler
使用调度算法选择 node,然后将 node 信息给api server
,api server 将绑定的 node 信息写入 etcd。api server
又通过watch
机制,调用kubelet
,指定 pod 信息,触发docker run
命令创建容器。创建完成之后反馈给 kubelet, kubelet 又将 pod 的状态信息给 api server, api server 又将 pod 的状态信息写入etcd。
⾄此 Pod 真正的创建完毕。如果因为某些原因 Pod 出现了问题,集群中的 controller-manager 会向 apiserver 发起创建的请求。
K8s中控制器管理
控制器模式与声明式API编程
Kubernetes 如何能够实现最大单个集群能够达到5000个节点,15万个Pod的完全自动化管理,主要归功于声明式API编程与控制器模式的协作。
-
控制器模式: 在k8s集群中,控制器通过 API Server提供的(List & Watch)接口实时监控集群中资源对象的状态变化,当发生故障,导致资源对象的状态变化时,控制器会尝试将其状态调整为期望的状态。发现变化的方式有两种,一种为定时轮训,一种为监听通知。
比如当某个Pod出现故障时,Deployment Controller会及时发现故障并执行自动化修复流程,确保集群里的Pod始终处于预期的工作状态。
-
声明式API编程: 相反于 命令式的编程方法的一种编程方式。只给目标,不关乎结果,目标达成即可。简单说,如果要扩容,并不是给“创建一个新node”的指令,而是直接将node数改为“n+1”。声明式更新的好处是不会丢失历史变更。
ReplicaSet 控制器
-
ReplicaSet 主要的作用是维持一组Pod副本的运行,使pod副本的数量始终维持在预设的个数。它会持续监听这些Pod的运行状态,在Pod发生故障时重启pod,pod数量减少时重新运行新的 Pod副