未找到自定义对象状态 Kubernetes

Custom object status is not found Kubernetes

我在 Kubernetes 中有 CRD 定义。当我尝试通过 link:

发送带有 kubectl proxy 的请求时
curl http://localhost:8090/apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/

我得到了创建的自定义对象信息。但是,当我尝试使用以下方法获取此自定义对象的状态时:

curl http://localhost:8090/apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/status

我收到一个错误:

 {
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "sparkapplications.sparkoperator.k8s.io \"status\" not found",
  "reason": "NotFound",
  "details": {
    "name": "status",
    "group": "sparkoperator.k8s.io",
    "kind": "sparkapplications"
  },
  "code": 404

为什么自定义对象没有状态? CRD定义有问题吗?

我使用 Minikube 版本 v0.32.0,我是这样开始的:

minikube start --kubernetes-version v1.13.0 --memory 8048 --cpus 3 --feature-gates=CustomResourceSubresources=true

CRD 定义如下所示:

apiVersion: sparkoperator.k8s.io/v1alpha1
kind: SparkApplication
metadata:
  name: spark-example
  namespace: default
spec:
  type: Scala
  image: gcr.io/ynli-k8s/spark:v2.4.0-SNAPSHOT
  mainClass: org.apache.spark.examples.SparkExample
  mainApplicationFile: http://localhost:8089/spark_k8s_airflow.jar
  mode: cluster
  deps: {}
  driver:
    coreLimit: 1000m
    cores: 0.1
    labels:
      version: 2.4.0
    memory: 1024m
    serviceAccount: default
  executor:
    cores: 1
    instances: 1
    labels:
      version: 2.4.0
    memory: 1024m
  imagePullPolicy: Always
  subresources:
    status: {}

更新:我具体调用了对象spark-example,返回了对象数据,但是状态调用returns错误。

curl http://localhost:8090/apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/spark-example/status 

returns 此消息:

the server could not find the requested resource

尽管CRD定义中有子资源定义。

curl http://localhost:8090/apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/

上述请求将为您提供 default 个命名空间中 SparkApplication 种对象的列表。

要获取特定对象,您必须指定对象名称:

curl http://localhost:8090/apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/<object-name>

status是对象的一部分,不是SparkApplication那种。这就是您收到该错误的原因。如果您尝试特定对象,它会起作用。

curl http://localhost:8090/apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/<object-name>/status

Note: I am assuming that you enabled status subresource for SparkApplication CRD. Otherwise it will give error.

如果 CRD 定义中未启用 status 子资源,则无法在 /status 子路径中获取状态。这是 subresource.

的特性

如何知道status子资源是否启用:

检查 CRD yaml:

$ kubectl get crds/foos.try.com -o yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: foos.try.com
spec:
  group: try.com
  version: v1alpha1
  scope: Namespaced
  subresources:
    status: {}
  names:
    plural: foos
    singular: foo
    kind: Foo

如果 CRD 在 spec 下有以下字段,则 status 子资源已启用。

subresources:
  status: {}