I am trying to create a Pod in Kubernetes using curl.
This is the YAML:
cat > nginx-pod.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx1
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
EOFI have token with permissions to do it and I wrote the following curl command:
curl -k -v -X POST -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json;charset=utf-8' https://127.0.0.1:6443/api/v1/namespaces/default/pods --data '{"name":"","namespace":"default","content":"apiVersion: v1\nkind: Pod\nmetadata:\n name: nginx1\nspec:\n containers:\n - name: nginx\n image: nginx:1.7.9\n ports:\n - containerPort: 80\n","validate":true}'Which should be equivalent to the nginx-pod.yaml file.
The YAML is ok because when I runkubectl create -f nginx.pod.yaml it creates it.
But when I tried to run it with curl I received:
< Content-Length: 617
<
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "Pod \"\" is invalid: [metadata.name: Required value: name or generateName is required, spec.containers: Required value]",
"reason": "Invalid",
"details": {
"kind": "Pod",
"causes": [
{
"reason": "FieldValueRequired",
"message": "Required value: name or generateName is required",
"field": "metadata.name"
},
{
"reason": "FieldValueRequired",
"message": "Required value",
"field": "spec.containers"
}
]
},
"code": 422
* Connection #0 to host 127.0.0.1 left intactI tried to change the Content-Type to Content-type: text/x-yaml but it didn't help.
Any idea what can be the reason?
One of the errors is regarding the "metadata.name" field.
The payloads don't seem equivalent.
This is the JSON payload you are sending:
{
"name": "",
"namespace": "default",
"content": "apiVersion: v1\nkind: Pod\nmetadata:\n name: nginx1\nspec:\n containers:\n - name: nginx\n image: nginx:1.7.9\n ports:\n - containerPort: 80\n",
"validate": true
}
Your payload should be something like this. I created this with kubectl convert -f <yaml.file> -o=json, which is what I believe kubectl does before sending the payload.
{
"kind": "Pod",
"apiVersion": "v1",
"metadata": {
"name": "nginx1",
"creationTimestamp": null
},
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx:1.7.9",
"ports": [
{
"containerPort": 80,
"protocol": "TCP"
}
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"securityContext": {},
"schedulerName": "default-scheduler"
},
"status": {}
}
Tried this and it works fine for me:
curl -k -v -X POST -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json;charset=utf-8' https://127.0.0.1:6443/api/v1/namespaces/default/pods -d@payload.jsonmake sure you set content type to application/yaml, and use --binary-data with yaml… --data drops newlines