写点什么

转转 Kubernetes 实践:如何解决容器化带来的四大问题

  • 2022-08-17
    北京
  • 本文字数:2410 字

    阅读完需:约 8 分钟

转转 Kubernetes 实践:如何解决容器化带来的四大问题

为进一步加强技术交流,推进云原生生态共建,6 月 28 日下午,首届云原生实践者大会在线上线下同步举办。来自作业帮知乎、转转、58、同程等多家科技企业的数十名研发人员,以及中国信通院云大所的专家共同参与了此次技术研讨沙龙。

 

研讨会上,转转基础服务负责人梁会彬分享了转转在 Kubernetes(以下简称 K8s)方面的实践。梁会彬表示,相较于传统物理机,容器化带来了资源隔离、轻量快捷、隆本提质增效、高可用等诸多优点,从而被各大互联网公司采用。但同时,这也引入了新的问题,如 IP 动态、日志收集、服务治理融合、监控等。面对这些问题,各大公司根据业务场景采用了不同的解决方案。梁会彬同与会者分享了转转的解决方案,包括镜像管理、发布升级、容器监控、日志收集等方面。

 

以下,是梁会彬的分享。

 

我主要从实现层面来介绍 K8s 在转转的实践。本着让 rd 无感容器相关概念的原则,转转云平台主要包括镜像管理、发布升级、容器监控、日志收集四个部分。

总体架构


 

这是转转云平台架构图,其中包括组件镜像存储、日志收集、K8s、服务治理、NG 治理、监控等,云平台统一管控这些组件。如图所示,云平台屏蔽以上组件,让 rd 无感,减少复杂性,学习曲线平缓。

功能流转


 

这幅图是云平台的结构关系,该图包含了用户行为和数据流转关系,属于系统的反馈回路图。

 

从左边来看,rd 通过 CI/CD 平台编译部署,通过日志平台查询日志,通过大数据收集平台配置日志收集信息,最后这些平台统一和云平台交互,由云平台统一管理和 K8s 的交互,而其他系统与 K8s 无耦合。如图所示,云平台负责镜像编译、发布升级、日志收集等功能。

 

镜像管理

 

镜像管理的目标是让 rd 对 Dockerfile 无感,减少学习成本。由于容器之前,编译系统有现成的编译产物,我们选择直接复用,来减少 CI/CD 开发成本,同时也能提高编译性能。

 

对应实现方案为应用分类(ZZJAVA、ZZWEB、WF),这样每种技术栈类型对应一种基础镜像,也就是各自对应相应的启动脚本,做到用户无需感知 Dockerfile。物理机编译产物+CMD(启动命令)就和物理机应用无异,做到物理机编译产物直接复用到容器中。

 

对于容器编译的执行过程,我们把编译镜像的程序以 pod 的形式部署到 K8s 集群运行,天然继承 K8s 的优势,做到分布式编译,以此打破性能瓶颈。


 

下面看一下镜像管理的流程交互图。如上图,rd 通过 CI/CD 编译工程,按原有编译流程执行编译,产物推送到 FTP 服务,然后利用云平台能力产生编译 pod,最终编译镜像程序在编译 pod 中编译镜像并推送到镜像仓库(Harbor)。下面是云平台的 Dockerfile,业务镜像输入参数是编译产物 url 和服务名称,而编译镜像的 Dockerfile 的本质就是用 Docker client 在 pod 中进行 docker build,这样编译镜像程序本身也能享受到隔离且编译后自我清理中间产物的优势。

 

发布升级


对于发布升级,我主要讲两个点:

  1. 转转发布技术的演进,包括 Deployment 控制器和转转自定义控制器 

  2. 不同应用类型服务的实现细节,包括 rpc 服务和 Web 服务

通用问题


Deployment 控制器使用过程中重点考虑的通用问题包括:cpu 如何超分、超分会出现什么问;ready 检查如何做;亲和策略怎么选择;以及针对不同服务类型的具体实现是什么等。

CPU 超分


