Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Deployment 如何在kubernetes中设置部署副本的不同环境变量_Deployment_Kubernetes_Environment Variables_Kubernetes Deployment - Fatal编程技术网

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

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的项

通过将部署副本设置为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
的项目

因此,我想将不同的
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

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