容器云平台No.1~基于Docker及Kubernetes构建的容器云平台

开篇

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

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

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

首先,介绍Docker,废话不多说,先上图

docker是什么?

根据官网的介绍,容器是把代码及其所有依赖打包的一个标准单元,你可以把这个程序从一个环境快速可靠的转移到另外一个环境。Docker镜像是一个轻量级的,独立的,可执行的软件包,其中就包含了运行程序所需要的一切。

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

docker的用途

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

docker的缺点以及为什么用kubernetes

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

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


Kubernetes是什么?

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

Kubernetes架构图

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架构图


ceph介绍

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

ceph架构图

下面就来了解下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中。

Flannel架构图

如过只是搭建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架构图

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

Prometheus Operator架构


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先不介绍,后续实战再说


总结

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

  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: 更多好文章,请关注首发微信公众号“菜鸟运维杂谈”!!!

原文地址:https://www.cnblogs.com/scofield666/p/13681346.html