CPU 超分的目标是让重点集群控制 CPU 超分比例,以此保证重点集群机器性能。

 

实现方案:保证重点集群性能就要控制其他非重点集群不调度到对应机器,所以本质来说是对宿主机集群进行分类。具体来说,就是为宿主机打不同的 label,部署的时候使用 NodeSelector 去匹配相应的宿主机,同时控制 CPU request=limit*设置比例,做到宿主机超分比率控制。

ready 检查


ready 检查的目标是,在 pod 在滚动升级时保证新启动容器进程可以提供服务,避免新容器出现问题时全部替换老容器,导致服务不可用。

 

实现方案:对于 Web 服务来说,访问 health 接口返回 200 认为 ready;rpc 服务判断端口启动成功即可,我们的 rpc 服务保证端口暴露时注册到服务治理服务。

亲和策略


亲和策略的目标是将同一个集群 pod 调度到不同宿主机,防止宿主机 crash 导致整个集群不可用。


实现方案:podAntiAffinity 技术。

rpc 服务


rpc 服务遇到的挑战:


  1. 转转 rpc 支持节点分组;

  2. 服务治理联动。

 

实现方案:针对分组配置节点数,rpc 框架改造支持分组发现,云平台支持针对分组部署,具体分组发现依靠 env 中的分组 id。

Web 服务


Web 服务遇到的挑战:

  1. Web 服务没有注册中心 ;

  2. Nginx 如何自动上下线。

 

实现方案:利用容器的生命周期控制 Nginx 上下线,实现 Nginx 服务化,即在 Nginx 上提供服务上下线接口。这样在容器 prestop 时下线 Nginx,readyness 时上线 Nginx,做到容器自我管理上下线 Nginx 功能。

自定义控制器


使用 Deployment 控制器会遇到 IP 漂移、日志丢失、kubelet 不支持 subPath 等问题。我们自定义控制器是为了方便开发,直接重写 RC 控制器,复用 pod,解决 ip 漂移和日志丢失问题。我们还重写了 emptyDir 实现 subPath,解决相同集群调度到同一机器日志冲突问题。

自定义控制器的实现


 

这幅图是 K8s 控制器流程图,经典的 list/watch 模型。

 

我们重写 RC 的逻辑也比较简单:监听 Replication、发现 image 版本变化,直接替换 pod 的镜像版本,做到本地升级。但也有例外情况,如果 cpu、内存、env 等发生变化,我们就更换 pod。

容器监控


关于云平台的监控,我们也经历了几个版本:从 Heapster 到 Metrics-server,最后直接使用 Prometheus 抓取 cAdvisor 数据。这里有个小细节,Prometheus 抓取 cAdvisor 数据没有 IP 和 pod 关联关系的数据,是需要处理的。

容器监控示例


这幅图是转转的容器监控,可以看到相应 pod 的宿主机以及自身性能数据。

日志收集


 

日志收集遇到的问题:


  1. Java 技术栈日志一般不往 stdout 打印,有自己的日志框架,而且是多文件的,比如 info、warn、error,这点和 Docker 设计有些出入 ;

  2. 日志量很大 ;

  3. 日志丢失 。

 

我们的应对方案:日志使用 hostpath 直接打到宿主机,解决丢失问题,然后使用异步收集解决量大问题。所谓异步收集是指宿主机上有专门的 agent 读取 Docker 启动/销毁事件,进而生成 flume 配置文件,做到收集日志和云平台解耦。

 

2022-08-17 16:415350

评论 5 条评论

发布
用户头像
k8s都能写错来,文章没人审核的么
2022-08-18 09:57 · 浙江
回复
非常抱歉,已更正
2022-08-18 10:01 · 北京
回复
用户头像
Kubernets -> Kubernetes, 标题都写错了
2022-08-18 09:37 · 上海
回复
很感谢指出错误,以后会更仔细审查
2022-08-18 10:03 · 北京
回复
用户头像
图片为什么这么糊
2022-08-17 20:03 · 上海
回复
没有更多了
发现更多内容

