如何在kubernetes中设置部署副本的不同环境变量

问题描述 投票:1回答:3

我现在通过将部署的副本设置为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中的部署以外的其他方式)

deployment kubernetes environment-variables kubernetes-deployment
3个回答
2
投票

对于分布式作业处理,部署不是很好,因为它们没有任何类型的排序或一致的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从群集中获取它。


2
投票

部署或其他任何内容都无法帮助您实现目标。您的目标是某种逻辑,应该通过应用程序中的代码实现。

由于部署是同一应用程序的某些实例,因此唯一可能对您有用的事情是:使用多个部署,每个部署用于自己的任务。第一个可以获得class_name_1项目,而其他class_name_2class_name_3等。但它不是一个好主意


0
投票

我不推荐这种方法,但最接近你想要的是使用有状态集并使用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。

更好的方法是为每个类使用一个部署,并将适当的值作为环境变量传递。

© www.soinside.com 2019 - 2024. All rights reserved.