我们于2017年开始构建第一个基于1.9.4版本的Kubernetes集群。至今,我们已经有两个集群,一个集群在裸机RHEL VM上运行,另一个集群在公有云AWS EC2上运行。

今天,我们的Kubernetes集群由分布在多个数据中心的400多个虚拟机组成。该平台承载着高度可用的核心应用程序和系统,管理拥有近400万个活跃用户的的大型实时系统。

Kubernetes最终使我们的运维变得更轻松,但是这一过程是艰辛的,是范式的转变。不仅仅是我们的技能和工具有了彻底的转变,而且我们的设计和思维也得到了彻底的转变。我们必须采用多种新技术,并进行大量的投入,以提高团队和基础设施的档次和技能。

回顾三年来,Kubernetes在我们的生产中运行了三年,这也是本文将会将的重点内容。


1. 基于Java的APP容器化问题

当涉及微服务和容器化时,很多人都倾向于避免使用Java,这主要是由Java不太友好的内存管理造成的。但是,现在情况发生了变化,并且Java的容器兼容性在过去几年中得到了很大的改善。毕竟,当前大部分的系统都有使用Java程序的 Apache Kafka作为中间件,另外Elasticsearch通常也是在Java程序上运行。

回顾2017-2018年度,我们有一些应用程序在Java 8上运行。它们常常难以理解像Docker这样的容器环境,并且由于堆内存问题和异常的垃圾收集而崩溃。我们了解到,这是由于JVM无法支持Linux cgroupsnamespaces,后者是容器化技术的核心。

但是,从那时起,Oracle一直在不断提高Java在容器领域的兼容性。甚至Java 8的后续补丁都引入了实验性JVM标志来解决这些问题:XX:+UnlockExperimentalVMOptionsXX:+UseCGroupMemoryLimitForHeap

但是,尽管有了这些改进,但不可否认的是,与PythonGo等同类产品相比,Java仍因占用内存和启动时间慢而名声不佳。主要是由JVM的内存管理引起的。

今天,如果我们必须选择Java,我们会确保它的版本是11或更高。我们的Kubernetes内存限制会在比JVM最大堆内存(-Xmx)多1GB,以获得足够的空间。也就是说,如果JVM使用8GB作为堆内存,我们对应用程序的Kubernetes资源限制将是9GB。这样,应用将会更加健康。


2. Kubernetes升级

Kubernetes生命周期管理(如升级或补丁修复)非常麻烦,尤其是在裸机或虚拟机上构建了自己的集群时。对于升级,我们已经意识到最简单的方法是用最新版本重新构建一个集群,并将工作负载从旧的集群迁移到新的集群。进行节点的升级相对而言会更复杂,且结果无法预料。Kubernetes有多个与其一起协调工作的组件需要与Kubernetes升级保持一致。从Docker到像CalicoFlannel这样的CNI插件,你需要小心地把它们拼凑在一起才能工作。尽管像KubesprayKubeoneKopsKubeaws这样的项目使它更容易维护,但它们都有各自的缺点,且不太通用。

我们在RHEL VM上使用Kubespray构建了集群。Kubespray非常不错,它有基于ansible的构建、添加和删除新节点、升级版本的playbooks,以及我们在生产中操作Kubernetes所需的几乎所有内容。但是,升级的playbook带了一个免责声明,可防止我们跳过次要版本。因此,必须经过所有中间版本才能达到目标版本。简而言之,Kubespray不支持跨版本升级。

以上可得出的结论是,如果您打算使用Kubernetes或已经在使用Kubernetes,请考虑生命周期管理。构建和运行集群相对容易一些,但是Kubernetes的生命周期管理则相对复杂,涉及内容较多。


3.构建和部署

准备重新设计整个构建和部署的pipelines。我们的构建过程和部署必须经历一个基于Kubernete的完整转型。不仅在Jenkins pipelines中进行了大量的重组,还使用了诸如Helm这样的新工具,制定新的git流和构建策略,docker 镜像的tag标签,以及版本化Helm chart

您不仅需要维护代码,还需要维护Kubernetes部署文件,Docker文件,Docker镜像,Helm Chart的策略,并设计一种将所有这些链接在一起的方法。

经过几次迭代,我们决定采用以下设计。

  • 应用程序代码及其helm chart位于单独的git存储库中。这使我们可以分别对它们进行版本控制。

  • 然后,我们将helm chart版本与应用程序版本一起保存,并使用它来跟踪发布。因此,例如,使用进行app-1.2.0部署charts-1.1.0。如果仅更改Helm values文件,则仅更改chart的补丁程序版本。(例如,从1.1.01.1.1)。所有这些版本均由每个存储库中的发行说明规定RELEASE.txt

  • 我们与构建或修改其代码的Apache KafkaRedis之类的系统应用程序的工作方式有所不同。也就是说,我们没有两个git存储库,因为Docker tag只是Helm chart版本控制的一部分。如果我们曾经更改了docker tag进行升级,我们将在chart标签中增加主要版本号。


