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

how to pass environment variable in kubectl deployment?

我正在为 django webapp 设置 kubernetes。

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

kubectl create -f deployment.yml -l key1=value1 

我收到如下错误

error: no objects passed to create

能够成功创建部署,如果我在创建部署时删除环境变量-l key1=value1。

deployment.yaml如下

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

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

您不能将变量传递给 "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/

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

中添加这些细节

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

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

这将导出容器内的环境变量。

导出环境变量的另一种方法是使用 kubectl 运行(不推荐),因为它很快就会被淘汰。您可以使用以下命令:

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

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

的部署 nginx

按照以下步骤操作

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

我为此使用了 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 -

不确定您 OS 使用什么 运行 这个。在 macOS 上,envsubst 安装如下:

brew install gettext
brew link --force gettext 

文件:./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/,您可以在 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 环境变量的图像:

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

yq 在 MacPorts 上可用(截至 21 年 4 月 19 日 v4.4.1)sudo port install yq

我的解决方案是

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

我遇到了同样的问题。我创建了一个 python 脚本来更改 simple/complex 或向 YAML 文件添加值。 在您描述的类似情况下,这变得非常方便。此外,切换到 python 域可以允许更复杂的场景。

此要点提供了代码及其使用方法。 https://gist.github.com/washraf/f81153270c80b0b4ecf90a53872abde7