Kubernetes API服务器支持哪些数据格式?

时间:2019-02-20 12:01:30

标签: api kubernetes openapi

直接访问API服务器时(即,不是通过kubectl,而是通过直接HTTP请求),API服务器支持什么格式的资源规范?

到目前为止,在我看到的所有示例中,资源规范都是JSON(例如here)。但是我找不到有关此的任何常规信息。

API服务器是否还接受其他格式的资源规范,例如YAML或protobuf?

类似地,当API服务器返回资源以响应GET请求时,这些资源是否总是以JSON返回或是否支持任何其他格式?

2 个答案:

答案 0 :(得分:1)

在Kubernetes中,支持json和YAML格式。假设您使用kubectl创建和更新资源。 kubectl接受这两种格式。

如果您传递YAML格式,则kubectl在内部将其转换为json并将其发布到API服务器。

答案 1 :(得分:1)

Managing Kubernetes, Chapter 4(“备用编码”部分)说,API服务器支持三种数据格式用于资源规范:

  • JSON
  • YAML
  • 协议缓冲区(protobuf)

我测试了使用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创建资源

在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序列化周围使用了自定义包装器(请参见herehere)。但是,原则上应该可以。

响应正文格式

如上所述创建资源时,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-TypeAccept标头中格式的所有组合都是可能的。