当直接访问API服务器时(即不是使用kubectl,而是直接的HTTP请求),API服务器支持什么格式的资源规范?
在我到目前为止看到的所有示例中,资源规范都使用JSON (例如这里)。但我找不到关于这件事的任何一般信息。
API服务器是否也接受其他格式的资源规范,如YAML或protobuf?
类似地,当API服务器响应GET请求返回资源时,资源总是以JSON形式返回还是支持其他格式?
发布于 2019-02-20 22:55:19
管理Kubernetes,第4章 (“备用编码”部分)说,API服务器支持资源规范的三种数据格式:
我测试了使用curl以这些格式创建资源,它可以工作,如下所示。
准备工作
为了方便地与API服务器对话,使用kubectl启动API服务器的代理:
kubectl proxy现在,API服务器可以在http://127.0.0.1:8001上访问。
Kubernetes API规范可以在http://127.0.0.1:8001/openapi/v2上访问。
请求体格式
您必须在Content-Type头中指定HTTP请求主体(即资源规范)的格式。
支持下列数据格式:
application/jsonapplication/yamlapplication/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序列化的自定义包装器(请参阅这里和这里)。但是,原则上,这应该是可行的。
响应体格式
创建资源时,API服务器返回HTTP中相同资源的完整规范(即您提交的规范,使用所有默认值、status字段等初始化)。
您可以使用请求中的Accept头来选择此响应数据的格式。
Accept头的可接受格式与Content-Type标头的格式相同:
application/json (默认)application/yamlapplication/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/podsContent-Type和Accept头中的所有格式组合都是可能的。
发布于 2019-02-20 12:21:58
在Kubernetes中,支持json和YAML格式。假设您使用kubectl创建和更新资源。kubectl接受这两种格式。
如果您传递YAML格式,在内部kubectl将其转换为json并将其发送到API服务器。
https://stackoverflow.com/questions/54785930
复制相似问题