如何在 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
我正在为 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
按照以下步骤操作
创建测试-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