Kubernetes成为了行业标准,也成为了运维的标配。现在出去面试。如果哪家公司没有注明需要Kubernetes技能(国企除外),那你就不要考虑这家公司(钱那么多除外^_^)。虽然Kubernetes已经成为一种标准,但是不同的运维实现方式,或者不同的公司使用方式各不相同,我们经常会在一些Kubernetes社区群中看到一些奇怪的问题。除了提高自身的硬实力外,还需要建立一些做事的规范。下面从以下四个方面谈一些个人的看法和感悟,都用在了自己的工作中。如果我错了,请纠正我。俗话说,无规矩不成规矩。Kubernetes已经成为了一个标准,但是没有一个标准去实现,这就导致了10000个、10000个Kubernetes集群,不断变化的玩法也会导致不断变化的问题。这里的树标主要指的是什么?随着云能力的不断提升,很多互联网公司不再关心底层设施,比如服务器型号、维护、交换机配置、机柜信息等。那么我们在选择基础设施的时候应该关注什么呢?这里我以阿里云为例,简单罗列以下几点。(1)ECS模型很多时候,模型并不是太在意。在大多数情况下,它是由资金驱动的。公司舍得花钱就买好一点的,舍不得花钱就用。之所以列在这里,是为了避免因机型不同导致的一些莫名其妙的问题。例如,有些机器是独占的,有些是共享的。共享机器难免会受到其他服务器的影响,造成一些不可预见的问题。对于所描述的事物,用户此时很难定位具体原因。大多数情况下,此类问题都会被推给云厂商。但运维的难点在于“只要有问题,就是你的问题”。虽然我们可以把责任推给云厂商,但实际问题依然存在。所以我们在选择ECS机型的时候,还要考虑价格,避免一些可能出现的问题。最好实现统一实例。(2)系统版本对于Kubernetes来说,不太关注底层使用什么操作系统,但是最好统一作为一个运维,这样最大的好处就是容易维护。维护难度降低,一定程度上降低了风险。当然,如果选择系统版本,也要选择熟悉的系统。例如,如果您熟悉CentOS,则选择CentOS。不要使用Debian、Ubuntu等,虽然它们之前变化不大。(3)内核版本内核和系统应该放在一起。这主要是因为Kubernetes和Docker对内核的要求比较高。很多时候,我们需要升级内核来满足需求。选择内核升级时,一定要选择稳定版,所有服务器统一升级,这样才能确定基础设施是一致的。(4)安全组配置公有云上有一个安全组,主要控制网络访问。如果统一的环境更好,不仅方便管控,也大大降低了复杂度,无论是自身维护的复杂度,还是交接的复杂度。(5)网络划分公有云上不需要管理实际的路由器和交换机,但是我们需要划分网络。我习惯按业务划分,比如有三个业务部门A\B\C,将192.168.1.0/24分配给A,192.168.2.0/24分配给B,192.168.3.0/24分配给C。为什么要这样划分呢?我认为它基于出口的良好配置。云上的出口基本都是用Nat网关。如果是同一个IP段,则只能创建一个Nat网关。如果有多个网段,可以创建多个Nat网关。NAT网关,这样在大流量的情况下可以分流一定的流量。这样做的目的是为了使运维电路图更加清晰。运维工作本身就比较复杂。只有努力简化它,我们才能更好地确保稳定性,并有更多的时间来解决其他问题。应用标准在很多公司,运维是一个不受重视的群体。也就是说,没有发言权。如何逐步提高话语权?首先是主动积极参与应用的整个生命周期,了解应用的动态,掌握应用的机制。二是制定标准。在应用程序的生命周期中,发现问题并给出问题的解决方案,然后指定一系列的标准。随着时间的推移,每个人都会遵循这些实现。话说回来,运维不参与具体的代码开发,大部分运维是看不到开发代码的,那怎么定义标准呢?我将从运维经常问到或者经常用到的几个方面做一个简单的说明。(一)包装方式为什么说包装方式?因为在对应用做CI的时候,总会涉及到应用的打包。如果统一了应用的打包方式,是只需要做一个CI模板,还是可以更好的减少参数配置?.比如后台使用的开发语言都是java应用。有些人习惯用maven,有些人习惯用gradle。哪一个更好?其实都差不多,但是如果只用一个,岂不是更简单?比如我这里规定,只要java应用全部由gradle管理,那么我在做CI的时候基本不用问开发者如何打包。(2)应用目录应用目录包括以下几项。为什么要单独列出这些目录?事实上,这些目录在整个应用程序生命周期中扮演着非常重要的角色。统一这些目录,无论是制作镜像还是收集日志,甚至排查问题都可以直接明了,不用浪费时间找目录。比如目录如下:-deployment目录/app-cache目录/app/cache-log目录/app/logs-临时目录/app/tmp(3)应用日志运维这么多年,也深深明白了一个道理:日志不规范,运维两行泪。所以,应用日志定义了统一的格式和输出方式,最好输出到控制台,方便快捷的收集日志。(4)运行参数应用的运行时参数配置,如运行端口、JavaJVM参数配置、新生代、老年代、永久代的堆内存大小配置。例如应用统一使用8080端口,JVM参数参考如下配置:-server-XX:+UseG1GC-XX:MaxGCPauseMillis=50-Xms1G-Xmx1G-XX:MetaspaceSize=128mJAVA_MAXMETA_SIZE="512m"-XX:LargePageSizeInBytes=128m-XX:+ParallelRefProcEnabled-XX:+PrintAdaptiveSizePolicy-XX:+UseFastAccessorMethods-XX:+TieredCompilation-XX:+ExplicitGCInvokesConcurrent-XX:AutoBoxCacheMax=20000-XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryXX:+DisableShap-Heap内存verbosegc-XX:+PrintGCDateStamps-XX:+PrintGCDetails-Xloggc:/app/logs/gc.log"-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/app/logs/oom-`date+%Y%m%d%H%M%S`.hprof"当然这只是一个示例,不是标准,具体的优化或者配置要根据具体情况进行微调。产品标准Kubernetes中的应用产品都是容器镜像,所以这里提出一些制作容器的建议。(1)选择标准统一的父镜像,更易于升级、更新和修复bug。(2)镜像级别越少越好(3)应用以非root用户运行,不要开启特权模式(4)不要安装太多的命令软件,很多情况下是没有必要的。不同CI/CD标准的公司有不同的CI/CD,有的是基于开源软件的,有的是自研的。这里介绍的主要是开源软件,在国内是主流。开源软件的选择也很多,有GitlabCI、jenkins,还有更多云原生的比如Token、ArgoWorkflow等,那么应该怎么选呢?我发现在很多群里,经常有人问“你们公司有什么用?”对于CI/CD,什么工具比较厉害。”个人认为选择工具应该考虑以下几点:公司过去用的什么工具,现在这些工具的优缺点是什么,如果要换工具,如何保证优点继续保持,缺点是什么?它可以改进。如果只是单纯的换个工具玩玩,实在不建议换,吃力不讨好。公司整体组织形式及人员情况。因为这套工具不仅仅用于运维,还可以用于开发和测试。运维虽然可以占据一定的优势地位,但也要考虑整个团队的接受度。选择你熟悉和擅长的东西。归根结底,这些工具还是需要运维来维护和管理的。选择自己熟悉的,避免只有百度有问题的尴尬局面。但是在我们决定使用的工具之后,才是真正的实施阶段。这里简单介绍下Jenkins。相对来说,我对jenkins比较熟悉,所以在公司会选择这个。充分利用JenkinsshareLibrary,将一些重复的代码分离成单独的方法,方便扩展。对于前后端开发语言相同的项目,最好统一Jenkinsfile,便于管理和维护。Jenkinsfile中涉及的固定参数和可变参数需要固定变量名,命令要规范、通俗易懂。如果是多环境发布,就要做好分类管理和权限控制。不管应用发布是使用HelmChart还是普通的部署文件,为了便于管理,减少混合使用,最好使用同一个。标准很重要,但没有标准。这句话自相矛盾吗?在许多情况下,没有严格的标准。所谓标准因人而异,因地制宜。上面列出的只是我在工作中常用的。只能称为我的标准。为什么要经常积累?主要原因是现在科技发展太快了。在这样一个快速迭代的时代,不可能一下子学习和学习很多东西,所以我们需要经常积累知识,并对这些知识进行统一管理。当您需要问题或想学习时很容易找到。我每天早上阅读大约一个小时的文章。如果我看到好的文章,我会把它们收藏起来,不时阅读。如果是新的知识或者学习到的某项技能,我会把这些东西整理到语雀上,按照一定的目录结构进行归档和分类,方便我需要的时候查询。更多的分享和积累是向内输出,分享是向外输出。内部导出还是比较容易的,因为这些东西都是别人整理出来的,我们自己取用就好。对外输出比较难,因为不是写文章那么简单。如果是在社区分享,一定要把文章写得通俗易懂。你为什么这么说?因为一般人没有太多时间去研究深层次的东西,只是看看而已。如果你需要喜欢它如??果你不喜欢它,就通过它。如果写的太深,很多人都不想看。如果是团队内部分享,不仅要写得通俗易懂,说话也要通俗易懂。我以前的领导曾经对我说:你要把别人当成什么都不懂的白痴。分享的时候不要讲太多高级名词。这些名词除了吹牛之外,实际作用不大。无论是哪种方式或形式,我们都要养成多分享的习惯。当我们到了一定阶段,无论是管理者还是技术专家,都逃不过这个过程。勤奋学习与“不断积累”相得益彰。学习是一辈子的事。无论你在什么年龄、在什么公司、在什么岗位,都应该不断学习。当然,在不同的阶段,你会学到不同的东西。每个月看1-2本书,有纯技术的,有育儿的,有成长的。不管是什么书,我都读了三年多了。我还是读了好书。会多看1-2遍。这个社会分为不同的阶层,但大多数都是底层民众。这种人需要慢慢往上爬。如何保持这种向上的增长趋势?除了运气之外,自己的实力是最主要的,否则运气来临时你是抓不住的。因此,我们需要不断地扩展自己的知识和技能,而学习是其中最重要的部分。写在最后,分享一点个人看法。在工作中,要先规范,再围绕标准拓展,始终保持向上成长的心态,多学习,多积累,多分享。把这些培养成习惯,让习惯成为自然。生活不是得过且过,而是不断进步。本文转载自微信公众号《运维开发故事》【编辑推荐】鸿蒙官方战略合作共建-HarmonyOS技术社区为什么说MQ是互联网架构的解耦神器?普罗米修斯报警规则管理人社部最高法:“996”严重违法!取消“996”,贵公司提上日程了吗?Python硬上C语言,会怎样?CNNIC:我国已成为6G专利申请主要来源国
