Kubernetes根据命名空间设置部署副本数

Posted

技术标签:

【中文标题】Kubernetes根据命名空间设置部署副本数【英文标题】:Kubernetes set deploment number of replicas based on namespace 【发布时间】:2018-09-08 13:22:32 【问题描述】:

我已将 Kubernetes 集群拆分为两个不同的命名空间; staging 和 production,目标是让生产部署有两个副本(对于滚动部署,稍后会自动扩展),而 staging 有一个副本。

除了每个命名空间有一个部署配置,我想知道我们是否可以为每个命名空间设置每个部署的默认副本数?

创建部署配置时,如果不指定副本数,则默认为一个。有没有办法在 production 命名空间上将其默认为两个?

如果没有,是否有推荐的方法来避免每个命名空间都需要部署配置?

这样做的一种方法是在第一次创建后,在生产命名空间中手动将部署扩展到两个副本,但我更愿意跳过任何手动步骤。

【问题讨论】:

【参考方案1】:

不可能在一次部署中为每个命名空间设置不同数量的副本。

但是每个命名空间可以有 2 个不同的部署文件 1,即 <your-app>-production.yaml<your-app>-staging.yaml

在这些描述中,您可以确定您需要的任何自定义值和设置。

举个例子:

<your-app>-production.yaml:

apiVersion: v1
kind: Deployment
metadata:
  name: <your-app>
  namespace: production #Here is namespace
...
spec:
  replicas: 2 #Here is the count of replicas of your application
  template:
    spec:
      containers:
      - name: <your-app-pod-name>
        image: <your-app-image>
...

&lt;your-app&gt;-staging.yaml:

apiVersion: v1
kind: Deployment
metadata:
  name: <your-app>
  namespace: staging #Here is namespace
...
spec:
  replicas: 1 #Here is the count of replicas of your application
  template:
    spec:
      containers:
      - name: <your-app-pod-name>
        image: <your-app-image>
...

【讨论】:

【参考方案2】:

我认为您无法避免进行两次部署,但您可以通过使用 helm 模板 (https://docs.helm.sh/chart_template_guide) 摆脱重复的代码。然后,您可以定义单个部署 yaml,并在使用 if 语句进行部署时替换不同的值。

【讨论】:

【参考方案3】:

创建部署配置时,如果不指定副本数,则默认为一个。有没有办法在生产命名空间中将其默认为两个?

其实有两种方法可以做到,但都涉及到编码。

    Admission Controllers:

这是为字段分配默认值的推荐方式。

在 Kubernetes 中创建对象时,它会通过一些准入控制器,其中之一是 MutatingWebhook。

MutatingWebhook 自 v1.9+ 起已升级为 beta 版本。该准入控制器在实际创建(或修改/删除)对象之前修改(变异)对象,例如,分配某些字段和某些类似任务的默认值。您可以在此处更改最小副本数。

用户必须实现一个准入服务器来接收来自 Kubernetes 的请求并相应地给出修改后的对象作为响应。

这是一个由 Openshift kubernetes-namespace-reservation 实现的准入服务器示例。

    部署控制器:

这相对容易,但有点破解部署过程。

您可以编写一个部署控制器来监视部署,如果进行了任何部署,它将执行一些任务。在这里,您可以使用一些您希望的最小值来更新部署。 可以看官方Sample Pod Controller。

如果它们看起来都有很多事情要做,那么每次部署时最好更仔细地分配字段。

【讨论】:

以上是关于Kubernetes根据命名空间设置部署副本数的主要内容,如果未能解决你的问题,请参考以下文章

KUBERNETES03_命名空间Pod是什么Deployment多副本能力扩缩容自愈或故障转移滚动更新版本回退

Kubernetes 设置命令行的命名空间

Kubernetes 清理 pod、服务、部署等

命名空间的 kubernetes 集群信息

Kubernetes部署Nexus3

从普罗米修斯抓取中排除 Kubernetes 命名空间