##开篇
最近整理笔记,不知不觉发现关于kubernetes相关的笔记已经达99篇了,索性一起总结了。算是对这两年做容器云平台的一个总结,本文是开篇,先介绍下所有用到的组件。首先来看下架构图(实在画的太丑,求推荐工具)
如图,容器平台主要涉及的组件有:
- Docker
- Kubernetes
- Etcd
- Flannel
- Ceph
- Harbor
- Drone
- Promethues
- EFK
- GIT/SVN
- Ingress-nginx
- Dashboard(Lens)
##正所谓开局一张图,后面全靠编,哈哈,开干。。。
首先,介绍Docker,废话不多说,先上图
###docker是什么?
根据官网的介绍,容器是把代码及其所有依赖打包的一个标准单元,你可以把这个程序从一个环境快速可靠的转移到另外一个环境。Docker镜像是一个轻量级的,独立的,可执行的软件包,其中就包含了运行程序所需要的一切。
说白了就是把应用程序及其依赖打包到一个文件里,运行这个文件,就会生成一个虚拟容器。程序在里面运行就跟在物理机或者虚拟机上一样。~~~真拗口
###docker的用途
- 简化配置
- 代码流水线管理
- 提高开发效率
- 隔离应用
- 整合服务器
- 快速部署
- 提供一致性环境
- 提供弹性服务
###docker的缺点以及为什么用kubernetes
docker容器的轻量化,意味着在等量资源的基础上能创建出更多的容器实例。但是在面对分布在多台主机上且拥有数量很多容器(成百上千)的大规模应用程序时,传统的单机容器管理解决方案就会变得力不从心。另外,由于微服务越来越完善的原生支持,在一个容器集群中的容器粒度越来越小,数量越来越多。在这种情况下,都需要借助容器管理平台,从而实现调度,负载均衡以及任务分配等。
容器集群管理工具能在一组服务器上管理多容器组合成的应用,每个应用集群在容器编排工具看来是一个部署或管理实体,容器集群管理工具全方位为应用集群实现自动化,包括应用实例部署、应用更新、健康检查、弹性伸缩、自动容错等等。哈哈,好巧不巧,Kubernetes就提供了这些功能,这就是为什么我们要用Kubernetes的原因。
###Kubernetes是什么?
Kubernetes:Google 开源的容器管理系统,起源于Borg 系统。用于自动部署,扩展和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。
###Kubernetes的用途
- 服务发现与负载均衡
- 自我修复
- 自动化上线和回滚
- 配置管理
- 存储编排
- 批量执行
- Service拓扑
- 断点切片
- 自动装箱
- 水平扩缩
- 双协议栈
###Kubernetes的挑战
作为整个平台的核心,Kubernetes的功能强大,但是就其本身架构而言,学习成本不低。
- kubernetes概念太多,可能一个月也无法入门,甚至连集群都搭建不出来。
- 学习kubernetes对运维的技术能力要求比较高,和传统的运维有一定差异,需要有修改代码的能力。
- kubernetes的诞生,把运维从传统转向devops,需要面临的新技术很多。
- 但是当你掌握到了k8s的核心使用,就会受益匪浅。
###镜像仓库docker-registry & harbor
仓库,顾名思义,就是存放东西的地方,docker-registry,理所当然,就是存放docker镜像(image)的地方了。docker的仓库有公有仓库和私有仓库。共有仓库比如hub.docker.com,gcr.io,k8s.gcr.io等,一般下载速度比较慢,尤其k8s相关的镜像,得魔法上网。私有仓库一般是公司内部自行搭建,用于存放内部构建的docker镜像,部署服务时从私有仓库下载,速度很快。
harbor就是一个用于存储docker镜像的企业级Registry服务。相比较于原生的Regisrty来说,它具有很多的优势。
- 提供分层传输机制,优化网络传输
- 提供WEB界面,优化用户体验
- 支持水平扩展集群
- 良好的安全机制
- Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制
###ceph介绍
在能对kubernetes提供存储服务的众多服务当中,ceph的优势在于提供了多样化的存储方式,包括对象存储,块存储,文件系统三种。ceph作为一个统一的分布式存储系统,提供了高性能,高可用性,搞扩展性。对于kubernetes来说,作为基础服务,这些特性是必不可少的。
下面就来了解下ceph的几大特性:
- 高性能
采用CRUSH算法,数据分布均衡,并行度高。
容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
能够支持上千个存储节点的规模,支持TB到PB级的数据。 - 高可用性
副本数可以灵活控制。
支持故障域分隔,数据强一致性。
多种故障场景自动进行修复自愈。
没有单点故障,自动管理。 - 高可扩展性
去中心化。
扩展灵活。
随着节点增加而线性增长。 - 支持三种存储接口:块存储、文件存储、对象存储
- 支持自定义接口,支持多种语言驱动
当然了,ceph作为独立的系统,可以部署到裸机上,也可以部署到kubernetes集群。
PS:如果用的公有云部署kubernetes,可以直接使用公有云提供的存储服务,简单省事。
ceph介绍完,再来介绍另一个存储etcd
###ETCD介绍
Etcd作为kubernetes的存储核心,作为保存 Kubernetes 所有集群数据的后台数据库。etcd 是兼具一致性和高可用性的键值数据库。
etcd架构图
etcd有以下的特点:
- 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
- 安全:支持SSL证书验证
- 快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作
- 可靠:采用raft算法,实现分布式系统数据的可用性和一致性
为了保证数据的高可用,一般情况下都使用奇数节点的集群。
接下来,介绍kubernetes集群的网络插件
###Flannel介绍
Flannel: CoreOS 开源的网络方案,为 kubernetes 设计,功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。Flannel的底层通信协议的可选余地有很多,比如UDP、VXlan、AWS VPC等等,不同协议实现下的网络通信效率相差较多,默认为使用UDP协议,部署和管理简单。
Flannel的后台数据也存储于ETCD中。
如过只是搭建kubernetes集群环境,以上组件就足够了,下面继续介绍的组件,主要是基于kubernetes之上的应用,主要用于构建流水线,监控集群,日志分析。
###drone介绍
开始之前,先介绍两个概念:CI和CD
什么是CI/CD
持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都需要通过自动化的编译、发布、自动化回归测试来验证,从而尽快地发现集成错误。而这些自动化的操作则由CI软件进行执行。
持续部署(Continous Delivery,CD)在持续集成的基础上,将集成后的代码部署到真实运行环境中(本文指部署到kubernetes集群)。交付团队 ->版本控制 ->构建和单元测试 ->自动验收测试 -> 发布
什么是Drone
Drone 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试、构建、发布。每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔离。开发者只需在项目中包含 .drone.yml文件,将代码推送到 git 仓库,Drone就能够自动化的进行编译、测试、发布。
###prometheus-operator
Prometheus:一个非常优秀的监控工具或者说是监控方案。它提供了数据搜集、存储、处理、可视化和告警一套完整的解决方案。作为kubernetes官方推荐的监控系统,用Prometheus来监控kubernetes集群的状况和运行在集群上的应用运行状况。
那Prometheus Operator是做什么的呢?
Operator是由CoreOS公司开发的,用来扩展 Kubernetes API,特定的应用程序控制器,它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统。
可以理解为,Prometheus Operator就是用于管理部署Prometheus到kubernetes的工具,其目的是简化和自动化对Prometheus组件的维护。
###EFK介绍
EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案。
通过EFK,可以把集群的所有日志收集到Elasticsearch中,然后可以对日志做分析。一般用于故障排查,数据分析等。。。
###Dashboard介绍
kubernetes的Dashboard有很多,官方Dashboard,rancher, kuboard, octant, Lens等等,这里只简单介绍Lens
Lens 一个开源的管理 Kubernetes 集群的IDE,支持 MacOS, Windows 和 Linux。通过 Lens,我们可以很方便地管理多个 Kubernetes 集群。
最后GIT/SVN和Ingress-nginx先不介绍,后续实战再说
###总结
至此,容器云平台的所有组件都基本做了个介绍,现在从使用者的角度,简单梳理流程:
- 开发人员向git(gitlab/github/gogs)提交代码,代码中必须包含Dockerfile和.drone.yml文件
- 将代码commit到远程仓库
- 发布应用时需要填写服务类型、服务名称、资源数量、实例个数等信息,确定后触发drone自动构建
- Drone的CI流水线自动编译代码并打包成docker镜像推送到Harbor镜像仓库
- Drone的CI流水线中包括了自定义脚本,根据准备好的kubernetes的YAML模板,将其中的变量替换成用户输入的选项
- 生成应用的kubernetes YAML配置文件
- 更新Ingress的配置,根据新部署的应用的名称,在ingress的配置文件中增加一条路由信息
- 更新DNS,向其中插入一条DNS记录,IP地址是ingress节点的IP地址。
- Drone的CI流水线中包括了自定义脚本调用kubernetes的API,部署应用。
PS:整理+排版花了好几天,我真是太难了%#¥@@~¥!……#……太难了~~~~
下一篇,发实战水文&……%¥#@!
Tips: 更多好文章,首发公X众X号“菜鸟运维杂谈”!!!