十大Kubernetes技巧和窍门



Internet上有很多参考文献,但有时最简单的技巧会变得最有价值。Mail.ru Kubernetes aaS团队翻译了十个技巧和窍门,这些技巧和技巧是作者与Kubernetes合作一年后收集的。提示未按重要性排序,但我们认为每个人都会发现一些对自己有用的东西。

与Kubernetes合作最简单的团队


首先,也许是使用Kubernetes的最简单,最有用的操作。以下命令kubectl在bash shell中启用命令的自动补全功能

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

自动完成功能kubectl将被写入.bashrc文件,并在每次启动外壳程序时自动激活。这样可以加快一组较长的命令和参数,例如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中的垃圾回收


默认情况下,当var / lib / docker占用90%的可用磁盘空间时,Kubelet将启动垃圾回收很好,但是,在Kubernetes 1.7之前,对使用的inode数(inodes)没有默认限制,它对应于文件系统中的文件数。

潜在地,您的var / lib / docker容器只能使用50%的磁盘空间,但是inode可能会用完,这会给工作人员带来麻烦。

在从1.4到1.6的较旧版本的kubelet中,您将必须添加以下标志:

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

在1.7及更高版本中,默认情况下设置此标志。但是,以前的版本没有遵循inode的限制。

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


Minikube是启动本地Kubernetes集群的最简单方法。它从一个简单的命令开始:

minikube start

由于此命令,您的计算机上正在运行真实的Kubernetes集群。


插图来源

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

为了强制Docker将映像发送到本地Kubernetes集群,为Docker计算机提供了以下命令:

eval $(minikube docker-env)

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

不要让kubectl访问所有人


这似乎很明显,但是如果几个团队在他们的应用程序中使用了相同的集群(已为其创建Kubernetes),则不应该将其分配给所有人kubectl最好通过为每个团队分配自己的名称空间并通过RBAC策略来限制访问权限来分离团队。

通过为每个窗格注册访问,读取,创建,删除和其他操作的权限,您可能会感到困惑。但是最主要的是限制对机密的访问,仅允许管理员访问。因此,我们区分了可以管理集群的人和可以简单地在集群中进行部署的人。

管理炉膛预算


如何确保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

两个主要参数是matchLabelsminAvailable第一个参数指示哪些应用程序有预算。例如,如果我使用app: app-a标签进行部署app: app-b,则此PDB仅适用于第一个。清空(清洁)设备时

minAvailable考虑该参数例如,在我们的示例中,在破坏期间app: app-a除两个实例外,所有实例都被替换了

这使您可以控制在任何给定时间应运行多少个应用程序实例。

应用程序健康监控


可以通过两种方式进行此类监视:使用就绪或活动样本。

首次就绪测试确定容器是否准备好接收流量。

第二个(活动)显示容器是在工作还是需要重新启动。

只需将适当的配置添加到yaml中即可进行部署。您可以在此处指定超时,延迟时间和重试次数。有关更多详细信息,请参见Kubernetes文档

无处不在的标签


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

借助标签,您几乎可以完成所有事情,但是一个很好的例子就是为在一个集群中运行程序创建多个环境。

假设您针对dev使用相同的集群qa。这意味着你可以有一个应用程序app-a在两种环境下同时运行qadev。在这种情况下,我们可以通过指定适当的参数来分别访问特定环境中的应用程序实例environment。例如,app: app-aenvironment: dev对于一个单一的环境,以及app: app-aenvironment: qa第二。

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

整理


Kubernetes是一个非常强大的系统,但是任何系统最终都可能陷入大量进程中。Kubelet将启动您指定的所有过程和检查以及您自己的检查。

当然,一个孤立的服务不会降低系统速度,而Kubernetes最初是为扩展而设计的。但是,如果出现一百万而不是一项服务,则该kubelet开始阻塞。

如果出于某种原因要删除部署(容器,映像等),请确保完全清除它。

了解去


最后,我们保存了主要建议。学习Go编程语言。

Kubernetes是在Go上开发的,所有扩展都是在Go上编写的,并且正式支持client-go客户端库。

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

学习Go编程语言并掌握客户端编程可能是您可以给Kubernetes新手用户最重要的技巧。

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


All Articles