用了3年Kubernetes,我们得到的5个教训

链接:https://mp.weixin.qq.com/s/6n5OAvvejmMHQxn6roN1kQ

1、JAVA 应用的内存限制

如果我们必须选择 Java,请确保版本为 11 或更高。并且 Kubernetes 的内存限制要在 JVM 最大堆内存(-Xmx)的基础上增加 1GB,以留有余量。也就是说,如果 JVM 使用 8GB 的堆内存,则我们对该应用程序的 Kubernetes 资源限制为 9GB。

2、k8s 集群的生命周期管理,升级

如果你打算使用 Kubernetes 或已经在使用 Kubernetes,请考虑生命周期活动以及解决这一问题的方案。构建和运行集群相对容易一些,但是生命周期维护是一个全新的体验,具有多个活动组件。

3、构建和部署(重要)

在准备重新设计整个构建和部署流水线之前, 我们的构建过程和部署必须经历 Kubernetes 世界的完整转型。不仅在 Jenkins 流水线中进行了大量的重构,而且还使用了诸如 Helm 之类的新工具,策划了新的 git 流和构建、标签化 docker 镜像,以及版本化 helm 的部署 chart。

你需要一种策略来维护代码,以及 Kubernetes 部署文件、Docker 文件、Docker 镜像、Helm chart,并设计一种方法将它们组合在一起。

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

应用程序代码及其 helm chart 放在各自的 git 存储库中。这使我们可以分别对它们进行版本控制(语义版本控制)。

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

对于我们未构建或修改代码的系统应用程序,例如 Apache Kafka 或 Redis ,工作方式有所不同。也就是说,我们没有两个 git 存储库,因为 Docker 标签只是 Helm chart 版本控制的一部分。如果我们更改了 docker 标签以进行升级,则会升级 chart 标签的主要版本。

4、存活和就绪探针(双刃剑)

我用自己的话总结一下,就是比如 kafka 崩溃重启时,需要时间修复索引,此时 k8s 集群 存活探针不断侦测失败,并发送重启信号,阻止了 kafka 的启动,只能通过评估每个服务的重启时间,并设置合理的 initialDelaySeconds 值取去避免此类问题。

5、是否一定需要 k8s

三年过去了,我们每天仍然在继续发现和学习新知识。它是一个复杂的平台,具有自己的一系列挑战,尤其是在构建和维护环境方面的开销。它将改变你的设计、思维、架构,并需要提高技能和扩大团队规模以适应转型。

但是,如果你在云上并且能够将 Kubernetes 作为一种“服务”使用,它可以减轻平台维护带来的大部分开销,例如“如何扩展内部网络 CIDR?”或“如何升级我的 Kubernetes 版本?”

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

Kubernetes 转型并不便宜,为此支付的价格必须确实证明“你的”用例的必要性及其如何利用该平台。如果可以,那么 Kubernetes 可以极大地提高你的生产力。

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

Kubernetes 分层命名空间

链接:https://mp.weixin.qq.com/s/de6paBBbjxeM7L3t709CYw

命名空间(namespace)构成了 Kubernetes 控制平面安全性和共享策略的基础。例如,默认情况下,RBAC、网络策略和资源配额(ResourceQuota)都适用于命名空间,另外诸如 Secret、服务账户(ServiceAccount)以及 Ingress 之类的对象都可以在任何一个命名空间中自由使用,并且能与其他命名空间完全隔离。

命名空间可以用来代表所有权,而且只有超级管理员才能创建命名空间;

限制:当一个团队拥有很多个包含不同 secret 和资源配额的微服务时,应该将这些微服务放在不同的命名空间中,以进行相互隔离,但是这些微服务都属于同一团队,所以是希望 secret 等对象可以共享的。

分层命名空间:分层命名空间由 Kubernetes 分层命名空间控制器(Hierarchical Namespace Controller,HNC)控制。HNC包含两个组件:

  • 控制器:该控制器在集群上运行,以管理子命名空间、传播策略对象、确保层级结构合法并管理扩展点。
  • kubectl 插件:该插件叫 kubectl-hns,可以使用户与控制器进行交互。

首次部署 Kubernetes 应用,总会忽略这些事

链接:https://mp.weixin.qq.com/s/_d-yZFjydgiGF90cMQ1P5Q

1、配置 Pod 请求与限制(cpu 和 内存)

  • 使用负载测试工具,我们可以模拟基准流量水平,并观察 Pod 的资源使用情况(包括内存与 CPU)。
  • 我们将 Pod 请求设置在极低水平,同时将 Pod 资源限制保持在请求值的约 5 倍,而后观察其行为。当请求过低时,进程将无法启动,并时常引发神秘的 Go 运行时错误。

2、配置 Liveness 与 Readiness 探针

3、设置默认 Pod 网络策略

4、通过 Hooks 与 Init 容器执行自定义行为

5、内核调优

实时更新ing…

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