Kubernetes 如何在kubectl部署中传递环境变量?

Kubernetes 如何在kubectl部署中传递环境变量?,kubernetes,kubectl,Kubernetes,Kubectl,我正在为django webapp设置kubernetes设置 我在创建部署时传递环境变量,如下所示 kubectl create -f deployment.yml -l key1=value1 我得到的错误如下 error: no objects passed to create 如果在创建部署时删除env变量-l key1=value1,则能够成功创建部署 deployment.yaml如下所示 #Deployment apiVersion: extensions/v1beta1 k

我正在为django webapp设置kubernetes设置

我在创建部署时传递环境变量,如下所示

kubectl create -f deployment.yml -l key1=value1 
我得到的错误如下

error: no objects passed to create
如果在创建部署时删除env变量-l key1=value1,则能够成功创建部署

deployment.yaml如下所示

#Deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
 labels: 
   service: sigma-service
 name: $key1

创建部署时导致上述错误的原因是什么?

不能将变量传递给“kubectl create-f”。YAML文件应该是没有变量的完整清单。您也不能使用“-l”标志来“kubectl创建-f”

如果要将环境变量传递给pod,应执行以下操作:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        env:
        - name: MY_VAT
          value: MY_VALUE
        ports:
        - containerPort: 80

请阅读此处的更多信息:

这不是使用部署的正确方法,您不能在yaml和kubectl命令中提供一半的详细信息。如果要在部署中传递环境变量,应在
部署spec.template.spec
中添加这些详细信息:

您应该将以下块添加到deployment.yaml中

spec:
  containers:
  - env:
    - name: var1
      value: val1
这将导出容器内的环境变量

导出环境变量的另一种方法是使用kubectl run(不可取),因为它很快就会贬值。您可以使用以下命令:

 kubectl run nginx --image=nginx --restart=Always --replicas=1 --env=var1=val1
上述命令将使用副本1和环境变量
var1=val1

创建部署nginx,请执行以下步骤

创建test-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: MYAPP
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
使用sed命令,可以在部署时更新部署名称

sed -e 's|MYAPP|my-nginx|g' test-deploy.yaml | kubectl apply -f -
我为此使用了envsubs()。创建一个
部署。yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: $NAME
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: MYAPP
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
      ports:
      - containerPort: 80
apiVersion: v1
kind: Service
metadata:
  name: MYAPP
  labels:
    app: nginx
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: nginx
resources:
- deployment.yaml
- service.yaml
然后:


文件:
/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: $NAME
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: MYAPP
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
      ports:
      - containerPort: 80
apiVersion: v1
kind: Service
metadata:
  name: MYAPP
  labels:
    app: nginx
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: nginx
resources:
- deployment.yaml
- service.yaml
文件:
/service.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: $NAME
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: MYAPP
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
      ports:
      - containerPort: 80
apiVersion: v1
kind: Service
metadata:
  name: MYAPP
  labels:
    app: nginx
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: nginx
resources:
- deployment.yaml
- service.yaml
文件:
/kustomization.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: $NAME
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: MYAPP
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
      ports:
      - containerPort: 80
apiVersion: v1
kind: Service
metadata:
  name: MYAPP
  labels:
    app: nginx
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: nginx
resources:
- deployment.yaml
- service.yaml
如果正在使用,则可以在CI中执行以下操作:

sh '( echo "images:" ; echo "  - name: $IMAGE" ; echo "    newTag: $VERSION" ) >> ./kustomization.yaml'
sh "kubectl apply --kustomize ."
请尝试以下内容

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: kdpd00201
  name: frontend
  labels:
    app: nginx
spec:
  replicas: 6
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: frontend
        image: ifccncf/nginx:1.14.2
        ports:
        - containerPort: 8001
        env:
           - name: NGINX_PORT
             value: "8001"

我选择了
yq
,因为它是yaml感知的,可以精确控制文本替换的发生位置

要从bash env var设置图像,请执行以下操作:

export IMAGE="your_image:latest"
yq eval '.spec.template.spec.containers[0].image = "'$IMAGE'"' manifests/daemonset.yaml | kubectl apply -f -

yq
在MacPorts上可用(从19/04/21 v4.4.1开始),使用
sudo-port安装yq

我需要动态更改部署的名称,以便需要将环境变量传递给deployment@Vasily Angapovagain,使用“kubectl create-f”是不可能的。相反,你可以使用“kubectl run”和参数,或者使用头盔图表。我如何使用头盔实现目标?@Vasily AngapovIt的话题太宽,无法讨论。您可以在这里阅读更多内容:如果您正在使用某种CI/CD怎么办?你怎么说要部署的映像的witch版本或标记呢?根据示例:
kubectl运行hazelcast--image=hazelcast/hazelcast--env=“DNS\u DOMAIN=cluster”--env=“POD\u NAMESPACE=default”
Sed也是我使用的,它(可能?)在每个发行版中。