什么是容器技术?

容器(Container)是一种更轻量级,更灵活的虚拟化处理方式,它将一个应用程序所需的一切打包在一起。容器包括所有代码,数据库、缓存等各种依赖甚至操作系统,这让应用程序几乎在任何地方都可以运行。因此它的诞生,解决了一个重要问题:如何确保应用程序从一个环境移动到另一个环境的正确运行。它只是虚拟了操作系统,而不像虚拟机一样去虚拟底层计算机。

容器技术的特点

  • 可移植性

目前容器技术的现代形式主要体现在应用程序容器化(如 Docker)和系统容器化(如 LXC)中。这两种形式的容器都能让 IT 团队从底层架构中抽象出程序代码,从而实现跨各种部署环境的可移植性。

  • 轻量级

容器通常位于物理服务器及其主机操作系统之上。它可以通过单个操作系统安装来运行多个工作环境。因此容器特别 “轻” —— 它们只有几兆字节,只需几秒钟即可启动。

  • 降低成本

与虚拟机相比,内存,CPU 和存储效率的提高是容器技术的关键优势。由于可以在同一基础架构上支持更多容器,那么这些资源的减少就可以转化为巨大的成本节省,同时还可以减少管理开销。

为什么要使用容器云平台?

节约服务器资源。

微服务作为一个新兴的软件架构,和容器技术也有着密不可分的关系。微服务就是把一个大型的单个应用程序和服务拆分为数十个小型的服务。一个微服务的策略可以让工作变得更为简便,它最大的一个优点是可以比传统的应用程序更有效地利用计算资源。
大多数服务都有不同的资源要求。无论是网络,磁盘,CPU 还是内存,某个资源会比其他资源使用得更多。虽然云供应商可以提供针对内存,磁盘 IO 或 CPU 的不同设置,但系统仍然会留下大量的冗余资源。
image.png
有了微服务,混合具有不同资源分配配置文件的服务可以提供最佳利用率。
image.png
由于微服务类似于小型应用程序,因此我们必须将微服务部署到自己的虚拟机实例。可以想象,将整个虚拟机专门用于部署应用程序的一小部分并不是最有效的选择。但是,使用容器技术,可以降低性能开销并在同一台服务器部署上千个微服务,因为容器比虚拟机需要的计算资源要少得多。微服务进行容器化是很有必要的。它可以提高利用率和可用性,降低成本。

解决微服务架构的复杂性

目前豫信电科信息化项目已经构建了十几个服务,服务的管理、服务之间的通信,服务发现、负载均衡、服务的日志收集、服务状态监控。会给开发运维人员带来巨大负担。容器云平台通过服务编排可以可视化的管理服务依赖、和服务监控和日志收集问题。
image.png

应用一键快速部署,一键备份。

采用传统的方式部署应用只能解决少量应用的部署问题,一旦服务过多,应用的备份、迁移和发布问题将会是一个麻烦问题。使用容器云平台可以做到灰度发布,一键备份,导入导出。

应用快速横向扩展 。

容器云平台能对应用程序的各个部分进行横向扩展。流量会自动在各个 Pod 间路由和分配,可以自动为你缩放 Pod 。特别适用于有一个或多个热点组件需要处理突发事件,如秒杀,抢购等场景。

上云策略

1. 渐进式上K8s;

  • 特定项目。选择即将要开发的新项目,简单一点的项目,没有迁移成本。
  • 特定完整团队。项目的leader需要有新技术的探索精神,项目中核心成员也有新技术的探索精神。关于特定团队,团队中的研发人员、测试人员、运维人员都需要从一开始就直接或间接使用K8s。直接是上原生K8s,间接是指通过第三方平台上K8s。
    笔者曾经碰到很多上了K8s的客户,推进得都无比艰难!除了上述的诸多的难题之外,还有一个最重要的原因——这些客户上K8s是先从运维部门开始。这些客户认为,正是因为K8s如此复杂和不确定性高,所以引入第三方的产品或解决方案,先从一个部门开始使用,再逐步推广到研发部门。而现实是:K8s是涉及研发、测试、运维的整体协作方式变革,引入第三方的产品或解决方案时,要么是研发测试人员没有参与,要么是没有深度参与,导致在推广时,第三方的产品或解决方案不被研发测试人员接受。

  • 测试环境。项目先在测试环境以K8s方式部署。

取得成功之后,再扩展至生产环境、其他项目、其他团队。这样的方式,有利于团队积累对K8s的自信心。取得一定的广度成功的同时,在深度上也可以做一定的探索,比如,使用K8s配套的测试工具、运维工具,甚至采用一些开源项目的CRD,比如Open Kruise。甚至编写自己公司特有的CRD。

2. 人员分工 + 第三方产品解决复杂性。

人类解决复杂性有2个非常重要的手段:分工、封装。这里就不举例子了,在IT领域,这两个手段的例子俯拾皆是。具体到上K8s体现为:

  • 人员分工是指不需要整个团队的人都懂K8s,只需要特定的一两个人懂K8s,研发人员、测试人员只需配合相关的工作,由这一两个人来编写Dockerfile、K8s yaml,也可以由这一两个人写好脚本,开发人员和测试人员直接调用脚本,传递合适参数。
  • 封装。采用开源的工具来封装操作复杂性,提供了Web UI,比如:rainbond、Rancher、KubeSphere等;

    如何选型?

    Rainbond

1、可视化运维,减少K8S使用门槛、服务的管理、日志查看都可以在浏览器中操作,屏蔽掉K8S的复杂性。
image.png
2、应用商店、统一展示宣传集团核心能力,一键部署、一键试用。
image.png
3、细粒度的资源管理、应用动态扩缩容。
image.png

已解决问题

1、应用偶尔无法解析公网域名、
两个coreDns服务有一个没有正常运行
2、应用无法访问互联网
K8S集群中有一台黄河云互联网权限被关闭了
3、集群访问迟钝,应用无法运行和启动
K8S负载过高。关闭应用后无法恢复,需重启K8S。
4、修改reslov.conf文件不生效
直接修改coredns组件添加114.114.114.114的DNS地址

目前为止遇到的4个问题中有3个都和网络相关,所以网络问题是K8S的重中之重,需要仔细学习。

风险点

1、K8S 集群的部署、配置和运维工作。
2、传统应用上容器云平台的改造工作(部分依赖组件需改造适应分布式环境)

解决方案

1、K8S的运维人员技术支持
2、原有历史项目容器化做到快速部署SaaS化

案例

咸阳市大数据管理局使用Rainbond作为智慧城市底座的实践