【光说不练假把式】今天说一说Kubernetes 在有赞的实践

戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg
作者 |  木鱼 on基础保障
责编 | 阿秃

一、背景
我们为什么选择 Kubernetes?因为 Kubernetes 几乎支持所有的容器业务类型,包括无状态应用、有状态应用、任务型和 Daemonset,Kubernetes 也逐渐成为容器编排领域不争的事实标准。同时,从资源利用率,开发测试运维和 DevOps 三方面出发,会极大的提升人和机器的效率。

二、方案

整体架构
640?wx_fmt=png

Kubernetes 在整个系统中处于偏底层,负责容器的编排。我们开发了一套 Web 的运维平台,能够完成开发者绝大部分的日常开发操作功能,其中包括了应用发布、伸缩容、回滚、灰度蓝绿发布、CI/CD 流水线、日志和监控的查看等。

集群部署
640?wx_fmt=png

为了实现集群的高可用,平台提供多个 IDC 部署,应用可以同时部署到不同 IDC 的 Kubernetes 集群,同时我们在一个 IDC 同时部署了两个集群,应用可以部署到同机房的两个集群,这样可以解决跨机房调用问题,也可以防止 Kubernetes 集群过大导致的调度性能问题。同时在同一个 IDC 内,集群可以选择自建和云提供商的集群,在双十一这种情况下,可以利用云的弹性,快速扩容集群来满足资源的需求。在同个 IDC 部署多个集群的出发点是,我们没有使用 Kubernetes 的 Ingress,自研了 k8s-sync 组件会在发布时自动将容器的 IP 同步到我们的统一接入中,为了避免 k8s-sync 出错,如果在一个集群中 IP 同步不一致会快速失败,而不会影响其他的集群和现有的服务。
Master 高可用
640?wx_fmt=png

Master 节点是 Kubernetes 中最重要的部分,生产中必须要保障它的高可用。etcd 是 Kubernetes 当中唯一带状态的服务,集群中所有的数据都保存在 etcd 中。Kubernetes 选用 etcd 作为它的后端数据存储仓库正是看重了其使用分布式架构,没有单点故障的特性。一是使用独立的 etcd 集群,使用 3 台或者5台服务器只运行etcd,独立维护和升级。甚至可以使用 CoreOS 的 update-engine 和locksmith,让服务器完全自主地完成升级。这个 etcd 集群将作为基石用于构建整个集群。采用这项策略的主要动机是 etcd 集群的节点增减都需要显式的通知集群,保证 etcd 集群节点稳定可以更方便地用程序完成集群滚动升级,减轻维护负担。

kube-apiserver 高可用
apiserver 本身是一个无状态服务,要实现其高可用相对要容易一些,前端部署了负载均衡,其他组件都通过这个负载均衡去访问 apiserver。
kube-controller-manager 与 kube-scheduler 高可用

这两项服务是 Master 节点的一部分,他们的高可用相对容易,仅需要运行多份实例即可。这些实例会通过向 apiserver 中的 Endpoint 加锁的方式来进行leader election, 当目前拿到 leader 的实例无法正常工作时,别的实例会拿到锁,变为新的 leader。

