Kubernetes 如何在kubectl部署中传递环境变量?
我正在为django webapp设置kubernetes设置 我在创建部署时传递环境变量,如下所示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
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也是我使用的,它(可能?)在每个发行版中。