众所周知,Kubernetes很难! 如下是在生产中使用它应遵循的一些最佳实践。遵循这些步骤可以确保更高的安全性和生产效率。java
毫无疑问,DevOps已经走过了一段很长的路! 借助于Kubernetes编排平台使得公司比以往更快地发布软件。随着容器用于构建和发布软件的使用量不断增长,Kubernetes已经成为事实上的容器编排工具标准,在软件企业中很是受欢迎。web
Kubernetes具备优秀的特性,好比:支持可扩展、零停机部署、服务发现、自动重启和回滚功能等。要大规模管理容器部署,Kubernetes是必须的。它支持灵活地分配资源和工做负载。毫无疑问,生产环境中的Kubernetes是一个很好的解决方案,但须要花费一些时间来设置和熟悉这个工具。因为如今许多公司都但愿在生产中使用Kubernetes,所以有必要考虑一些最佳实践。在本文中,咱们将讨论一些Kubernetes的最佳实践。后端
生产环境中的Kubernetes
Kubernetes是一个复杂而且学习曲线陡峭的编排工具,但它具备丰富的功能。生产操做应尽量当心谨慎处理。若是您面临内部人才短缺的问题,您能够将其外包给PaaS供应商,为您提供全部最佳实践。但假设您在生产中独自管理Kubernetes。在这种状况下,关注最佳实践是很是重要的,特别是关于可观察性、日志记录、集群监控和安全配置。安全
咱们不少人都知道,在生产环境中运行容器不是一件容易的事情。它须要大量的工做和计算资源等等。市场上有许多编排平台,但Kubernetes已经得到了巨大的吸引力和大多数云提供商的支持。微信
总之——Kubernetes、集装箱化和微服务都是美好的基础设施,但同时带来了安全挑战。Kubernetes Pod能够在全部基础设施类之间快速切换,从而致使Pod之间的内部流量增长,引起安全隐患。此外,Kubernetes的攻击面一般更大。您必须考虑到Kubernetes的高度动态且全新的环境没法与旧版安全工具完美融合的问题。网络
Gartner预测,到2022年,超过75%的全球组织将在生产中运行集装箱应用程序,而目前这一比例还不到30%。到2025年,超过85%的全球组织将在生产中推进集装箱应用,较2019年的不到35%有显著增加。本地云应用程序须要高度的基础设施自动化、DevOps和专门的操做技能,这些在普通IT组织中很难找到这些技能。负载均衡
因此必须使用Kubernetes的一些策略,在安全性、监控、网络、治理、存储、容器生命周期管理和平台选择方面应用最佳实践。下面让咱们来看看Kubernetes的一些生产最佳实践。编辑器
在生产中运行Kubernetes并不容易; 有如下几个方面须要注意。分布式
是否使用存活探针和就绪探针进行健康检查?
管理大型分布式系统可能会很复杂,特别是当出现问题时,咱们没法及时获得通知。为了确保应用实例正常工做,设置Kubernetes健康检查相当重要。微服务
经过建立自定义运行健康检查,能够有效避免分布式系统中僵尸服务运行,具体能够根据环境和须要对其进行调整。
Readiness-就绪探针
就绪探针的目的是让Kubernetes知道该应用是否已经准备好为流量服务。Kubernetes将始终确保准备就绪探针经过以后开始分配服务,将流量发送到Pod。
Liveness-存活探针
你怎么知道你的应用程序是活的仍是死的?存活探针可让你作到这一点。若是你的应用死了,Kubernetes会移除旧的Pod并用新Pod替换它。
Resource Management- 资源管理
为单个容器指定资源请求和限制是一个很好的实践。

另外一个好的实践是将Kubernetes环境划分为不一样团队、部门、应用程序和客户机的独立名称空间。
Kubernetes资源使用状况
Kubernetes资源使用指的是容器/pod在生产中所使用的资源数量。
所以,密切关注pods的资源使用状况是很是重要的。一个明显的缘由是成本,由于越高的资源利用证实越少的资源浪费。
Resource utilization资源利用率
Ops团队一般但愿优化和最大化pods消耗的资源百分比。资源使用状况是Kubernetes环境实际优化程度的指标之一。
您能够认为优化后的Kubernetes环境中运行的容器的平均CPU等资源利用率是最优的。
启用RBAC
RBAC表明基于角色的访问控制。它是一种用于限制系统/网络上的用户和应用程序的访问和准入的方法。

他们从Kubernetes 1.8版本引入了RBAC。使用rbac.authorization.k8s RBAC用于建立受权策略。
在Kubernetes中,RBAC用于受权,使用RBAC,您将可以授予用户、账户、添加/删除权限、设置规则等权限。所以,它基本上为Kubernetes集群添加了额外的安全层。RBAC限制谁能够访问您的生产环境和集群。
集群置备和负载均衡
生产级Kubernetes基础设施一般须要考虑某些关键方面,例如高可用性、多主机、多etcd Kubernetes集群等。此类集群的配置一般涉及到Terraform或Ansible等工具。

