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>
...
<your-app>-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根据命名空间设置部署副本数的主要内容,如果未能解决你的问题,请参考以下文章