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

时间:2019-05-06 10:56:30

标签: 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
kind: Deployment
metadata: 
 labels: 
   service: sigma-service
 name: $key1

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

8 个答案:

答案 0 :(得分:2)

我为此使用了envsubst(https://www.gnu.org/software/gettext/manual/html_node/envsubst-Invocation.html)。创建一个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

然后:

export NAME=my-test-nginx
envsubst < deployment.yaml | kubectl apply -f -

不确定您要使用哪个操作系统来运行它。在macOS上,envsubst的安装方式如下:

brew install gettext
brew link --force gettext 

答案 1 :(得分:0)

您不能将变量传递给“ kubectl create -f”。 YAML文件应是不带变量的完整清单。同样,您不能使用“ -l”标志来“ kubectl create -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

在此处了解更多信息:https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

答案 2 :(得分:0)

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

您应将以下代码块添加到您的deployment.yaml

spec:
  containers:
  - env:
    - name: var1
      value: val1

这会将您的环境变量导出到pod中。

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

 kubectl run nginx --image=nginx --restart=Always --replicas=1 --env=var1=val1

上面的命令将创建一个具有副本1和环境变量var1=val1

的部署Nginx。

答案 3 :(得分:0)

按照以下步骤

创建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 -

答案 4 :(得分:0)

文件:./deployment.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

文件:./service.yaml

apiVersion: v1
kind: Service
metadata:
  name: MYAPP
  labels:
    app: nginx
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: nginx

文件:./kustomization.yaml

resources:
- deployment.yaml
- service.yaml

如果您使用的是https://kustomize.io/,则可以在配置项中执行以下操作:

sh '( echo "images:" ; echo "  - name: $IMAGE" ; echo "    newTag: $VERSION" ) >> ./kustomization.yaml'
sh "kubectl apply --kustomize ."

答案 5 :(得分:0)

我选择了 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 install yq

答案 6 :(得分:0)

我的解决方案是

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: frontend
  name: frontend
  namespace: kdpd00201
spec:
  replicas: 4
  selector:
    matchLabels:
      app: frontend
  strategy: {}
  template:
    metadata:
      creationTimestamp: null      
      labels:
        app: frontend
    spec:
      containers:
      - env: # modified level
        - name: NGINX_PORT
          value: "8080"
        image: lfccncf/nginx:1.13.7
        name: nginx
        ports:  
          - containerPort: 8080

答案 7 :(得分:-1)

请尝试关注

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"