##开篇
最近整理笔记,不知不觉发现关于kubernetes相关的笔记已经达99篇了,索性一起总结了。算是对这两年做容器云平台的一个总结,本文是开篇,先介绍下所有用到的组件。首先来看下架构图(实在画的太丑,求推荐工具)
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第1张图片

如图,容器平台主要涉及的组件有:

  • Docker
  • Kubernetes
  • Etcd
  • Flannel
  • Ceph
  • Harbor
  • Drone
  • Promethues
  • EFK
  • GIT/SVN
  • Ingress-nginx
  • Dashboard(Lens)

##正所谓开局一张图,后面全靠编,哈哈,开干。。。

首先,介绍Docker,废话不多说,先上图
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第2张图片
###docker是什么?
根据官网的介绍,容器是把代码及其所有依赖打包的一个标准单元,你可以把这个程序从一个环境快速可靠的转移到另外一个环境。Docker镜像是一个轻量级的,独立的,可执行的软件包,其中就包含了运行程序所需要的一切。

说白了就是把应用程序及其依赖打包到一个文件里,运行这个文件,就会生成一个虚拟容器。程序在里面运行就跟在物理机或者虚拟机上一样。~~~真拗口

###docker的用途

  1. 简化配置
  2. 代码流水线管理
  3. 提高开发效率
  4. 隔离应用
  5. 整合服务器
  6. 快速部署
  7. 提供一致性环境
  8. 提供弹性服务

###docker的缺点以及为什么用kubernetes
docker容器的轻量化,意味着在等量资源的基础上能创建出更多的容器实例。但是在面对分布在多台主机上且拥有数量很多容器(成百上千)的大规模应用程序时,传统的单机容器管理解决方案就会变得力不从心。另外,由于微服务越来越完善的原生支持,在一个容器集群中的容器粒度越来越小,数量越来越多。在这种情况下,都需要借助容器管理平台,从而实现调度,负载均衡以及任务分配等。

容器集群管理工具能在一组服务器上管理多容器组合成的应用,每个应用集群在容器编排工具看来是一个部署或管理实体,容器集群管理工具全方位为应用集群实现自动化,包括应用实例部署、应用更新、健康检查、弹性伸缩、自动容错等等。哈哈,好巧不巧,Kubernetes就提供了这些功能,这就是为什么我们要用Kubernetes的原因。


###Kubernetes是什么?
Kubernetes:Google 开源的容器管理系统,起源于Borg 系统。用于自动部署,扩展和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。

Kubernetes架构图
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第3张图片

###Kubernetes的用途

  1. 服务发现与负载均衡
  2. 自我修复
  3. 自动化上线和回滚
  4. 配置管理
  5. 存储编排
  6. 批量执行
  7. Service拓扑
  8. 断点切片
  9. 自动装箱
  10. 水平扩缩
  11. 双协议栈

###Kubernetes的挑战
作为整个平台的核心,Kubernetes的功能强大,但是就其本身架构而言,学习成本不低。

  1. kubernetes概念太多,可能一个月也无法入门,甚至连集群都搭建不出来。
  2. 学习kubernetes对运维的技术能力要求比较高,和传统的运维有一定差异,需要有修改代码的能力。
  3. kubernetes的诞生,把运维从传统转向devops,需要面临的新技术很多。
  4. 但是当你掌握到了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提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制

harbor架构图
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第4张图片


###ceph介绍
在能对kubernetes提供存储服务的众多服务当中,ceph的优势在于提供了多样化的存储方式,包括对象存储,块存储,文件系统三种。ceph作为一个统一的分布式存储系统,提供了高性能,高可用性,搞扩展性。对于kubernetes来说,作为基础服务,这些特性是必不可少的。

ceph架构图
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第5张图片

下面就来了解下ceph的几大特性:

  • 高性能
    采用CRUSH算法,数据分布均衡,并行度高。
    容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
    能够支持上千个存储节点的规模,支持TB到PB级的数据。
  • 高可用性
    副本数可以灵活控制。
    支持故障域分隔,数据强一致性。
    多种故障场景自动进行修复自愈。
    没有单点故障,自动管理。
  • 高可扩展性
    去中心化。
    扩展灵活。
    随着节点增加而线性增长。
  • 支持三种存储接口:块存储、文件存储、对象存储
  • 支持自定义接口,支持多种语言驱动

当然了,ceph作为独立的系统,可以部署到裸机上,也可以部署到kubernetes集群。
PS:如果用的公有云部署kubernetes,可以直接使用公有云提供的存储服务,简单省事。

ceph介绍完,再来介绍另一个存储etcd


