Kubernetes 10 大技巧和技巧

Kubernetes 10 大技巧和技巧

互联网上有很多参考文献,但有时最简单的建议才是最有价值的。 团队 Mail.ru 的 Kubernetes aaS 翻译的 精选的十个技巧和技巧,该文章的作者在使用 Kubernetes 一年后收集的。 这些提示并未按重要性排序,但我们认为每个人都会找到对自己有用的东西。

使用 Kubernetes 最简单的命令

首先,这也许是使用 Kubernetes 时最简单、最有用的操作。 以下命令启用命令完成 kubectl 在 bash shell 中:

echo "source <(kubectl completion bash)" >> ~/.bashrc

自动完成 kubectl 将被写入 .bashrc 文件,并在每次启动 shell 时自动激活。 这可以加快输入长命令和参数的速度,例如 all-namespaces。 阅读更多内容 Kubernetes bash 帮助.

命名空间中的默认内存和 CPU 限制

如果应用程序编写不正确,例如每秒打开一个与数据库的新连接但从未关闭它,则集群存在内存泄漏。 如果应用程序在部署期间没有设置内存限制,则可能会导致节点故障。

为了防止这种情况,Kubernetes 允许您为每个命名空间设置默认限制。 它们被写入特定命名空间的 yaml 文件中。 以下是此类文件的示例:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

创建这样的 yaml 并应用于任何命名空间。 例如,对于命名空间 limit-example。 现在,部署在此命名空间中的任何容器都将具有 512Mi 的限制,除非为此容器另外设置了另一个单独的限制。

旧版本 Kubernetes 中的垃圾收集

Kubelet 默认情况下启动垃圾收集 var/lib/docker 占用 90% 的可用磁盘空间。 然而,这很好,直到 Kubernetes 1.7 为止,使用的 inode 数量没有默认限制,它对应于文件系统中的文件数量。

可能是你的容器 var/lib/docker 可能只使用了50%的磁盘空间,但可能会耗尽inode,这会给工作人员带来问题。

在 kubelet 1.4 到 1.6 的旧版本中,您必须添加此标志:

--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%

在 1.7 及更高版本中,默认设置此标志。 但是,以前的版本不监控 inode 限制。

Minikube...小而强大的本地 Kubernetes

Minikube 是运行本地 Kubernetes 集群的最简单方法。 它可以通过一个简单的命令启动:

minikube start

运行此命令会导致真正的 Kubernetes 集群在您的计算机上运行。

Kubernetes 10 大技巧和技巧
插图来源

诀窍在于如何构建应用程序并在该集群上本地运行它。 除非特别指示,否则 Docker 映像将在您的计算机上构建,而不是在集群上构建。

为了强制 Docker 将镜像推送到本地 Kubernetes 集群,需要向 docker 机器发出以下命令:

eval $(minikube docker-env)

现在我们可以在本地 Kubernetes 集群上构建应用程序。

不要向所有人授予 kubectl 访问权限

这似乎是显而易见的,但如果多个团队为其应用程序使用同一个集群(这就是 Kubernetes 的创建目的),那么您不应该只给每个人 kubectl。 最好将命令分开,为每个命令分配自己的命名空间,并使用 RBAC 策略限制访问。

为每个 pod 分配访问、读取、创建、删除和其他操作的权限可能会让您感到困惑。 但最重要的是限制对机密的访问,仅允许管理员访问。 通过这种方式,我们将区分那些可以管理集群的人和那些可以简单地部署到集群的人。

管理 Pod 预算

如何保证Kubernetes集群中的应用程序不宕机? PodDisruptionBudget 和 PodDisruptionBudget。

集群会定期更新,节点会被清空。 没有什么是静止的,这就是现实。 每个具有多个实例的部署都应包含一个 PDB (PodDisruptionBudget)。 它是在应用于集群的简单 yaml 文件中创建的。 特定PDB的覆盖区域由标签选择器确定。

注: 仅当预算违规可逆时才考虑 PDB 预算(自愿中断)。 在硬件故障等情况下,PDB 将无法工作。

示例 PDB:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: app-a-pdb
spec:
  minAvailable: 2
  selector:
      matchLabels:
        app: app-a

两个主要参数是 matchLabels и minAvailable。 第一个参数指定预算适用于哪些应用程序。 例如,如果我有带有标签的部署 app: app-a и app: app-b,那么这个 PDB 将只适用于第一个。

参数 minAvailable 清空(清理)节点时要考虑到这一点。 例如,在我们的示例中,在清空期间,所有实例都被逐出 app: app-a,除了两个。

这使您可以控制在任何给定时间应运行的应用程序实例的数量。

应用程序健康监控

这种监控可以通过两种方式实现:使用就绪性或活性测试。

第一个探测(准备情况)确定容器是否准备好接收流量。

第二个(活性)显示容器是否健康或需要重新启动。

只需将相关配置添加到yaml中即可进行部署。 您可以在此处指定超时、延迟时间和重试次数。 查看有关他们的更多详细信息 Kubernetes 文档.

标签无处不在

标签是 Kubernetes 中的基本概念之一。 它们允许对象自由地相互通信,以及基于标签创建查询。 在 Kubernetes 中,您甚至可以转到客户端并观看特定标签的事件。

您几乎可以使用标签执行任何操作,但一个很好的例子是创建多个环境以在同一集群上运行程序。

假设您使用相同的集群 dev и qa。 这意味着您可以申请 app-a,同时在两种环境中工作 qa и dev。 这种情况下,我们可以通过指定适当的参数来单独访问特定环境下的应用实例 environment。 例如, app: app-a и environment: dev 对于一个环境,并且 app: app-a и environment: qa 对于第二个。

这允许您访问应用程序的两个实例,例如同时进行测试。

把事情整理好

Kubernetes 是一个非常强大的系统,但任何系统最终都会因太多进程而陷入困境。 Kubelet 运行您指定的所有进程并检查它自己的进程。

当然,一个孤立的服务不会减慢系统速度,而且 Kubernetes 的设计目的是从头开始扩展。 但是,如果出现一百万个服务而不是一个服务,那么 kubelet 就会开始窒息。

如果由于某种原因您删除了部署(容器、映像等),请确保进行完整的清理。

认识Go

我们把主要建议留到最后。 学习 Go 编程语言。

Kubernetes是用Go开发的,所有扩展都是用Go编写的,并且client-go客户端库也得到官方支持。

它可以用于不同且有趣的事情。 例如,根据您的喜好扩展 Kubernetes 系统。 因此,您可以使用自己的程序来收集数据、部署应用程序或只是清理容器。

学习 Go 编程语言和掌握 client-go 可能是您可以给 Kubernetes 新用户的最重要的建议。

在 Mail.ru 云解决方案的支持下进行翻译

还有什么可读的:

  1. Kubernetes 中的三个级别的自动缩放以及如何有效地使用它们.
  2. Kubernetes工作节点:许多小节点或几个大节点?
  3. 25 个用于部署和管理 Kubernetes 的有用工具.

来源: habr.com

添加评论