4.Liveliness和Readiness探针(双刃剑)

Kuberneteslivelinessreadiness探测是自动解决系统问题的的优秀特性。他们可以在发生故障时重新启动容器,并将流量从不正常的实例中转移出去。但在某些故障情况下,这些探测可能成为一把双刃剑,影响应用程序的启动和恢复,尤其是消息中间件或数据库等有状态应用程序。

我们的kafka系统就是受害者。我们运行了一个3 broker 3 zookeeper的状态集群,replicationFactor 为3,minInSyncReplica为2。当Kafka在意外系统故障或崩溃后启动时,就会发生问题。这导致它在启动期间运行其他脚本来修复损坏的索引,根据严重程度,该过程可能需要10到30分钟。由于增加了时间,Liveliness将不断失败,从而向Kafka发出终止信号以重新启动。这阻止了Kafka修改索引并完全启动。

唯一的解决方案是配置initialDelaySeconds liveliness探针设置,以在容器启动后延迟探测。但是,当然,问题在于很难对此加以说明。有些恢复甚至需要一个小时,因此我们需要提供足够的空间来解决这一问题。但是增加的越多initialDelaySeconds,恢复速度就越慢,因为在启动失败期间,Kubernetes需要更长的时间来重新启动容器。

因此,择优的方法是评估initialDelaySeconds字段的值,以便更好地平衡您在Kubernetes中寻求的弹性和应用程序在所有故障情况下(磁盘故障、网络故障、系统崩溃等)成功启动所需的时间

更新*:如果您使用的是最新版本,Kubernetes引入了第三种探针类型,称为“启动探针”,以解决此问题*](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)*。在1.16的alpha版本和1.18的beta版本后是可用的。

在容器启动之前,启动探针将禁用readinessliveliness检查,以确保应用程序的启动不会中断。


5.对外的External的IP

我们了解到,使用external IP暴露服务会对内核的连接跟踪机制造成巨大负荷。除非规划详细,考虑周全,否则一旦规模上去,那么它只会崩溃。

我们的集群运行在基于Calico CNIBGP上,作为我们在Kubernetes内部的路由协议,也可以与边缘路由器对接。对于Kubeproxy,我们使用IP Tables模式。我们在Kubernetes中托管着庞大的服务,该服务通过external IP对外暴露,每天处理数百万个连接。由于使用来自软件定义网络的SNATmasqueradingKubernetes需要一种机制来跟踪所有这些逻辑流。为此,它使用内核的Conntrack 与 netfilter工具来管理静态IP的这些外部连接,然后将其转换为内部服务IP,最后转换为您的pod IP。转发过程全部通过conntrack表和IP表完成。

然而,这个conntrack表有其局限性。一旦达到这个限制,Kubernetes集群(底层的操作系统内核)将无法再接受新的连接。在RHEL上,你可以这样检查。

$ sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_maxnet.netfilter.nf_conntrack_count = 167012
net.netfilter.nf_conntrack_max = 262144

解决这一问题的一些方法是使用边缘路由器连接多个节点,这样您的静态IP的传入连接遍及整个群集。因此,如果您的集群有大量的机器,那么累积起来就可以有一个大的conntrack表来处理大量传入的连接。

