「伸手摘星,即使一无所获,亦不致满手污泥」。
「请关注公众号:星河之码」
提到Kubernetes,第一个想到的就是容器编排,那么容器编排究竟是做什么的呢,它又是怎么做的呢,Kubernetes又是怎么做到容器编排呢?带着这些问题来认识一下Kubernetes
一、容器编排
「容器技术的核心概念是容器、镜像、仓库,使用这三大基本要素就可以轻松地完成应用的打包、分发工作,实现【一次开发,到处运行】的作用」。
随着服务集群里规模越来越大的时候,服务发现、负载均衡、状态监控、健康检查、扩容缩容、应用迁移、高可用等不在是几个进程的管理,而是成百上千的进程之间互相通信、互相协作的问题。
这些容器的管理,调度也就是我们常说的「容器编排:用于管理容器化的工作负载和服务,可促进声明式配置和自动化」。

能够定义容器组织和管理规范的工具,典型的是 Docker公司的 Compose+Swarm 组合,以及 Google 与 RedHat 公司共同主导的 Kubernetes 项目。
二、什么是 Kubernetes
Kubernetes简称 K8s,是Google开源的工业级的容器编排平台,也是目前主流的容器编排项目。
「Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI」 (容器运行环境接口)。

「Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化」。
「kubernetes官网地址」
#国外网站,访问速度较慢。
https://kubernetes.io/「kubernets中文社区地址」
https://www.kubernetes.org.cn/
「Kubernetes是一个用于在集群环境中管理容器化应用程序的开源系统。以正确的方式使用Kubernetes 可以帮助DevOps作为一个服务团队自动扩展应用程序,并在零停机的情况下进行更新」。
三 Kubernetes 的架构
在Docker中有一个用于集群管理的Docker-swarm,Docker-swarm中有两种节点,管理节点(manager)和工作节点(worker),Kubernetes 与Docker-swarm类似,同样也有两种节点:管理节点(master)和工作节点(worker)。
「一个 Kubernetes 集群包含 集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的 容器化应用。集群具有至少一个工作节点和至少一个主节点」。
「主节点管理集群中的工作节点和 Pod ,多个主节点用于为集 群提供故障转移和高可用性」 。
「工作节点托管作为应用程序组件的 Pod」。

通过上图,可以看出在k8s种的master节点主要有四个组件:
「Controller Manager: 负责容器编排」 「API Server: 负责 API 服 务」 「Scheduler: 负责调度」 「Etcd: 整个集群的持久化数据」
「用户通过kubectl调用API Server,从而调用worker中的容器执行任务」,下面通过一张图来看看这些组件

