web-dev-qa-db-ja.com

スクリプトを含めてkubernetesyamlで実行するにはどうすればよいですか?

Kubernetes yaml(helloworld.yaml)で簡単なバッチを実行する方法は次のとおりです。

...
image: "ubuntu:14.04"
command: ["/bin/echo", "hello", "world"]
...

Kubernetesでは、次のようにデプロイできます。

$ kubectl create -f helloworld.yaml

このようなバッチスクリプト(script.sh)があるとします。

#!/bin/bash
echo "Please wait....";
sleep 5

Script.shをkubectl create -fに含めて、スクリプトを実行できるようにする方法はありますか。 helloworld.yamlが次のように編集されたとします。

...
image: "ubuntu:14.04"
command: ["/bin/bash", "./script.sh"]
...
7
smftr

私はOpenShiftでこのアプローチを使用しているので、Kubernetesにも適用できるはずです。

スクリプトをconfigmapキー/値に入れ、このconfigmapをボリュームとしてマウントし、ボリュームからスクリプトを実行してみてください。

apiVersion: batch/v1
kind: Job
metadata:
  name: hello-world-job
spec:
  parallelism: 1    
  completions: 1    
  template:         
    metadata:
      name: hello-world-job
    spec:
      volumes:
      - name: hello-world-scripts-volume
        configMap:
          name: hello-world-scripts
      containers:
      - name: hello-world-job
        image: Alpine
        volumeMounts:
          - mountPath: /hello-world-scripts
            name: hello-world-scripts-volume
        env:
          - name: HOME
            value: /tmp
        command:
        - /bin/sh
        - -c
        - |
          echo "scripts in /hello-world-scripts"
          ls -lh /hello-world-scripts
          echo "copy scripts to /tmp"
          cp /hello-world-scripts/*.sh /tmp
          echo "apply 'chmod +x' to /tmp/*.sh"
          chmod +x /tmp/*.sh
          echo "execute script-one.sh now"
          /tmp/script-one.sh
      restartPolicy: Never
---
apiVersion: v1
items:
- apiVersion: v1
  data:
    script-one.sh: |
      echo "script-one.sh"
      date
      sleep 1
      echo "run /tmp/script-2.sh now"
      /tmp/script-2.sh
    script-2.sh: |
      echo "script-2.sh"
      sleep 1
      date
  kind: ConfigMap
  metadata:
    creationTimestamp: null
    name:  hello-world-scripts
kind: List
metadata: {}
12
Aldjinn