早在2017年成立之初,这一切就让我们望而却步,但最近,Calico在2019年对此进行了详细研究(https://www.projectcalico.org/when-linux-conntrack-is-no-longer-your-friend/)。


6.您真的需要Kubernetes吗?

三年过去了,我们仍然每天都在不断地发现和学习新的东西。kubernetns是一个复杂的平台,有其自身的一系列挑战,特别是构建和维护环境方面的。它将改变你的设计、思维、架构,并将需要提高你的团队能力以满足架构转型。

然而,如果你在云端并且能够将Kubernetes用作“service”,它可以减轻平台维护带来的大部分开销,例如“如何扩展内部网络CIDR?”。或“如何升级我的Kubernetes版本?”

今天,我们意识到你需要问自己的第一个问题是“你真的需要Kubernetes吗?”。这可以帮助您评估您所遇到的问题以及Kubernetes解决该问题的重要性。

Kubernetes转型并没有想象中的那么简单,那么廉价。您为此付出的代价必须真正证明“您的”应用及其如何利用该平台。如果满足这些条件,那么Kubernetes可以极大地提高您的生产力。

记住,为了技术而技术是没有意义的。

原文:https://medium.com/better-programming/3-years-of-kubernetes-in-production-heres-what-we-learned-44e77e1749c8

了解新钛云服

当IPFS遇见云服务|新钛云服与冰河分布式实验室达成战略协议

新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照

深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

新钛云服一周年,完成两轮融资,服务五十多家客户

上海某仓储物流电子商务公司混合云解决方案

新钛云服出品的部分精品技术干货

低代码开发,全民开发,淘汰职业程序员!

国内主流公有云VPC使用对比及总结

万字长文:云架构设计原则|附PDF下载

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

Ceph OSD故障排除|万字经验总结

七个用于Docker和Kubernetes防护的安全工具

运维人的终身成长,从清单管理开始|万字长文!

OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?

Kubernetes 3年生产中我们所学到的东西相关推荐

  1. 前端开发从项目中获得什么_我如何获得副项目的前10个客户以及从他们那里学到的东西...

    前端开发从项目中获得什么 by Tigran Hakobyan 由Tigran Hakobyan 我如何获得副项目的前10个客户以及从他们那里学到的东西 (How I got my first 10 ...

  2. java开放源码_开放源码的第一周:我是如何参与的,以及我学到的东西

    java开放源码 by Chak Shun Yu 泽顺宇 开放源码的第一周:我是如何参与的,以及我学到的东西 (My first week of open source: how I got invo ...

  3. network 拦截不到东西是怎么做到的?_都说读中职院校学不到东西,中职学生到底是怎么学习的?...

    中职院校在社会中的影响一直并不是很好,一直都是负面影响高于正面影响,那么,我们不禁就要问了,一直在喊提升中职院校的教学质量,质量提升到哪里去了呢!那些中职院校里的学生到底又是怎么学习的呢?为什么都说去 ...

  4. 我们分析了成千上万的编程访谈。 这就是我们学到的东西。

    by Aline Lerner 通过艾琳·勒纳(Aline Lerner) 我们分析了成千上万的编程访谈. 这就是我们学到的东西. (We analyzed thousands of coding i ...

  5. 学python分析双色球_我通过使用Python分析了80多个工作拒绝而学到的东西

    学python分析双色球 by Conor Dewey 由Conor Dewey 我通过使用Python分析了80多个工作拒绝而学到的东西 (What I learned from analyzing ...

  6. 渗透测试 已学课时 1 个_我14岁上创业课时学到的东西

    渗透测试 已学课时 1 个 by Pau Pavón 通过保罗·帕文(PauPavón) 我14岁上创业课时学到的东西 (What I learned when I took an entrepren ...

  7. java 学到什么实习_我的外展实习从今天开始! 到目前为止,这是我已经完成并学到的东西。...

    java 学到什么实习 by Toni Shortsleeve 通过托尼·肖特里夫(Toni Shortsleeve) 我的外展实习从今天开始! 到目前为止,这是我已经完成并学到的东西. (My Ou ...

  8. c语言程序设计选修让我学到的东西,电子课程设计心得体会

    电子课程设计心得体会 电子课程设计心得体会(一) 本学期实时测量技术实验以电子设计大赛的形式,老师命题,学生可以选择老师的题目也可以自己命题,并且组队操作其他的事情(包括设计总体方案.硬件电路.软件设 ...

  9. 【多传感器融合定位】【从零开始做自动驾驶定位_任佬】【所学到的东西汇总】

    [多传感器融合定位][从零开始做自动驾驶定位_任佬][所学到的东西汇总] 0 前言 1 开篇 1.1 代码工程的运行 2 数据集 3 软件框架 3.1 运行 3.2 学到的 3.2.1 对消息的订阅和 ...

最新文章

  1. C/C++返回内部静态成员的陷阱
  2. Py之cython:python库之cython的简介、安装、使用方法之详细攻略
  3. Oracle三种循环:for,while,do...while(PL/SQL)
  4. Java 重定位 —— redirect:
  5. PHP的输入与输出(input与$_GET[“key“])
  6. OpenFOAM计算时,同时将结果输出到:计算窗口+文件
  7. linux utmp结构体,Linux C编程如何使用联机帮助来解决编程问题?
  8. java未发现数据源名称并且未指定默认驱动程序_转:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序...
  9. animate inater插件_maya插件管理器(Plug-in Manager),MAYA
  10. 猫扑_猫女郎图片批量下载器
  11. JS 代码调试经验总结(菜鸟必读)
  12. 认知科学、神经科学、和认知神经科学
  13. 通过css和html构建能耗数据分析树状图
  14. python项目打包部署到ios_Python实现iOS自动化打包详解
  15. F5 GTM DNS 知识点和实验 4 -智能DNS基础
  16. java溢出 事件触发_Java各种溢出
  17. 用数据说话:刘强东制造“负熵增”
  18. 1到100的偶数之和是多少_求1到100之间所有偶数之和
  19. 启动计算机引导win10,示例如何修复win10系统引导项
  20. 214情人节,使用微信小程序【信鸽相知】写情书吧

热门文章

  1. LoRa vs LTE-M vs Sigfox
  2. 完整部署uniswap 合约、前端教程(可部署uniswap到bsc、heco)
  3. 前端基础学习-element-ui表格表头做成斜线表头
  4. 项目Tips---使用阿里的OOS实现简单的文件上传
  5. 【翻译】Bing-CF-IDF+:语义驱动的新闻推荐系统
  6. Codesys配置电子凸轮连接虚轴
  7. 蓝桥杯练习题之数列特征
  8. 普通风景照如何调色,ps教程
  9. java-unrar-0.3.jar_java-unrar-0.3.jar解压
  10. 基于混沌的一般彩色图像加密算法的Matlab实现