通过上述这张图可以看到,Kubernetes 分为两个部分:Control Plane Components,Kubernetes Nodes
3.1 控制平面组件(Control Plane Components)
「控制平面组件也就是我们说的master节点,它由四部分组成,负责集群的全局决策(调度、编排)工作,以及检测和响应集群事件」
全局决策:集群的调度、编排等工作
检测和响应集群事件:当不满足部署的 replicas 字段时,启动新的 pod等工作
「控制平面组件可以在集群中的任何节点上运行」。
通常会在同一个计算机 上启动所有控制平面组件,并且不会在此计算机上运行用户容器。这个跟docker-Swarm的manager节点一样
3.1.1 kube-Controller-Manager
「kube-Controller-Manager其实是 Controller Manager的组成之一」。
「Controller Manager」
「Controller Manager由kube-controller-manager和cloud-controller-manager组成,是 Kubernetes的大脑,它通过api-server监控整个集群的状态,并确保集群处于预期的工作状态」。
「kube-controller-manager」
由一系列的控制器组成,像Replication Controller控制副 本,Node Controller节点控制,Deployment Controller管理deployment等等
「cloud-controller-manager」
运行与基础云提供商交互的控制器,在 Kubernetes 1.6 版本中引入的 alpha 功能
cloud-controller-manager 允许云供应商的代码和 Kubernetes 代码彼此独立地发展
在Kubernetes启用Cloud Provider的时候才需要,用来配合云服务提供 商的控制,现在用的很少
一般在 kube-controller-manager 中会禁用,在启动 kube-controller-manager 时将 --cloud-provider 参数设置为 external 来禁用此控制器
3.1.2 kube-API-Server
「Kubernetes最重要的核心组件之一,在主节点上负责提供 Kubernetes API 服务的组件,它是 Kubernetes 控制面的前端,通过它主节点可以调度工作节点」
提供集群管理的REST API接口,包括认证授权,数据校验以及集群状态变更等
提供其他模块之间的数据交互和通信的枢纽
其他模块通过API Server查询或修改数据,只 有API Server才直接操作etcd
生产环境可以为apiserver做负责均衡,通过部署多个实例可以实现扩缩。
3.1.3 kube-scheduler
「kube-scheduler负责分配调度Pod到集群内的节点上,监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分配节点」。
3.1.4 Etcd
「Etcd是兼具一致性和高可用性的键值数据库,用来保存 Kubernetes 所有集群数据的后台数据库」
「kubernetes的节点信息,组件信息,通过kubernetes运行 的pod,deployment,service等都需要持久化,etcd就是存储这些数据的数据中心」。
etcd可以部署在kubernetes每一个节点。组成etcd集群。
生产环境中为了保证数据中心的高可用和数据的一致性,一般会部署最少三个节点,开发环境可以指部署master节点
kubernetes也可以直接使用外部etcd服务
3.1.5 kubectl
「kubectl是Kubernetes的命令行工具,是Kubernetes用户和管理员必备的管理工具。kubectl提供了大量的子命令,方便管理Kubernetes集群中的各种功能」。
部署在master节点上的,是主节点上的组件。
3.2 Node 组件(Kubernetes Nodes)
3.2.1 kubelet
「一个在集群中每个节点上运行的代理。一个在集群中每个工作节点上都运行一个kubelet服务进程,默认监听10250端口,接收并执行master发来的指令,管理Pod及Pod中的容器。每个kubelet进程会在API Server上注册节点自身信息,定期向master节点汇报节点的资源使用情况,并通过cAdvisor监控节点和容器的资源」。
3.2.2 kube-proxy
「一个在集群中每台工作节点上都应该运行一个kube-proxy服务,它监听API server中service 和endpoint的变化情况,并通过iptables等来为服务配置负载均衡,它保证服务在集群外可以被访问到」。
四、Kubernetes能做什么
我们通过容器可以实现程序的打包和运行,但是当一个容器故障之后,如何快速启动另一个容器,当流量增大或者减小时,如何快速的实现容器的扩容与缩容等等问题都是Kubernetes为我们做的事情。
「Kubernetes 提供了一个可弹性运行分布式系统的框架。能够满足应用的扩展、故障转移、部署模式(Canary 部署)等」。k8s提供了以下多种功能
以下参考至官方社区文档:https://www.kubernetes.org.cn/
「服务发现和负载均衡」
Kubernetes 可以使用 DNS 名称或自己的 IP 地址来曝露容器。如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
「存储编排」
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
「自动部署和回滚」
可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。
例如:可以自动化 Kubernetes 来创建新容器, 删除现有容器并将它们的所有资源用于新容器。
「自动完成装箱计算」
Kubernetes 允许指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来为容器分配资源。
「自我修复」
Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
「密钥与配置管理」
Kubernetes 允许存储和管理敏感信息,
例如密码、OAuth 令牌和 ssh 密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
Kubernetes不是我们理解的云原生的 PaaS(平台即服务)系统,Kubernetes 是在容器级别运行,而非在硬件级别。
它只是提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡、日志记录和监视。
五、kubernetes与docker-swarm对比
5.1 Docker Swarm的优点
「以更快的速度运行」
Docker Swarm 通过管理节点,可以让应用程序在虚拟和软件定义的环境中快速运行
「文档全面」
Docker正在快速发展,Docker团队在文档方面非常突出,只要Docker Swarm有了更新,相应文档将确保更新了所有信息。
某些项目如果平台的一个版本在短时间间隔内发布,有些平台可能不维护文档。
「提供简单快速的配置」
Docker Swarm可以让用户自己配置,将其放入代码中并轻松部署,由于Docker Swarm可以在各种环境中使用,因此不受应用程序环境的约束。
「确保应用程序隔离」
Docker Swarm将每个容器与其他容器隔离,并拥有自己的资源,可以在不同的堆栈中运行单独的应用程序。
「版本控制和组件重用」
Docker Swarm可以跟踪容器的连续版本、检查差异或回滚到前面 的版本。容器重用来自前一层的组件,这使得它们非常轻量级。
5.2 Docker Swarm的缺点
「Docker依赖于平台,跨平台支持效果差」
「Docker Swarm是一个为Linux设计的平台」。
虽然Docker支持Windows和Mac OS X,但它要使用虚拟机在非linux平台上运行。设计为在Windows上的Docker容器中运行的应用程序不能在Linux上运行,反之亦然。
「没有提供存储选项」
Docker Swarm不提供将容器连接到存储的简便方法,它的数据存储需要对主机进行大量的改进和手动配置。
「监控信息不足」
Docker Swarm用Stats命令提供关于容器的基本信息,除此之外Docker Swarm无法对Docker集群提供更加全面的监控
5.3 kubernetes的优点
基于以上Docker Swarm的缺点,kubernetes弥补了她的不足,「kubernetes是一个自动化容器部署、扩展和管理平台」,其优点如下
「速度快」
Kubernetes能够完美的在不停机的情况下持续部署新功能,K8S的目标是以【恒定的正常运行时间】更新应用程序。
「遵循不可变基础架构的原则」
在不可变的基础架构中,如果想要更新任何应用程序,需要使用新标记构建容器映像并部署它
简单点说就是打一个tag,然后部署,这样万一出问题,可以及时回滚。
「提供声明式配置」
用户可以通过声明式配置知道系统应该处于什么状态以避免错误。
源代码控制、单元测试等传统 工具不能与命令式配置一起使用,但可以与声明式配置一起使用。
「大规模部署和更新软件」
Kubernetes具有不可变的声明性,扩展很容易,提供了一些用于扩展目的的功能
「水平基础架构扩展」
在单个服务器级别执行操作以应用水平扩展。可以很轻松的添加或分离服务器。
「自动扩展」
根据CPU资源或其他应用程序指标的使用情况,可以更改正在运行的容器数。
「手动扩展」
可以通过命令或界面手动扩展正在运行的容器的数量
「复制控制器」
复制控制器确保集群在运行状态下具有指定数量的等效pod。
如果存在太多pod,则复制控制器可以删除额外的pod,反之亦然。
「处理应用程序的可用性」
Kubernetes会自动检查节点和容器的运行状况,当发生错误导致的容器崩溃时提供自我修复和自动替换。并且K8S可以在多个pod之间分配负载,平衡资源。
「存储卷」
在K8S中,数据是在容器之间共享的,但是如果pod被杀死,则自动删除卷。
K8S数据是远程存储的,因此如果将pod移动到另一个节点,数据将一直保留,直到用户删除它




