我有一个由部署定义的pod,并且yaml定义存储在我的代码库中。有时候我想为Pod /容器配置一个卷挂架,因此拥有一个可以启用此功能的脚本会很棒。我知道我可以使用kubectl edit
打开编辑器并执行此操作(然后重新启动pod),但是如果我们的开发人员可以简单地执行类似./our_scripts/enable_mount.sh
的操作,则将更适用。
一种选择是简单地拥有一个YAML定义的副本,并在删除另一个时创建/应用该副本,但是最好就地修改现有的副本。
有没有办法做到这一点? kubectl edit
上有没有我要实现的标志吗?
答案 0 :(得分:2)
使用Declarative Management of Kubernetes Objects Using Kustomize。您的代码库中已经有一个deployment.yaml
清单。现在,将其移动到base/deployment.yaml
并创建一个overlays/with-mount/deployment-with-mount.yaml
,该{<1>可以在需要时用安装文件覆盖。
要部署基础,请使用
kubectl apply -k base/deployment.yaml
,并且当您要进行部署并进行覆盖以进行装载时,请使用
kubectl apply -k overlays/with-mount/deployment-with-mount.yaml
答案 1 :(得分:1)
您要在环境中的不同条件下不同地部署pod。头盔允许您这样做。您可以为广告连播使用一个模板,然后传递根据您要运行的环境或条件而变化的值。
helm install --values ./k8s/charts/values1.yaml <chartname>
或
helm install --values ./k8s/charts/values2.yaml <chartname>
如果只需要模板,那么使用头盔似乎会涉及更多。潜在的其他解决方案可能是使用操纵yaml的python脚本 以下是适用于python 2.7的快速示例
import yaml
document = """
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
name: myapp
spec:
containers:
- name: myapp
image: nginx
"""
volumemount = True
podSpec = yaml.load(document)
if volumemount:
volumeSpecDoc = """
volumes:
- configMap:
name: app-config
name : app-config-volume
"""
volumeSpec = yaml.load(volumeSpecDoc, Loader=yaml.FullLoader)
podSpec['spec'].update(volumeSpec)
containerVolumeMountDoc = """
volumeMounts:
- name: app-config-volume
mountPath: /etc/config
"""
containerVolumeMount = yaml.load(containerVolumeMountDoc,Loader=yaml.FullLoader)
original = podSpec['spec']['containers'][0]
original.update(containerVolumeMount)
podSpec['spec']['containers'][0] = original
print yaml.dump(podSpec)
答案 2 :(得分:1)
我想详细说明@jonas的回复。
message
的“高级”命令之一是kubectl
。
它从目录或远程URL构建一个Kustomization目标。
从v1.14起可用
它支持几种类型的功能
我知道我可以使用
>kustomize
打开编辑器并执行此操作(然后重新启动pod),但是如果我们的开发人员可以简单地执行类似kubectl edit
的操作,则将更适用。
“ 组成和自定义资源集合”功能看起来就像您在这种情况下可能考虑的那样。
如果您想调出单个Pod(单个yaml文件),则可能会过大。但是,如果您需要做一些更复杂的事情,这将非常有用:)
./our_scripts/enable_mount.sh
如果运行$ ls -go
total 28
-rw-r--r-- 1 49 Dec 17 13:23 kustomization.yaml
-rw-r--r-- 1 119 Dec 17 13:22 pod_no_volume.yaml
-rw-r--r-- 1 275 Dec 17 13:22 pod_with_volume.yaml
-rw-r--r-- 1 160 Dec 17 13:19 service.yaml
$ cat kustomization.yaml
resources:
- pod_with_volume.yaml
- service.yaml
(此处kubectl kustomize <dir>
代表目录,则kustomization.yaml位于其中,在我的示例中,它只是一个dir
),您可以看到出现了kubectl以及要应用的新对象:
.
您可以猜到它只是
的“连环画”此方法的唯一特点是您要引用的文件应位于$ kubectl kustomize .
apiVersion: v1
kind: Service
metadata:
labels:
run: my-nginx
name: my-nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx
---
apiVersion: v1
kind: Pod
metadata:
name: test-nginx-with-volume
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- mountPath: /etc/nginx/conf.d/
name: nginx-path
volumes:
- hostPath:
path: /tmp/somePath/conf.d
name: nginx-path
所在的目录中或下方。
如您所见,kustomization.yaml
只能调用格式正确的./our_scripts/enable_mount.sh
命令
希望您会发现此答案有用:)