###ETCD介绍
Etcd作为kubernetes的存储核心,作为保存 Kubernetes 所有集群数据的后台数据库。etcd 是兼具一致性和高可用性的键值数据库。

etcd架构图

容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第6张图片

etcd有以下的特点:

  • 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
  • 安全:支持SSL证书验证
  • 快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作
  • 可靠:采用raft算法,实现分布式系统数据的可用性和一致性

为了保证数据的高可用,一般情况下都使用奇数节点的集群。

接下来,介绍kubernetes集群的网络插件


###Flannel介绍
Flannel: CoreOS 开源的网络方案,为 kubernetes 设计,功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。Flannel的底层通信协议的可选余地有很多,比如UDP、VXlan、AWS VPC等等,不同协议实现下的网络通信效率相差较多,默认为使用UDP协议,部署和管理简单。
Flannel的后台数据也存储于ETCD中。

Flannel架构图
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第7张图片

如过只是搭建kubernetes集群环境,以上组件就足够了,下面继续介绍的组件,主要是基于kubernetes之上的应用,主要用于构建流水线,监控集群,日志分析。


###drone介绍
开始之前,先介绍两个概念:CI和CD

什么是CI/CD

持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都需要通过自动化的编译、发布、自动化回归测试来验证,从而尽快地发现集成错误。而这些自动化的操作则由CI软件进行执行。

持续部署(Continous Delivery,CD)在持续集成的基础上,将集成后的代码部署到真实运行环境中(本文指部署到kubernetes集群)。交付团队 ->版本控制 ->构建和单元测试 ->自动验收测试 -> 发布

什么是Drone
Drone 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试、构建、发布。每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔离。开发者只需在项目中包含 .drone.yml文件,将代码推送到 git 仓库,Drone就能够自动化的进行编译、测试、发布。

流程如图
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第8张图片


###prometheus-operator
Prometheus:一个非常优秀的监控工具或者说是监控方案。它提供了数据搜集、存储、处理、可视化和告警一套完整的解决方案。作为kubernetes官方推荐的监控系统,用Prometheus来监控kubernetes集群的状况和运行在集群上的应用运行状况。

Prometheus架构图
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第9张图片

那Prometheus Operator是做什么的呢?
Operator是由CoreOS公司开发的,用来扩展 Kubernetes API,特定的应用程序控制器,它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统。
可以理解为,Prometheus Operator就是用于管理部署Prometheus到kubernetes的工具,其目的是简化和自动化对Prometheus组件的维护。

Prometheus Operator架构
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第10张图片


###EFK介绍
EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案。
通过EFK,可以把集群的所有日志收集到Elasticsearch中,然后可以对日志做分析。一般用于故障排查,数据分析等。。。

数据流程图
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第11张图片


###Dashboard介绍
kubernetes的Dashboard有很多,官方Dashboard,rancher, kuboard, octant, Lens等等,这里只简单介绍Lens

Lens 一个开源的管理 Kubernetes 集群的IDE,支持 MacOS, Windows 和 Linux。通过 Lens,我们可以很方便地管理多个 Kubernetes 集群。

直接上图,自己体验,效果更佳。
容器云平台No.1~基于Docker及Kubernetes构建的容器云平台_第12张图片

最后GIT/SVN和Ingress-nginx先不介绍,后续实战再说


###总结
至此,容器云平台的所有组件都基本做了个介绍,现在从使用者的角度,简单梳理流程:

  1. 开发人员向git(gitlab/github/gogs)提交代码,代码中必须包含Dockerfile和.drone.yml文件
  2. 将代码commit到远程仓库
  3. 发布应用时需要填写服务类型、服务名称、资源数量、实例个数等信息,确定后触发drone自动构建
  4. Drone的CI流水线自动编译代码并打包成docker镜像推送到Harbor镜像仓库
  5. Drone的CI流水线中包括了自定义脚本,根据准备好的kubernetes的YAML模板,将其中的变量替换成用户输入的选项
  6. 生成应用的kubernetes YAML配置文件
  7. 更新Ingress的配置,根据新部署的应用的名称,在ingress的配置文件中增加一条路由信息
  8. 更新DNS,向其中插入一条DNS记录,IP地址是ingress节点的IP地址。
  9. Drone的CI流水线中包括了自定义脚本调用kubernetes的API,部署应用。

PS:整理+排版花了好几天,我真是太难了%#¥@@~¥!……#……太难了~~~~
下一篇,发实战水文&……%¥#@!

Tips: 更多好文章,首发公X众X号“菜鸟运维杂谈”!!!