写点什么

向 Kubernetes 容器云平台迁移,你必须知道的 9 件事

  • 2020-04-22
  • 本文字数:2964 字

    阅读完需:约 10 分钟

向Kubernetes容器云平台迁移,你必须知道的9件事

摘要

本文作者为当当网数字业务事业部技术总监李志伟,文章分享了当当网在 Kubernetes 领域的实践和经验,分别介绍了将原应用迁移到 Kubernetes 的前期准备以及迁移过程中使用的规范。

现有平台面临的挑战

不同企业开始往容器方向发展的初衷是不一样的,有些企业是因为没有运维工程师或运维团队,而想要借助某个平台实现运维自动化。


有些企业可能是由于计算资源的利用率比较低。虽然一些大型的互联网公司都是动辄拥有成千上万台服务器,但实际上以我个人的经历来看计算资源的利用率都不高,这里有很多历史的原因,其中之一就是为了获得更好的隔离性,而实现隔离最好的办法就是采用从物理机到基于虚拟的私有云技术。


对于有着比较长历史的公司,应用部署往往会和本地的运行环境强相关,使得迁移变得非常困难,这时也需要有一个好的解决方案来解耦。另外业务总量的繁多,也会带来管理的复杂度的提高。

为什么选择 Kubernetes

上面提到的这些问题在我们的生产实践中都有不同程度的遇到,虽然有很多的解决方案,但是我们最终还是选择了 Kubernetes。


Kubernetes 首要解决了计算资源利用率低下的问题,得益于此我们的服务器数量减少了一半。容器化解决了计算资源利用率问题。


业务容器镜像一次构建,就能够运行在多种环境上,这种方式减少了对运行环境的以来,给运维平台带来了足够的灵活性,解决了服务商锁定的问题,我们当时考虑的是如果某个 IDC 服务商不满足服务要求如何做到快速迁移,一般来说大批量的服务迁移代价非常高,需要很长时间,容器化之后业务迁移时间只需要 30 分钟左右。


通过 Kubernetes 的架构设计思想我们还可以规范网站系统的架构设计。最后还有一点就是它实现了运维自动化。

向容器云平台迁移前的准备工作

要想向容器云迁移,企业内部需要一定的运维能力,如果企业的规模还不够大,也可以考虑一些国内的容器云服务提供商。下面来说下我们自己所做的一些准备工作。


首先自然是搭建 Kubernetes 集群,私有 Docker 镜像仓库构建采用的是 harbor,然后是独立出来的集群监控,CI/CD 基础设置使用的是 Jenkins 和 helm,分布式存储解决方案用的是 Glusterfs。

业务迁移中使用的规范

从 2015 年底 1.0 版到之后的 1.2、1.3 版 Kubernetes 中的问题还是比较多的,企业要使用它是需要一定勇气的。但现在基本上趋于成熟,对于大部分应用不用太多的改造也可以跑的很好。


即使是这样,也不是所有的应用都可以迁移到容器云中,如果应用能够很好的符合云原生的设计原则当然可以迁移进来,但是大部分的应用并不是按照这样的设计原则设计的。这个时候最好的办法是先将业务迁移进来,然后再逐步演进成微服务架构。


在这个过程中我们刚开始其实也没有任何规范,之后才陆续制定了相关规范,下面来具体看下迁移规范。

容器镜像封装的基本原则

早期很多系统架构师都将 Docker 当做轻量级的虚拟机在使用,但这并不是最佳实践,要想正确的使用 Docker 需要符合以下基本原则:


  • 尽可能设计成无状态服务,它带来的好处就是能够非常容易的做水平扩展

  • 尽可能消除不必要的运行环境依赖,如果容器内业务依赖太多水平扩展就会变的非常困难,在传统的部署形式下,无论是虚拟机部署还是物理机部署都经常会产生各种各样没必要的依赖,对于有一定历史的企业这个问题就会非常严重

  • 需要持久化的数据写入到分布式存储卷

  • 尽可能保证业务单一性,这样能够让分布式应用很容易扩展,同样它也是微服务架构中的设计原则

  • 控制输出到 stdout 和 stderr 的日志写入量

  • 配置与容器镜像内容分离

  • 容器中使用 K8S 内部 dns 代替 ip 地址配置形式

  • 日志采用集中化处理方案(EFk)

  • 采用独立的容器处理定时任务

NameSpace 的使用

