Kubernetes API 服务器支持哪些数据格式?
What data formats does the Kubernetes API server support?
直接访问API服务器时(即不使用kubectl,而是直接HTTP请求),API服务器支持什么格式的资源规范?
到目前为止,在我看到的所有示例中,资源规格都在 JSON 中(例如 here)。但是我找不到关于此的任何一般信息。
API 服务器是否也接受其他格式的资源规范,例如 YAML 或 protobuf?
同理,API服务器returns资源响应GET请求时,资源是一直返回JSON还是支持其他格式?
在 Kubernetes 中,json 和 YAML 格式均受支持。我假设您使用 kubectl 创建和更新资源。 kubectl 接受这两种格式。
如果您传递 YAML 格式,kubectl 在内部将其转换为 json 并 post 将其转换为 API 服务器。
Managing Kubernetes, Chapter 4(第 "Alternate encodings" 节)表示 API 服务器支持资源规范的三种数据格式:
- JSON
- YAML
- 协议缓冲区 (protobuf)
我测试了使用 curl
创建这些格式的资源并且它有效,如下所示。
准备
为了轻松与 API 服务器通信,使用 kubectl 启动到 API 服务器的代理:
kubectl proxy
现在可以在 http://127.0.0.1:8001 上访问 API 服务器。
Kubernetes API 规范可在 http://127.0.0.1:8001/openapi/v2.
上访问
请求body 格式
您必须在 Content-Type
header.
中指定 HTTP POST 请求 body 的格式(即资源规范)
支持以下数据格式:
application/json
application/yaml
application/vnd.kubernetes.protobuf
以下是请求的具体示例。
使用 JSON
创建资源
在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 创建资源
在 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
使用 protobuf 创建资源
我没有对此进行测试,因为 Kubernetes protobuf 有线格式在资源的 protobuf 序列化周围使用自定义包装器(请参阅 here and here)。但是,原则上,它应该可以工作。
响应body 格式
如上所示创建资源时,API 服务器 returns HTTP 响应中相同资源的完整规范(即您提交的规范,使用所有默认值、status
字段等)。
您可以在请求中使用 Accept
header 选择此响应数据的格式。
Accept
header 接受的格式与 Content-Type
header 相同:
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
header 中的所有格式组合都是可能的。
直接访问API服务器时(即不使用kubectl,而是直接HTTP请求),API服务器支持什么格式的资源规范?
到目前为止,在我看到的所有示例中,资源规格都在 JSON 中(例如 here)。但是我找不到关于此的任何一般信息。
API 服务器是否也接受其他格式的资源规范,例如 YAML 或 protobuf?
同理,API服务器returns资源响应GET请求时,资源是一直返回JSON还是支持其他格式?
在 Kubernetes 中,json 和 YAML 格式均受支持。我假设您使用 kubectl 创建和更新资源。 kubectl 接受这两种格式。
如果您传递 YAML 格式,kubectl 在内部将其转换为 json 并 post 将其转换为 API 服务器。
Managing Kubernetes, Chapter 4(第 "Alternate encodings" 节)表示 API 服务器支持资源规范的三种数据格式:
- JSON
- YAML
- 协议缓冲区 (protobuf)
我测试了使用 curl
创建这些格式的资源并且它有效,如下所示。
准备
为了轻松与 API 服务器通信,使用 kubectl 启动到 API 服务器的代理:
kubectl proxy
现在可以在 http://127.0.0.1:8001 上访问 API 服务器。
Kubernetes API 规范可在 http://127.0.0.1:8001/openapi/v2.
上访问请求body 格式
您必须在 Content-Type
header.
支持以下数据格式:
application/json
application/yaml
application/vnd.kubernetes.protobuf
以下是请求的具体示例。
使用 JSON
创建资源在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 创建资源
在 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
使用 protobuf 创建资源
我没有对此进行测试,因为 Kubernetes protobuf 有线格式在资源的 protobuf 序列化周围使用自定义包装器(请参阅 here and here)。但是,原则上,它应该可以工作。
响应body 格式
如上所示创建资源时,API 服务器 returns HTTP 响应中相同资源的完整规范(即您提交的规范,使用所有默认值、status
字段等)。
您可以在请求中使用 Accept
header 选择此响应数据的格式。
Accept
header 接受的格式与 Content-Type
header 相同:
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
header 中的所有格式组合都是可能的。