脚本编辑正在运行的Kubernetes容器

时间:2019-12-16 19:16:57

标签: kubernetes kubectl

我有一个由部署定义的pod,并且yaml定义存储在我的代码库中。有时候我想为Pod /容器配置一个卷挂架,因此拥有一个可以启用此功能的脚本会很棒。我知道我可以使用kubectl edit打开编辑器并执行此操作(然后重新启动pod),但是如果我们的开发人员可以简单地执行类似./our_scripts/enable_mount.sh的操作,则将更适用。

一种选择是简单地拥有一个YAML定义的副本,并在删除另一个时创建/应用该副本,但是最好就地修改现有的副本。

有没有办法做到这一点? kubectl edit上有没有我要实现的标志吗?

3 个答案:

答案 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以及要应用的新对象:

.

您可以猜到它只是

的“连环画”
  • pod_with_volume.yaml
  • service.yaml

此方法的唯一特点是您要引用的文件应位于$ 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命令

希望您会发现此答案有用:)