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

时间:2019-04-24 08:24:28

标签: deployment kubernetes environment-variables kubernetes-deployment

通过将Deployment的副本现在设置为4,我有4个k8s吊舱。

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作为环境变量传递给不同的Deployment POD。我可以在Deployment的yaml文件中定义它吗?

还是有其他方法可以实现我的目标?(例如,除了k8s中的Deployment之外)

3 个答案:

答案 0 :(得分:1)

对于分布式作业处理,部署不是很好,因为它们没有任何类型的顺序或一致的Pod主机名。您最好使用StatefulSet,因为它们具有一致的命名,例如pod-0,pod-1,pod-2。您可以依靠该主机名索引。

例如,如果您的class_name_idx-是类名列表中类名的索引,则num_replicas-是StatefulSet中副本的数量,而pod_idx-是pod的索引在StatefulSet中,则pod仅在以下情况下运行作业:class_name_idx % num_replicas == pod_idx

不幸的是,无法使用Downward API动态地在Pod中获取StatefulSet副本的数量,因此您可以对其进行硬编码或使用Kubernetes API从集群中获取它。

答案 1 :(得分:1)

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

由于部署是同一应用程序的某些实例,因此可能对您有用的唯一事情是:使用多个部署,每个部署均用于其自己的任务。第一个可以得到Public Async Function startAndStopClickingButton(ByVal sender As Object, ByVal SomeSub As System.Func(Of Task)) As Task startClickingButton(sender) Await SomeSub.Invoke() stopClickingButton(sender) End Function Private Async Sub Button2_Click_1(sender As Object, e As EventArgs) Handles cmdGroupRepeat.Click Await startAndStopClickingButton(sender, Async Function() As Task Await finRepeatOrderingAsync() Dim b = 1 End Sub) End Sub 项,而其他class_name_1class_name_2等。但这不是一个好主意

答案 2 :(得分:0)

我不推荐这种方法,但是最想做的事情是使用有状态集,并使用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

有状态集创建的豆荚将被命名为:

kuard-0
kuard-1
kuard-2

通过这种方式,您可以根据类来命名有状态集,即:class-name,创建的容器将是class-name-0,并且可以将_替换为{{ 1}}。或者只是删除名称以获取结尾的索引。

要获取名称,只需读取环境变量-

此命名是一致的,因此您可以确保名称后始终有0、1、2、3。并且如果HOSTNAME掉线,它将重新创建。

就像我说的那样,我不推荐这种方法,因为您将基础结构绑定到了代码上,并且由于每个服务都是唯一的,并且无法扩展(如果需要),因此添加新实例将获得新的ID。

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