我正在为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
在创建部署时导致上述错误的原因是什么?
答案 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
答案 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"