我现在通过将部署的副本设置为4来拥有4个k8s的pod。
apiVersion: v1
kind: Deployment
metadata:
...
spec:
...
replicas: 4
...
POD将获取数据库中的项目并使用它,数据库中的项目具有列class_name
。
现在我想要一个吊舱只获得一个class_name
的项目。例如pod1
只获得class_name
等于class_name_1
的项目,而pod2
只获得class_name
等于class_name_2
的项目...
所以我想将不同的class_name
作为环境变量传递给不同的部署POD。我可以在部署的yaml文件中定义它吗?
或者有没有其他方法来实现我的目标?(像k8s中的部署以外的其他方式)
对于分布式作业处理,部署不是很好,因为它们没有任何类型的排序或一致的pod主机名。你最好使用StatefulSet,因为它们具有一致的命名,如pod-0,pod-1,pod-2。您可以依赖该主机名索引。
例如,如果你的class_name_idx
- 是类名列表中类名的索引,num_replicas
- 是StatefulSet中副本的数量,pod_idx
是StatefulSet中pod的索引,那么pod只应在以下情况下运行作业:class_name_idx % num_replicas == pod_idx
。
遗憾的是,使用Downward API无法在pod中动态获取StatefulSet副本的数量,因此您可以对其进行硬编码或使用Kubernetes API从群集中获取它。
部署或其他任何内容都无法帮助您实现目标。您的目标是某种逻辑,应该通过应用程序中的代码实现。
由于部署是同一应用程序的某些实例,因此唯一可能对您有用的事情是:使用多个部署,每个部署用于自己的任务。第一个可以获得class_name_1
项目,而其他class_name_2
,class_name_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
这样你就可以根据类命名有状态集,即:class-name
和创建的pod将是class-name-0
,你可以用_
替换-
。或者只是将名称删除以获得最后的索引。
要获取名称,只需阅读环境变量HOSTNAME
这个命名是一致的,所以你可以确保你的名字后总是有0,1,2,3。如果2
下降,它将被重建。
就像我说的那样,我不推荐这种方法,因为你将基础设施绑定到你的代码,也无法扩展(如果需要),因为每个服务都是唯一的,添加新实例会获得新的ID。
更好的方法是为每个类使用一个部署,并将适当的值作为环境变量传递。