伸手摘星,即使一无所获,亦不致满手污泥。
请关注公众号:星河之码
提到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提供了以下多种功能
以下参考至官方社区文档: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移动到另一个节点,数据将一直保留,直到用户删除它