1.kubernetes 技术
kubernetes 是容器技术快速发展的产物,kubernetes的出现使得大量服务的运维变得便捷、简单起来。
1.1什么是kubernetes
简单来说,kubernetes是一套自动化容器运维的开源平台,这些运维操作包括部署、调度和节点集群的间扩展。在前面几篇中我们简单介绍了Docekr。实际上,可以将Docker看作是kubernetes内部使用的低级别的组件,而kubernetes 则是管理Docker 容器的工具。如果把docker 比作是集装箱,那么kubernetes就是存放集装箱的大型仓库。
1.2kubernetes优势
kubernetes是一个自动化部署,具有可伸缩性的用于操作应用程序容器的开源平台。使用kubernetes,我们可以快速高效的满足用户以下需求:
- 快速精准的部署应用程序。
- 即时伸缩我们的应用程序。
- 无缝展现新特征
- 限制硬件用量仅为所需资源。
kubernetes具有以下明显的优势:
- 可移动:公有云、私有云、混合云、多态云
- 可扩展:模块化、插件化、可挂载、可组合。
- 自修复:自动部署、自动重启、自动复制、自动扩缩容。
为什么我们需要kubernetes,他能做什么?
至少,kubernetes能在物理机或虚拟机集群上调度和运行程序容器。而且,kubernetes也可以让开发者斩断联系着物理机或虚拟机的“锁链”,从以主机为中心的架构跃升至以容器为中心的架构。该架构最终提供给开发者诸多内在的优势和便利。kubernetes提供了在基础架构上真正的以容器为中心的开发环境。
kubernetes满足了一系列产品内运行程序的普通需求,诸如:
- 协调辅助程序,协助应用程序整合,维护一对一“程序—镜像”模型。
- 挂载存储程序。
- 分布式机密信息。
- 检查程序状态。
- 复制应用实例。
- 负载均衡。
- 滚动更新。
- 资源监控。
- 访问并读取日志。
- 程序调试。
- 提供验证与授权。
2.kubernetes重要概念
了解和掌握kubernetes中的重要概念是非常有必要的。只有深入理解kubernetes的各个基本概念,才能掌握各个组件的功能,从而能够快速的部署和维护kubernetes。
2.1 Cluster(集群)
在kubernetes中,Cluster(集群)是计算、存储和网络资源的集合。kubernetes利用这些基础资源来运行各种应用程序。因此,Cluster是整个kubernetes容器集群的基础环境。
2.2Master(主控)
master(主控)是指集群的控制节点。在每个kubernetes集群中,都至少有一个master节点来负责整个集群的管理和控制。几乎所有的集群控制命令都是在master上面执行的。因此,master是整个集群的大脑。正因为master如此重要,所以为了实现高可用性,用户可以部署多个master节点。master节点可以是物理机,也可以是虚拟机。
通常来说,master上运行了下列关键的进程:
2.2.1kubernetes API Server(kubernetes API 服务器)
kubernetes API Server的进程名称为 kube-apiserver。kubernetes API Server提供了kubernetes 各类资源对象的增、删、改、查的HTTP Rest接口,是整个系统的数据总线和数据中心。kubernetes API Server 提供了集群管理的Rest API接口,包括认证授权、数据校验以及集群状态变更,提供了其他模块之间的数据交互和通信的枢纽,是资源配额控制的入口,拥有完备的集群安全机制。
2.2.2kubernetes Controller Manager(kubernetes 控制器管理器)
kubernetes Controller Manager 作为集群内部的管理控制中心,负责集群内的Node节点、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServerAccount)、资源配额(ResourceQuota)的管理。当某个Node节点宕机时,Controller Manager 会及时发现并执行自动化修复流程、确保集群始终处于预期的工作状态。
2.2.3kubernetes Scheduler(kubernetes 调度器)
kubernetes Scheduler 的作用是根据特定的调度算法把Pod 调度到指定的工作节点(Node)上,这一过程也叫绑定(Bind)。Scheduler的输入为需要调度的Pod 和 可以被调度的节点的信息,输出为调度算法选择Node节点,并将该Pod绑定到这个Node节点。
2.2.4Etcd
Etcd是kubernetes集群中十分重要的组件,用于保存集群所有的网络配置和对象的状态信息。
2.3 Node(节点)
在kubernetes中,除了Master节点之外,其他的节点都称为Node节点。与master节点不同,Node节点才是kubernetes中承担主要计算功能的工作节点。Node节点可以是一台物理机,也可以是虚拟机。
整个kubernetes集群中的Node节点协同工作,Master会根据实际情况将某些负载分配给各个Node节点。当某个Node节点出现故障时,其他的Node节点会替代其功能。
Node节点主要运行以下程序:
2.3.1 kubelet
在kubernetes集群中,每个Node节点都会启动kubelet进程,用来注册master节点下发到本节点的任务,管理Pod 和其中的容器。kubelet会在API Server上注册节点信息,定期向Master汇报节点资源的使用情况,并通过cAdvisor监控容器和节点资源。可以把kubelet理解成是一个代理进程,是Node节点上的Pod管家。
2.3.2 kube-proxy
kube-proxy运行在所有的Node 节点上,它监听每个节点上kubernetes API中定义的服务变化情况,并创建路由规则来进行服务负载均衡。
2.3.3 Docker 引擎
该Docker 引擎就是本书前面的Docker CE等服务引擎,负责容器的创建和管理等。
2.4 Pod
Pod 是kubernetes 是最基本的操作单元。一个Pod 中可以包含一个或多个紧密相关的容器,一个Pod 可以被一个容器化的环境看作应用层的逻辑宿主机。一个Pod中的多个容器应用通常是紧密耦合的,Pod在Node节点上被创建、启动或者销毁。每个Pod中运行着一个特殊的被称为Pause的容器,其他容器则为业务容器,这些容器共享pause容器的网络栈和Volume挂载卷,因此它们之间的通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。
同一个Pod里的容器之间仅需通过localhost就能互相通信。同一个Pod中的业务容器共享Pause容器的IP地址,共享Pause容器挂载的存储卷。
Pod是kubernetes是调度的基本工作单元,Master节点会以Pod为单位,将其调度到Node节点上。
2.5 服务
在kubernetes的集群中,虽然每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,这就引出了一个问题,如果有一组Pod组成了一个集群来提供服务,那么如何来访问它呢?通过服务即可。
一个服务可以看作一组提供相同服务的Pod的对外访问接口,服务作用于哪些Pod是通过标签选择器来定义的。服务通常拥有以下的特点:
- 拥有一个指定的名字,比如mysql-server。
- 拥有一个虚拟IP地址和端口号,销毁之前不会改变,只能内网访问。
- 能够提供某种远程服务能力。
- 被映射到了提供这种服务服务能力的一组容器应用上。
如果服务要提供外网服务,就需要指定公共IP的Node端口,或外部负载均衡器。
2.6 卷
默认情况下容器的数据都是非持久化的,在容器消亡之后数据也会跟着丢失,所以Docker提供了卷机制以便将数据持久化存储。类似的,kubernetes提供了更强大的卷机制和丰富的插件,解决了容器数据持久化和容器间共享数据的问题。
于docker不同,kubernetes卷的生命周期与Pod绑定。容器宕掉后kubelet再次重启容器时,卷的数据依然还在,而Pod被删除时,卷才会清理。数据是否丢失取决于具体的具体的卷类型,比如emptyDir 类型的卷实际上是一个临时的空目录,是Pod内多用户同享的一个目录。与Pod的生命周期一致,这个目录在Pod创建时创建,删除时删除。持久化存储卷为独立于计算资源的一种物理存储资源,不属于任何一个Node节点。因此,在Pod被删除时,不会丢失数据,除非人工将其删除。
2.7 命名空间
命名空间是kubernetes系统中的另一个重要概念,通过将系统内部的对象分配到不同的命名空间中,形成逻辑上的不同项目、小组或用户组,从而使得在共享整个集群的资源的同时还能分别管理它们。
kubernetes集群在启动后,会创建一个名为default的默认命名空间,如果不特别指明命名空间,那么用户创建的Pod,RC、服务都会被系统创建到默认的命名空间中。
当团队或项目中具有许多用户时,可以考虑使用命名空间来区分。在未来的kubernetes版本中,默认情况下,相同命名空间中的对象将具有相同的访问控制策略。