一旦集群都设置好了,而且为运行应用程序建立了pods,这些pods就配备了负载平衡器;这些负载均衡器将流量路由到服务。开源的Kubernetes项目并非默认的负载平衡器;所以,它须要与NGINX Ingress controller与HAProxy或ELB等工具集成,或任何其余工具,扩大Kubernetes的Ingress插件,以提供负载均衡能力。
给Kubernetes对象添加标签

标签就像附加到对象上的键/值对,好比pods。标签是用来标识对象的属性的,这些属性对用户来讲是重要的和有意义的。在生产中使用Kubernetes时,不能忽视的一个重要问题是标签;标签容许批量查询和操做Kubernetes对象。标签的特殊之处在于,它们还能够用于识别Kubernetes对象并将其组织成组。这样作的最佳用例之一是根据pod所属的应用程序对它们进行分组。在这里,团队能够构建并拥有任意数量的标签约定。
配置网络策略
使用Kubernetes时,设置网络策略相当重要。

网络策略只不过是一个对象,它使你可以明确地声明和决定哪些流量是容许的,哪些是不容许的。这样,Kubernetes将可以阻止全部其余不想要的和不符合规则的流量。在咱们的集群中定义和限制网络流量是强烈推荐的基本且必要的安全措施之一。
Kubernetes中的每一个网络策略都定义了一个如上所述的受权链接列表。不管什么时候建立任何网络策略,它所引用的全部pod都有资格创建或接受列出的链接。简单地说,网络策略基本上就是受权和容许链接的白名单——一个链接,不管它是到
仍是从
pod,只有在应用于pod的至少一个网络策略容许的状况下才被容许。
集群监控和日志记录
在使用Kubernetes时,监控部署是相当重要的。确保配置、性能和流量保持安全更是重要。若是不进行日志记录和监控,就不可能诊断出发生的问题。为了确保合规性,监视和日志记录变得很是重要。

在进行监视时,有必要在体系结构的每一层上设置日志记录功能。生成的日志将帮助咱们启用安全工具、审计功能和分析性能。
从无状态应用程序开始
运行无状态应用要比运行有状态应用简单得多,但随着Kubernetes运营商的不断增加,这种想法正在改变。对于刚接触Kubernetes的团队来讲,建议首先使用无状态应用程序。
建议使用无状态后端,这样开发团队就能够确保不存在长时间运行的链接,从而增长了扩展的难度。使用无状态,开发人员还能够更有效地、零停机部署应用程序。
人们广泛认为,无状态应用程序能够方便地根据业务须要进行迁移和扩展。
启动自动扩缩容
Kubernetes有三种用于部署的自动伸缩功能:水平pod自动伸缩(HPA)、垂直pod自动伸缩(VPA)和集群自动伸缩。
水平pod autoscaler根据感知到的CPU利用率自动扩展deployment、replicationcontroller, replicaset, statefulset的数量。
Vertical pod autoscaling为CPU和内存请求和限制推荐合适的值,它能够自动更新这些值。
Cluster Autoscaler扩展和缩小工做节点池的大小。它根据当前的利用率调整Kubernetes集群的大小。
控制镜像拉取来源
控制在集群中运行全部容器的镜像源。若是您容许您的Pod从公共资源中拉取镜像,您就不知道其中真正运行的是什么。
若是从受信任的注册表中提取它们,则能够在注册表上应用策略以提取安全和通过认证的镜像。
持续学习
不断评估应用程序的状态和设置,以学习和改进。例如,回顾容器的历史内存使用状况能够得出这样的结论:咱们能够分配更少的内存,在长期内节省成本。
保护重要服务
使用Pod优先级,您能够决定设置不一样服务运行的重要性。例如,为了更好的稳定性,你须要确保RabbitMQ pod比你的应用pod更重要。或者你的入口控制器pods比数据处理pods更重要,以保持服务对用户可用。
零停机时间
经过在HA中运行全部服务,支持集群和服务的零停机升级。这也将保证您的客户得到更高的可用性。
使用pod反亲和性来确保在不一样的节点上调度一个pod的多个副本,从而经过计划中的和计划外的集群节点停机来确保服务可用性。
使用pod Disruptions策略,不惜一切代价确保您有最低的Pod副本数量!
计划失败
硬件最终会失败,软件最终会运行。--(迈克尔·哈顿)
结论
众所周知,Kubernetes实际上已经成为DevOps领域的编排平台标准。Kubernetes从可用性、可伸缩性、安全性、弹性、资源管理和监控的角度来应对生产环境产生的风暴。因为许多公司都在生产中使用Kubernetes,所以必须遵循上面提到的最佳实践,以顺利和可靠地扩展应用程序。
推荐
本文分享自微信公众号 - 云原生技术爱好者社区(programmer_java)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。