由于考虑到测试环境和 staging 等运行环境的资源利用率并不高,所以就想在一个集群内部同时运行开发、测试、staging、生产环境。通过 NameSpace 实现不同运行环境的隔离,同时应用软件在不同的运行环境之间也不会产生命名冲突。

Service 的命名规范

在 v1.5 版之前 Service 的命名不能超过 24 个字符,v1.5 版之后最多 63 个字符。另外还需要满足正则 regexa-z?的要求,这意味着首字母必须是 a-z 的字母,末字母不能是-,其他部分可以是字母数字和-符号。一般来说命名方式都是使用“业务名-应用服务器类型-其他标识”的形式,如 book-tomcat-n1、book-mysql-m1 等。

应用健康检查规范

应用健康检查规范是实现自动化运维的重要组成部分,也是系统故障自动发现和自我恢复的重要手段。目前有两种健康检查方式,分别是进程级和业务级。


进程级健康检查是 Kubernetes 本身具备的,它用来检验容器进程是否存活,是默认开启的。


业务级的健康检查由我们自己实现,它有三点要求,一是必须要检查自身核心业务是否正常,二是健康检查程序执行时间要小于健康检查周期,三是健康检查程序消耗资源要合理控制,避免出现服务抖动。


健康检查程序在不同环境下有着不同的实现:


web 服务下采用 HTTPGET 方式进行健康检查,需要实现一个“/healthz”URL,这个 URL 对应的程序需要检查所有核心服务是否正常,健康检查程序还应该在异常情况下输出每一个检查项的状态明细。


其他网络服务下可以采用探查容器指定端口状态来判断容器健康状态。


非网络服务下需要在容器内部执行特定命令,根据退出码判断容器健康状态。

Yaml 中 Image tag 配置规范

部署容器镜像时应该避免使用 latest tag 形式,否则一旦出现问题就难以跟踪到当前运行的 Image 版本,也难以进行回滚操作。所以建议每个容器 Image 的 tag 应该用版本号来标识。

使用 ConfigMap 实现应用平滑迁移

早期的 1.0 版本配置信息都是写在配置文件中的,要做迁移就需要改很多东西,当时就只有几种方法可以传递配置信息,其中一种是通过环境变量传递,然后内部还要有一个对应机制进行转化,这其实是非常麻烦的过程。但是现在有了 ConfigMap 之后,就只需要将原先的配置文件导入到 ConfigMap 中就行了。

迁移中遇到的其他问题

关于 CI/CD

我们在做迁移的时候采用的是 Jenkins 来实现 CI/CD 的,然后通过 Helm 来实现软件包管理,Helm 是 Kubernetes 的官方子项目,作为企业内部的应用管理是非常方便的,它使得开发者不用再去关注 Kubernetes 本身而只需要专注于应用开发就够了。

时区的配置问题

从官方下载的镜像都会有默认时区,一般我们使用的时候都需要更改时区,更改时区的方式有多种,这里简单说两种。一是将容器镜像的/etc/loacltime 根据需要设置为对应的时区,二是采用配置文件中的 volume 挂载宿主机对应的 localtime 文件的方式。推荐采用第二种方式。

外部网络访问 Service

在没有 Ingress 的时候我们是使用内建 Nginx 容器来转发集群内部服务,现在则是通过 Ingress 转发集群内部服务,Ingress 通过 NodePort 方式暴露给外网。

最佳组合


上图展示的是 Kubernetes 的最佳组合,它以 DevOps 作为基础,上层是 k8s 加上 Containers,顶层构筑的是微服务应用。这样的组合带来的不仅是一个容器云,更多的是改变了研发流程和组织结构,这主要是受微服务的架构思想影响。


过去完成一个应用的版本发布可能要多人协同,一旦有紧急发布的时候就会发现这其实是非常笨重的。但是如果是基于微服务架构做的应用,往往一到两个人就可以维护一个微服务,他们自己就可以决定这个微服务是否独立部署上线。


关于微服务和 Kubernetes 还有一个优势必须要强调,配合 CI/CD 开发人员终于可以不再考虑部署环境的细节了。


2020-04-22 18:311098

评论

发布
暂无评论
发现更多内容

混沌演练实践(二)-支付加挂链路演练 | 京东云技术团队

京东科技开发者

微服务 混沌工程 混沌工程实践 企业号 5 月 PK 榜

