官网文档地址:https://kubernetes.io/zh/docs/home/ (k8s官方有详细文档,学习最好去官网)
kubernetes 简介
Kubernetes 是一个自动化的容器编排平台,它负责应用的部署、应用的弹性伸缩以及应用的管理。它可以提供许多功能, 通俗的讲kubernetes是一个容器云管家,它来管理和编排容器,kubernetes可以提供以下这些功能:
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
自动完成装箱计算
Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
自我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥
…等
kubernetes 集群架构
kubernetes使用的是 master-node架构。
Master 作为中央的管控节点,会去与 Node 进行一个连接。客户端(比如UI/CLI等)只会和 Master 进行连接,把希望的状态或者想执行的命令下发给 Master,Master 会把这些命令或者状态下发给相应的节点,进行最终的执行
- master: 主节点,可能有很多
- node: 工作节点,很多,真正干活的应用
工作原理
Master
Kubernetes 的 Master 包含四个主要的组件:kube-apiserver、kube-controller、kube-scheduler 以及 etcd,如下图所示。我们一般也称Master节点为控制面(Control Plane),控制面的这4个组件对集群做出全局决策(比如把Pod调度到某个合适的节点上),以及检测和响应集群事件。
master节点上有一些核心组件:
- Controller Manager:控制管理器,它用来完成对集群状态的管理
- etcd:键值数据库,是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中,etcd 本身是一个高可用系统,通过 etcd 保证整个 Kubernetes 的 Master 组件的高可用性
- scheduler:调度器,“调度器”顾名思义就是完成调度的操作,该组件监视那些新创建的 Pod,并选择符合调节的节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰等。
- api server:api网关,顾名思义是用来处理 API 操作的,Kubernetes 中所有的组件都会和 API Server 进行连接,组件与组件之间一般不进行独立的连接,都依赖于 API Server 进行消息的传送
Node
Kubernetes 的 Node 是真正运行业务负载的,每个业务负载会以 Pod 的形式运行。一个 Pod 中运行一个或者多个容器,真正去运行这些 Pod 的组件的是叫做 kubelet,也就是 Node 上最为关键的组件,它通过 API Server 接收到所需要 Pod 运行的状态,然后提交到我们下面画的这个 Container Runtime 组件(简单的理解也就是平时我们所说的容器)中。
node节点(worker工作节点):
- kubelet:这是运行在每个工作节点上最重要的组件,kubelet 接收一组通过各类机制提供给它的 PodSpecs(也就是Pod的期望状态),确保这些 PodSpecs 中描述的容器处于运行状态且健康。
- kube-proxy:代理。代理网络,kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络与 Pod 进行网络通信。它是实现Kubernetes Service概念的重要组件。
- Pod: Pod 是 Kubernetes 的一个最小调度以及资源单元。用户可以通过 Kubernetes 的 Pod API 生产一个 Pod,让 Kubernetes 对这个 Pod 进行调度,也就是把它放在某一个 Kubernetes 管理的节点上运行起来。一个 Pod 简单来说是对一组容器的抽象,它里面会包含一个或多个容器。
Master 和 node节点交互如下图:
需要强调的是,Kubernetes 的 Node 并不会直接和用户进行交互,它的交互只会通过 Master,用户通过 Master 向节点下发信息。Kubernetes 每个 Node 上,都会运行刚才提到的这几个组件。
组件交互原理
想让k8s部署一个tomcat?整个交互过程如下:
- 开机默认所有节点的kubelet、master节点的scheduler(调度器)、controller-manager(控制管理器)一直监听master的api-server发来的事件变化(for ::)
- 程序员使用命令行工具: kubectl ; kubectl create deploy tomcat --image=tomcat8(告诉master让集群使用tomcat8镜像,部署一个tomcat应用)
- kubectl命令行内容发给api-server,api-server保存此次创建信息到etcd
- etcd给api-server上报事件,说刚才有人给我里面保存一个信息。(部署Tomcat[deploy])
- controller-manager监听到api-server的事件,(部署Tomcat[deploy])
- controller-manager 处理这个 (部署Tomcat[deploy])的事件。controller-manager会生成Pod的部署信息【pod信息】
- controller-manager 把Pod的信息交给api-server,再保存到etcd
- etcd上报事件【pod信息】给api-server。
- scheduler专门监听 【pod信息】 ,拿到 【pod信息】的内容,计算,看哪个节点合适部署这个Pod【pod调度过后的信息node: node-02)】
- scheduler把 【pod调度过后的信息(node: node-02)】交给api-server保存给etcd
- etcd上报事件【pod调度过后的信息(node: node-02)】,给api-server
- 其他节点的kubelet专门监听 【pod调度过后的信息(node: node-02)】 事件,集群所有节点kubelet从api-server就拿到了 【pod调度过后的信息(node: node-02)】 事件
- 每个节点的kubelet判断是否属于自己的事情;node-02的kubelet发现是他的事情
- node-02的kubelet启动这个pod。汇报给master当前启动好的所有信息