Custom Resource

背景

Kubernetes 中的 API 对象都叫做资源(Resource),就是 Yaml 里 Kind 字段所描述的东西。

我相信大家对 Kubernetes 中的 API 对象都有所了解,每个 API 对象都有它自己的能力,分的非常细,概念也很多。当平台出现了问题,对一些新手来说,他们往往会不知所措,不知道从什么地方开始排查,非常的迷茫。

比如最近发生在我司的一件趣事。

我司内网 开发环境 的服务,对集群外提供访问是通过 Ingress 这个资源,测试环境 为了和 生产环境 保持一致,上了 Service Mesh(Istio),用的是 VirtualService 对外提供服务。

QA同学日常在使用 Kubernetes 的过程中,经常接触到的都是 DeploymentServiceIngress 这些原生内置的资源对象,那天 测试环境 因为某些原因出了问题,导致服务不能够正常访问,她以为是服务的 Ingress 资源没安装引起,闹出了不少笑话。

那么问题来了,VirtualService 到底是个什么资源呢?它又是怎么集成到 Kubernetes 集群內的呢?

这正是本篇文章要分享的主题。

一个例子

在回答上面这个问题之前,我们通过下面这个命令再来看一个 Kubernetes 集群內的资源。

乍一看,你是不是完全不知道 dagnoderunner-sample 有什么作用?

➜ kubectl get dnr -owide

NAME                   AGE
dagnoderunner-sample   86s

再来看下这个资源的 Spec 情况,我们发现 Kind 里描述的是一个叫 DagNodeRunner 的资源对象。

它的 Spec 也很简单,只有 foo 和 baz 两个字段,其他啥都没有。

apiVersion 字段的内容也不是我们平常所熟悉的,apps/v1apiextensions.k8s.io/v1 和 v1,而是 cloudnative-labs.io/v1beta1

➜ kubectl get DagNodeRunner dagnoderunner-sample -oyaml|kubectl neat

apiVersion: cloudnative-labs.io/v1beta1
kind: DagNodeRunner
metadata:
  name: dagnoderunner-sample
  namespace: default
spec:
  foo: bar
  baz: true

那么 DagNodeRunner 到底是个什么东西呢?它其实就是本篇文章分享的其中一个主题:CR

什么是 CR