直接访问API服务器时(即,不是通过kubectl,而是通过直接HTTP请求),API服务器支持什么格式的资源规范?
到目前为止,在我看到的所有示例中,资源规范都是JSON(例如here)。但是我找不到有关此的任何常规信息。
API服务器是否还接受其他格式的资源规范,例如YAML或protobuf?
类似地,当API服务器返回资源以响应GET请求时,这些资源是否总是以JSON返回或是否支持任何其他格式?
答案 0 :(得分:1)
在Kubernetes中,支持json和YAML格式。假设您使用kubectl创建和更新资源。 kubectl接受这两种格式。
如果您传递YAML格式,则kubectl在内部将其转换为json并将其发布到API服务器。
答案 1 :(得分:1)
Managing Kubernetes, Chapter 4(“备用编码”部分)说,API服务器支持三种数据格式用于资源规范:
我测试了使用curl
以这些格式创建资源的过程,如下所示。
为了轻松地与API服务器对话,请使用kubectl启动对API服务器的反向代理:
kubectl proxy
现在可以在http://127.0.0.1:8001上访问API服务器。
可以在http://127.0.0.1:8001/openapi/v2上访问Kubernetes API规范。
您必须在Content-Type
标头中指定HTTP POST请求正文的格式(即资源规范)。
支持以下数据格式:
application/json
application/yaml
application/vnd.kubernetes.protobuf
下面是请求的具体示例。
在JSON中定义资源规范并将其保存在文件中。
例如pod.json
:
{
"apiVersion":"v1",
"kind":"Pod",
"metadata":{
"name":"test-pod"
},
"spec":{
"containers":[
{
"image":"nginx",
"name":"nginx-container"
}
]
}
}
调用API服务器创建资源:
curl -H "Content-Type: application/json" -d "$(cat pod.json)" -X POST http://127.0.0.1:8001/api/v1/namespaces/default/pods
在YAML中定义资源规范并将其保存在文件中。
例如pod.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- image: nginx
name: nginx-container
调用API服务器创建资源:
curl -H "Content-Type: application/yaml" -d "$(cat pod.yaml)" -X POST http://127.0.0.1:8001/api/v1/namespaces/default/pods
我没有对此进行测试,因为Kubernetes protobuf有线格式在资源的protobuf序列化周围使用了自定义包装器(请参见here和here)。但是,原则上应该可以。
如上所述创建资源时,API服务器会在HTTP响应中返回同一资源的完整规范(即,您使用所有默认值初始化的status
字段所提交的规范)等)。
您可以在请求中使用Accept
标头选择此响应数据的格式。
Accept
标头接受的格式与Content-Type
标头相同:
application/json
(默认)application/yaml
application/vnd.kubernetes.protobuf
例如:
curl -H "Content-Type: application/json" -H "Accept: application/yaml" -d "$(cat pod.json)" -X POST http://127.0.0.1:8001/api/v1/namespaces/default/pods
Content-Type
和Accept
标头中格式的所有组合都是可能的。