解耦远不止依赖注入

canonical

架构设计 解耦 依赖注入

程序员之间拉开差距最大的因素

博文视点Broadview

我以为我对Mysql很熟,直到遇到了阿里这份笔记

做梦都在改BUG

Java MySQL 数据库

你管这破玩意叫缓存穿透?还是缓存击穿?

做梦都在改BUG

Java 数据库 redis 缓存穿透 缓存击穿

阿里大佬在Github分享的Spring Cloud全栈笔记,你想象不到有多全

做梦都在改BUG

Java 架构 微服务 Spring Cloud

背靠香港影视集团星光文化,StarNFT问世了

小哈区块

什么是声明式编程

canonical

函数式 声明式 命令式

玩转服务器之环境篇:PHP和Python环境部署指南 | 京东云技术团队

京东科技开发者

php Python 京东云 企业号 5 月 PK 榜 轻量云服务器

XDSL:通用的领域特定语言设计

canonical

开源 低代码 dsl 领域特定语言 领域语言工作台

架构师日记-从数据库发展历程到数据结构设计探析 | 京东云技术团队

京东科技开发者

数据库 京东云 企业号 5 月 PK 榜

前端开发之函数式编程实践 | 京东云技术团队

京东科技开发者

JavaScript 编程 京东云 企业号 5 月 PK 榜

低代码平台中的GraphQL引擎

canonical

开源 低代码 领域驱动模型DDD 中台架构 graphql 低代码平台

低代码平台需要什么样的ORM引擎?(1)

canonical

开源 低代码 ORM 低代码平台 Spring JPA

【直播回顾】AIGC产业研究报告2023图像生成篇报告解读

易观分析

产业 智能

云原生背景下如何配置 JVM 内存

做梦都在改BUG

Java 容器 云原生 JVM

低代码平台中的自动化测试

canonical

开源 低代码 自动化测试 自动化测试框架 低代码平台

BSN-DDC基础网络详解(十一):官方门户OpenAPI说明及开发资料汇总

BSN研习社

企业应该知道的几种网络安全防护措施!

行云管家

网络安全 网络 信息

小微企业运维用哪款软件好?有免费的吗?

行云管家

运维 安全运维 小微企业

为什么说百度AMIS框架是一个优秀的设计

canonical

开源 前端架构 低代码 低代码平台 百度AMIS

如果重写SpringBoot,我们会做哪些不同的选择?

canonical

开源 低代码 架构设计 springboot spring ioc

性能优化多重要?凭借华为791页Mysql金字塔性能调优手册,进阿里

做梦都在改BUG

Java MySQL 性能优化 性能调优

Difference between from DR4019 and DR4029 /industrial wifi5 router/support openwrt.

Cindy-wallys

IPQ4019 ipq4029

手把手教你用代码画架构图 | 京东云技术团队

京东科技开发者

京东云 代码实现 企业号 5 月 PK 榜 C4

Github上标星98K!火爆全网的性能调优实战手册,出自腾讯T4大佬

做梦都在改BUG

Java 性能优化 性能调优

低代码平台需要什么样的ORM引擎?(2)

canonical

开源 mybatis 低代码 jpa ORM

从可逆计算看声明式编程

canonical

开源 低代码 声明式 命令式

华为云云原生视窗:一文回顾Q1精彩瞬间

华为云开发者联盟

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

从可逆计算看Delta Oriented Programming

canonical

开源 低代码 软件产品线工程 可变性管理 可逆计算

Wallys / QCN9074/QCN9024 WIFI 6E 802.11AX 4X4 6GHz wifi module.

Cindy-wallys

【保姆级教程】如何用Rust编写一个ChatGPT桌面应用 | 京东云技术团队

京东科技开发者

rust 京东云 桌面应用 企业号 5 月 PK 榜

转转 Kubernetes 实践:如何解决容器化带来的四大问题_云原生_梁会彬_InfoQ精选文章