日志
针对日志采集,在有赞主要分为两类,对于输出到 stdout 和 stderr 的日志,会使用 filebeat 进行采集,写入到 kafaka 中做后续的存储和处理。对于 Java 类应用,在虚拟机时代,就已经自研了一套日志处理方案,在容器中我们沿袭了这套方案,通过 agent 采集走。
集群监控
对于集群的监控主要分为两种,对于节点的监控,还是沿袭了虚拟机时代的方案,继续使用 open-falcon;使用 Kubernetes 后,我们使用了 cadvisor 和 kube-state-metrics,用于采集容器和 Kubernetes 中一些资源对象的数据;同时,对于 Kubernetes 中的组件,kubelet、kube-apiserver、kube-controller-manager 和 kube-scheduler,各自都暴露了 metrics 接口,吐出了自身的运行时的监控数据。这些数据都被集群的 prometheus 全部拉取,然后展示在 Grafana 和运维平台上。
应用监控
在运维平台中,对于应用开发者来说最关心的是应用层面的监控数据。目前,我们结合 cadvisor 和 kube-state-metrics 提供了 CPU、内存、磁盘 IO、网络 IO 这四个监控项。同时,我们针对容器重启,销毁,拉取镜像失败,孤儿 Pod 等事件做了监控和报警。
服务暴露
Kubernetes 中服务的暴露是一个比较重要的问题,同时也有很多开源的方案。刚开始,我们调研了 traefik ,但是很多地方满足不了我们的需求,所以沿用了内部的接入层 yz7,为了适配 Kubernetes,自研了 k8s-syc。k8s-sync 会 watch 集群中的 endpoints,然后将 IP 同步到 yz7 中。对于 RPC 服务,由于我们内部采用了 macvlan ,这种调用和虚拟机时代保持了一致。
640?wx_fmt=png

镜像
镜像的构建主要分 3 层,OS 层、Runtime 层和业务应用层。有赞内部每种应用类型会有严格的端口规范,每种应用类型接入容器发布时要符合端口规范。对于 Python 和 NodeJS 应用接入容器发布时比较简单,只需要在应用 repo 的根路径下添加 app.yaml 文件,这个文件定义了应用的镜像的构成,包括 OS、runtime 和 entrypoint。例如,下面是一个 Python 应用的 app.yaml 示例文件。
stack: youzanyun-centos6	
runtime: python-2.7	
entrypoint: gunicorn -c gunicorn_config.py wsgi:application
640?wx_fmt=png

标签
为了便于运维管理和亲和性的需求,我们给 Pod 打上了很多标签,例如:应用名称、集群名称、环境、机房、灰度蓝绿等。目前,我们还没有使用亲和性来实现更复杂的高可用,后续会基于这些标签来规划应用的亲和性和反亲和性。
Lifecycle Hooks
我们使用了 Kubernetes 的 poststart 和 prestop 的钩子。
  • 容器启动时,会调用定义的 preload 和 online 脚本,该脚本会对应用程序进行健康检查,健康检查通过后再执行 online 脚本对应用进行上线动作。
  • 容器销毁时,会调用 offline 和 stop 脚本,和启动时相反,容器销毁时会先进行下线动作然后再执行 stop 脚本。
持续交付
640?wx_fmt=png
在有赞,CI/CD 的实现是通过项目环境来实现的。每个标准环境的部署,是部署在不同的 Kubernetes 集群中的,每个集群中通过不同的 namespace 来区分各自的环境。

多集群管理
目前我们的生产环境的集群包括了自建集群和公有云集群,其他环境也有很多套集群。为了便于进行集群管理,我们自研了集群管理平台。集群管理员可以在平台上对进行操作,包括创建集群、添加节点、维护节点、给节点打标签和查询集群及节点的水位状态。

遇到的问题
在容器化的过程中,还是碰到了不少的问题,主要有下面这些和大家分享下:
1.CPU 核数不准
我们使用了 lxcfs 进行了一些隔离,但是对于 Java 程序来说获取到的 CPU 核数还是不准的,前期我们使用了 hack 的方案,后续升级了 jdk 避免了这个问题。
2.有问题时的排查
针对发布时,应用程序发布起来出现 CrashLoopbackoff 的情况时,我们提供了调试模式发布,这时,会移除 Pod 的健康检查和 lifecycle hook,保证可以发布起来。针对线上运行时出现了问题,我们提供了隔离的功能,给 Pod 打上特殊的标签让其脱离 Deployment 的控制,同时会执行程序的下线流程,保证不再有流量进来,这样就保留了有问题时的现场,供开发人员进行现场问题排查。
3.Pod 中 Container 的依赖
通常,在 Pod 里除了业务容器还有其他的 sidecar 容器,在我们这里特殊的是,业务容器还依赖了 sidecar 容器,但是 Pod 的启动实际是无序的,所以我们目前使用了富容器,辅助程序和业务程序放在了一起,启动时控制了它们的启动次序。目前,社区里也有相应的讨论,已经在实现中。

