Deployment 如何在kubernetes中设置部署副本的不同环境变量
通过将部署副本设置为4,我现在有4个k8s吊舱Deployment 如何在kubernetes中设置部署副本的不同环境变量,deployment,kubernetes,environment-variables,kubernetes-deployment,Deployment,Kubernetes,Environment Variables,Kubernetes Deployment,通过将部署副本设置为4,我现在有4个k8s吊舱 apiVersion: v1 kind: Deployment metadata: ... spec: ... replicas: 4 ... POD将获取数据库中的项目并使用它,数据库中的项目有一列class\u name 现在我想要一个pod只得到一个类名的项目。 例如pod1仅获取class\u name等于class\u name\u 1的项目,以及pod2仅获取class\u name等于class\u name\u 2的项
apiVersion: v1
kind: Deployment
metadata:
...
spec:
...
replicas: 4
...
POD将获取数据库中的项目并使用它,数据库中的项目有一列class\u name
现在我想要一个pod只得到一个类名的项目。
例如pod1
仅获取class\u name
等于class\u name\u 1
的项目,以及pod2
仅获取class\u name
等于class\u name\u 2
的项目
因此,我想将不同的class_name
作为环境变量传递给不同的部署吊舱。我可以在部署的yaml文件中定义它吗
或者有没有其他方法可以实现我的目标?(比如k8s中的部署以外的其他方法)对于分布式作业处理部署来说,部署不是很好,因为它们没有任何类型的排序或一致的pod主机名。最好使用StatefulSet,因为它们有一致的命名,比如pod-0、pod-1、pod-2。您可以依赖该主机名索引
例如,如果您的class\u name\u idx
-是类名列表中类名的索引,num\u replicas
-是StatefulSet中的副本数,pod\u idx
-是StatefulSet中pod的索引,那么pod应该仅在以下情况下运行作业:class\u name\u idx%num\u replicas==pod\u idx
不幸的是,无法使用在pod中动态获取StatefulSet副本的数量,因此您可以对其进行硬编码或使用Kubernetes API从集群获取副本。部署或其他任何操作都无助于实现您的目标。您的目标是某种逻辑,应该通过应用程序中的代码来实现
由于部署是同一应用程序的一些实例,因此唯一对您有用的是:使用多个部署,每个部署用于自己的任务。第一个可以获得类名\u 1
项,而另一个类名\u 2
,类名\u 3
等。但这不是一个好主意,我不推荐这种方法,但最接近您想要做的事情是使用有状态集并使用pod名称作为索引
部署有状态集时,POD将以其有状态集名称命名,如下示例所示:
apiVersion: v1
kind: Service
metadata:
name: kuard
labels:
app: kuard
spec:
type: NodePort
ports:
- port: 8080
name: web
selector:
app: kuard
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: kuard
spec:
serviceName: "kuard"
replicas: 3
selector:
matchLabels:
app: kuard
template:
metadata:
labels:
app: kuard
spec:
containers:
- name: kuard
image: gcr.io/kuar-demo/kuard-amd64:1
ports:
- containerPort: 8080
name: web
statefulset创建的POD将命名为:
kuard-0
kuard-1
kuard-2
通过这种方式,您可以根据类命名有状态集,即:类名
,创建的pod将是class-name-0
,您可以用-
替换
。或者干脆把名字去掉,在末尾得到索引
要获取名称,只需读取环境变量HOSTNAME
此命名是一致的,因此可以确保名称后面始终有0、1、2、3。如果2
下降,它将被重新创建
正如我所说的,我不推荐这种方法,因为您将基础结构与代码绑定在一起,并且无法扩展(如果需要),因为每个服务都是唯一的,添加新实例将获得新ID
更好的方法是为每个类使用一个部署,并将适当的值作为环境变量传递