耕升 GeForce RTX 4060 Ti 系列,为玩家带来DLSS3+1080P光追游戏体验!

Geek_2d6073

PoseiSwap IDO在Bounce上启动在即,如何参与?

西柚子

阿里巴巴亿级并发系统设计手册已开源(2023 最新版)震撼来袭

架构师之道

Java 高并发

基于 Log 的通用增量 Checkpoint 在美团的进展

Apache Flink

大数据 flink 实时计算

有哪些好用的企业即时通讯软件值得推荐?

WorkPlus

常用的表格检测识别方法——表格结构识别方法(上)

合合技术团队

人工智能 深度学习 算法 人工智能文字识别 表格检测

深度学习基础入门篇-序列模型:[11]:循环神经网络 RNN、长短时记忆网络LSTM、门控循环单元GRU原理和应用详解

汀丶人工智能

人工智能 深度学习 RNN LSTM GRU

Flutter三棵树系列之详解各种Key | 京东云技术团队

京东科技开发者

flutter key 企业号 5 月 PK 榜 localkey

什么是 Final Cut Pro? fcpx视频剪辑下载安装

Rose

Final Cut Pro下载 Final Cut Pro破解版 FCPX软件 fcpx Mac视频剪辑软件

视频后期特效处理软件:Motion 5 最新中文激活版

真大的脸盆

Mac Mac 软件 视频特效合成 视频特效工具 特效合成

以敏捷性为目标,构建良好企业生态

智达方通

数据驱动 数据孤岛 智达方通 全面预算管理 数据分析系统

企业研发效能度量利器,华为云发布CodeArts Board看板服务

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

PoseiSwap IDO在Bounce上启动在即,如何参与?

鳄鱼视界

CloudQuery v2.0.0 发布 新增数据保护、数据变更、连接管理等功能

BinTools图尔兹

数据库 国产数据库 版本发布

SpringBoot + Docker 实现一次构建到处运行

Java你猿哥

Java Docker Spring Boot ssm 容器化部署

3天速成!阿里人私用的Netty速成实战手册,3天Github星标11.5k

Java你猿哥

Java 源码 Netty ssm netty内存管理

深度学习进阶篇-预训练模型[1]:预训练分词Subword、ELMo、Transformer模型原理;结构;技巧以及应用详解

汀丶人工智能

人工智能 深度学习 预训练模型 Transformer ELMo

2023最新版Java面试八股文大全(附各大厂面试真题及答案)

采菊东篱下

java面试

直击灵魂!美团大牛手撸并发原理笔记,由浅入深剖析JDK源码

做梦都在改BUG

Java 并发编程 多线程 jdk源码

Logic Pro X(苹果专业音频制作软件)v10.7.8中文版

Rose

苹果mac软件下载 Logic Pro X下载 Logic Pro X破解 Logic Pro X教程 音频制作软件

内部开发者平台|自建还是购买,企业应如何选择?

SEAL安全

平台工程 企业号 5 月 PK 榜 内部开发平台

1.5万字+30张图盘点程序员面试必会MySQL索引常见的11个知识点

Java你猿哥

Java MySQL 数据 ssm 索引

2023年,Flutter3.10版本的变化有哪些?

没有用户名丶

小程序容器

龙博机电:90后“厂二代”,靠伙伴云零代码让中小制造业实现数字化“逆袭”

联营汇聚

Scrum的三个工件(产品Backlog、Sprint Backlog、产品增量 )

顿顿顿

Scrum 敏捷 敏捷开发管理 敏捷开发管理工具

Elasticsearch与Clickhouse数据存储对比 | 京东云技术团队

京东科技开发者

数据库 elasticsearch Clickhouse 企业号 5 月 PK 榜

最高奖金100万!第二届广州·琶洲算法大赛火热报名中

飞桨PaddlePaddle

百度飞桨 算法大赛

Ableton Live Suite 11破解版下载 音乐制作软件

Rose

音乐制作 Ableton Live 11中文版 Live Suite 11破解 Ableton Live Suite下载

升级正当时,高性价比的影驰 GeForce RTX™ 4060 Ti 8G开箱评测

Geek_2d6073

WorkPlus AI助理 | 将企业业务场景与ChatGPT结合

WorkPlus

向Kubernetes容器云平台迁移,你必须知道的9件事_文化 & 方法_Rancher_InfoQ精选文章