三、未来展望
未来,我们期望能开始使用 operator 来优化和改进 Kubernetes 的使用,并使用它去优化一些应用程序的交付;希望可以开始使用 HPA 和 VPA,来实现自动化的伸缩容;实现更精细化的调度,提供集群的利用率。

640?wx_fmt=png

早鸟票倒计时最后2天,扫码购票立减2600元!

2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。

640?wx_fmt=png

福利
扫描添加小编微信,备注“姓名+公司职位”,入驻【CSDN博客】,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

640?wx_fmt=jpeg

推荐阅读:
  • 【小白集合】详解服务器内存和显存基础知识
  • 【忽悠面试官就靠它了】『Spring事务管理器』源码阅读梳理
  • 如何破解焦虑成为技术大牛?资深技术 Leader 肺腑忠告

  • 快手王华彦:端上视觉技术的极致效率及其短视频应用实践 | AI ProCon 2019
  • 每个新手程序员都应该知道的Python开发技巧

  • 5G来了,智能手机们还能拼什么?

  • 揭秘!“链上FBI”Chainalysis如何追踪暗网交易?

真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache旗下顶级开源盛会 HBasecon Asia 2018将于8月在京举行

摘要: 作为Apache基金会旗下HBase社区的顶级用户峰会,HBaseCon大会是Apache HBase™官方从2012年开始发起和延续至今的技术会议,先后在美国加州、日本东京和中国深圳等地举办,得到了Google、Facebook、雅虎和阿里巴巴等众多全球顶…

r语言查找是否存在空值_关于R包安装你知道多少?

在R语言的学习过程中离不了各种R包的安装与使用,要使用某个R包首先得学会如何安装该R包。对于R包的安装你知道的有多少?你知道如何指定安装路径吗?为何你每次重新打开R绘画都需要重新安装R包?今天小编带你详细理解install.package…

深入理解JAVA虚拟机学习笔记(一)JVM内存模型

摘要: 上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了。这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状…

oracle schema_了解Oracle备份恢复的知识

Oracle架构体系警报日志(alter log):一个文本日志文件,记录数据库的错误和状态信息,通常情况下,警报日志位于后台转存目标目录中,该目录有数据库参数DIAFNOSTIC_DEST定义的,其中警报日志的格式为alter.log。…

美部长施压堵华为,遭印度电信巨头现场驳斥 ;WhatsApp被曝漏洞:仅凭一张GIF动图黑客便可接管账户……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 每周三次,打卡即…

实现Chrome Devtools调试JavaScript V8引擎

摘要: 最近开发小程序JavaScript的运行时,通过在客户端嵌入JavaScript V8引擎来实现。前端同学需要调试JavaScript代码,正好Chrome浏览器的Devtools是与V8的Inspector调试协议是一脉相承的,理论上是可以使用Chrome Devtools调试Ja…

angular7.2构建包如何兼容ie_Python 小技巧:如何实现操作系统兼容性打包?

转自:Python猫有一个这样的问题:现要用 setuptools 把一个项目打包成 whl 文件,然后 pip install 在 Windows/Linux 两种操作系统上,但是该项目中有一些依赖库只有 Windows 上才有(例如 pywinauto、pywingui、pywinrm)&#xff0c…

阿里云ET工业大脑发布AI视觉产品“见远”:电池片、车辆、路面都能被“诊断”

摘要: 7月24日,阿里云ET工业大脑发布AI视觉产品“见远“,可以利用深度学习和图像处理算法,自动识别图像中的瑕疵、故障及其他目标物,大幅节省人力,提高产品生产效率及精度稳定性效果。 7月24日&#xff0c…

最后2天,BDTC 2019 早鸟票即将售罄,超强阵容及议题抢先曝光!

大会官网:https://t.csdnimg.cn/U1wA2019 年12月5-7 日,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN、中科天玑数据科技股份有限公司协办的 2019 中国大数据技术大会,将于北京长城饭店隆重举行。届时&#xf…

