Kubernetes 学习笔记 (基础)

概况

集群采用 Master/Node的结构,Master(主节点)控制整个集群,Node(从节点)为集群提供计算能力。

Master

Master是Kubernetes集群的大脑,负责公开集群的API,调度部署和管理整个集群。集群至少有一个Master节点,如果在生产环境中要达到高可用,还需要配置Master集群。Master主要包含API Server、Scheduler、Controller三个组件,需要etcd组件来保存整个集群的状态。

  • etcd:一个高可用、强一致性的服务发现存储仓库,为Kubernetes集群提供存储服务,类似于zookeper。

  • API Server: kubernetes最重要的核心组件之一,提供资源操作的唯一入口(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd),并提供认证、授权、访问控制、API注册和发现等机制。

  • Scheduler:负责资源的调度,按照预定的调度策略将Pod(k8s中调度的基本单位)调度到相应的Node上。

  • Controller:通过API Server来监控整个集群的状态,并确保集群处于预期的工作状态,比如故障检测、自动扩展、滚动更新等。

Node

Node是Kubernetes集群的工作节点,可以是物理机也可以是虚拟机。Node需要包含容器、kubelet、kube-proxy等组件。。

  • kubelet:维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理。每个节点上都会运行一个kubelet服务进程,接收并执行Master发来的指令,管理Pod及Pod中的容器。每个kubelet进程会在API Server上注册节点自身信息,定期向Master节点汇报节点的资源使用情况,并通过cAdvisor监控节点和容器的资源。

  • kube-proxy: 为 Service 提供集群内部的服务发现和负载均衡,监听 API Server 中 service和endpoint的变化情况,并通过iptables等方式来为服务配置负载均衡。

  • Docker: 每台Node上需要安装Docker来运行镜像,但是Docker不是唯一选择,Kubernetes支持多种容器,比如CoreOS公司的Rkt容器(之前称为Rocket,现更名为Rkt)。

Pod

在创建新部署时,Kubernetes会建立一个Pod来寄存你的应用实例。Pod是一个抽象的概念,它包含一个或多个容器组成的容器组,还有这些容器共享的资源,Pod就像是豌豆荚一样,它可以由一个或者多个容器组成,这些容器共享存储、网络和配置项。这些资源包括:

  • 共享的存储,例如Volume

  • 网络,比如使用唯一的集群IP地址

  • 如何运行容器的配置信息,比如镜像版本和容器端口

Pod模型上类似于一个具有特定应用的逻辑主机,它可以包含相对紧密耦合的不同应用容器。例如,一个Pod可能既包含Node.js Web服务容器,又包含给它提供数据库服务的容器。同一个Pod里的容器共享一个IP地址和端口段,协同工作和调度,并且在同一节点上的共享环境中运行。

Pod是Kuberlnetes平台中的原子单位。在部署创建时,部署并不直接创建容器,而是创建包含了容器的Pod。Pod被分配绑定在指定的Node上,除非被停止或者删除它会一直在该Node上工作。万一出现Node宕机的情况,集群中另外一个可用的Node会马上启动运行一个完全一样的Pod

Pod控制器

目前Kubernetes中的业务类型可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application)这四种类型,而这四种类型的业务又可以由不同类型的Pod控制器来完成,分别为:Deployment、Job、DaemonSet和StatefulSet。

  • Deployment: 复制控制器(Replication Controller,RC)是集群中最早的保证Pod高可用的API对象,副本集(Replica Set,RS)是它的升级,能支持更多种类的匹配模式。部署(Deployment)又是比RS应用模式更广的API对象,以Kubernetes的发展方向,未来对所有长期伺服型的的业务的管理,都会通过Deployment来管理。

  • Service: Deployment保证了Pod的数量,但是没有解决如何访问Pod的问题,一个Pod只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP启动一个新的Pod,因此不能以确定的IP和端口号提供服务。要稳定地提供服务需要服务发现和负载均衡能力,Service可以稳定为用户提供服务。

  • Job: 用来控制批处理型任务,Job管理的Pod根据用户的设置把任务成功完成就自动退出了。

  • DaemonSet: 后台支撑型服务的核心关注点在集群中的Node,要保证每个Node上都有一个此类Pod运行。比如用来收集日志的Pod。

  • StatefulSet: 不同于RC和RS,StatefulSet主要提供有状态的服务,StatefulSet中Pod的名字都是事先确定的,不能更改,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续以它的状态提供服务。比如数据库服务MySQL,我们不希望一个Pod故障后,MySQL中的数据即丢失。

API

 API对象是Kubernetes集群中的管理操作单元。集群中的众多技术概念分别对应着API对象,每个API对象都有3大类属性:

metadata(元数据):用来标识API对象,包含namespace、name、uid等。

spec (规范):描述用户期望达到的理想状态,所有的操作都是声明式(Declarative)的而不是命令式(Imperative),在分布式系统中的好处是稳定,不怕丢操作或运行多次。比如设置期望3个运行Nginx的pod,运行多次也还是一个结果,而给副本数加1的操作就不是声明式的,运行多次结果就错了。

status(状态):描述系统当前实际达到的状态,比如期望3个pod,现在实际创建好了2个。