user1591156
user1591156

Reputation: 2005

Run Pod with unique POD name

I have a script which execute on container and i use following command to create my container and exit once execution complete, this is working as per our requirement.

kubectl run -i tmp-pod --rm -n=mynamespace --image=placeholder --restart=Never --overrides="$(cat POD.json)"

it creates the pod and execute my script and terminate the pod itself once completed.

But my above kubectl command runs by many sources so if two source run same time then i get error Error from server (AlreadyExists): pods "POD_NAME" already exists

Is there anyway i can make my pod name unique so parallels run does not conflict with other pod?

here is my POD.json

{
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
        "name": "POD_NAME",
         
    },
    "spec": {
        "restartPolicy": "Never",
        "containers": [
            {
                "name": "POD_NAME",
                "image": "my_IMAGE:2",
                "imagePullPolicy": "Always",
                "command": [
                    "python",
                    "/myscript.py",
                    "INPUT_1",
                    "INPUT_2"
                ]
            }
        ]
    }
}

Upvotes: 1

Views: 930

Answers (2)

Andy Brown
Andy Brown

Reputation: 13009

Use generateName with a prefix instead of name:

{
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
        "generateName": "POD_NAME_PREFIX",
         
    },
    "spec": {
        "restartPolicy": "Never",
        "containers": [
            {
                "name": "POD_NAME",
                "image": "my_IMAGE:2",
                "imagePullPolicy": "Always",
                "command": [
                    "python",
                    "/myscript.py",
                    "INPUT_1",
                    "INPUT_2"
                ]
            }
        ]
    }
}

Upvotes: 0

In your case, as everything is the same, I suggest you run your pod something like this. As far as I know, k8s does not give you a build in solution for this.

kubectl run -i tmp-pod$((1 + $RANDOM % 1000000)) --rm -n=mynamespace --image=placeholder --restart=Never --overrides="$(cat POD.json)"

For documentation purpose, in case the POD.json has changing values: Using JQ, you can read the changing values in the POD.json like this

kubectl run -i tmp-pod$(cat POD.json | jq -r '.metadata.name') --rm -n=mynamespace --image=placeholder --restart=Never --overrides="$(cat POD.json)"

In case the value you are reading is not valid as pod name, you could also simply generate a md5sum based on the POD.json and use a part of that like this. Using cut, to shorten it.

kubectl run -i tmp-pod$(md5sum POD.json | cut -c1-10) --rm -n=mynamespace --image=placeholder --restart=Never --overrides="$(cat POD.json)"

Upvotes: 3

Related Questions