利用python做一个小游戏_如何使用python做一个简单的猜数字的小游戏

1 首先小编先打开IDLE,如下图:2 然后这里点击菜单栏的File,然后点击菜单"New File",如下图:3 然后我们就在idle中新建了一个python文件,如下图:4 在这里我们按照下图中代码输入到文件…

阿里HBase的数据管道设施实践与演进

摘要: 大数据生态下有着丰富多样的系统:流计算,数据存储,实时分析,离线计算,数据在各个异构系统之间的流转和加工而产生价值,高效的数据传输通道是大数据生态的重要一环。本文描述了阿里HBase团…

gradle官方文档_Spring Boot+Gradle+MyBatisPlus3.x搭建企业级的后台分离框架

你再主动一点点 我们就有故事了原文:toutiao.com/i68614564967402706041、技术选型解析器:FastJSON开发工具:JDK1.8 、Gradle、IDEA技术框架:SpringBoot 2.1.5.RELEASEORM技术:MyBatisPlus3.1.2数据库:My…

java random用法_JAVA面试题(1)

1.Java内部类和子类之间有什么区别?答案:内部类是指在一个外部类的内部再定义一个类,内部类对外部类有访问权限,可以访问类 中定义的所有变量和方法。子类是从父类(superclass)中继承的类,子类可以访问父类所有public和…

【不了解你就OUT了】云原生基本原则

戳蓝字“CSDN云计算”关注我们哦!作者 | 架构师技术联盟责编 | 阿秃云原生指的是一个敏捷的工程团队,遵循敏捷的研发原则,使用高度自动化的研发工具,开发基于云基础设施和服务的应用以满足快速变化的客户需求。这些应用采用弹性&…

如何降低90%Java垃圾回收时间?以阿里HBase的GC优化实践为例

摘要: GC一直是Java应用中讨论的一个热门话题,尤其在像HBase这样的大型在线存储系统中,大堆下(百GB)的GC停顿延迟产生的在线实时影响,成为内核和应用开发者的一大痛点。 过去的一年里,我们准备在Ali-HBase上突破这个被…

会不会导致内存泄漏_Java内存泄漏!为什么会泄漏?如何泄漏?怎么定位?

JVM应该可以算Java中最为核心的部分了,其中开箱即用的内存管理又是JVM中的核心组成部分。我们都知道JVM的内存管理具有垃圾回收功能(Java Garbage Collector),编码时只需要new而无需主动的释放(类似于C中的delete操作),所以Java中比较少出现内…

看了三张照片,这个AI只用20分钟破获六年“悬案”

摘要: 浙江实现首个AI破案:钱某某夫妇在衢州“国字号”水利风景区信安湖使用“电鱼”方式偷了六年鱼,但由于缺少证据始终无法定罪,然而最终没有逃过衢州城市大脑的AI神眼。 近日,浙江实现首个AI破案:钱某某…

c语言 异或_编程入门:C语言基础知识全网超全不用到处找了!(文末附清单)

你背或者不背,干货就在那里,不悲不喜你学或者不学,编程就在那里,不来不去听到这话的你是否略感扎心?01基础知识1. 计算机系统的主要技术指标与系统配置。2. 计算机系统、硬件、软件及其相互关系。3. 微机硬件系统的基本…

oracle中如何创建表的自增ID(通过序列)

1、什么是序列呢?序列是一数据库对象,利用它可生成唯一的整数。一般使用序列自动地生成主码值。一个序列的值是由特别的Oracle程序自动生成,因而序列避免了在运用层实现序列而引起的性能瓶颈。Oracle序列允许同时生成多个序列号,而…

反转!以视频搜视频,这批 AI 程序员要逆天了!

抖音AI火了!以图搜图,已经无法满足我们了。近期抖音新功能以视频搜视频上新,不知小姐姐叫什么,也能搜出她的影像!比如,你捕捉了一只可爱的妹子,想要看到更多她的影像,只要点一下“识…