kubernetes中的一切东西都叫做 resource,k8s 默认的提供了很多 resource,比如 pod/deployment… 而 custom resource
允许用户基于已有resource,创建新resource来扩展k8s;
在这里并不打算深入介绍CR/CRD;而着重介绍下如何通过 fabric8·kubernetes-client
来操作CR。
相信有很多场景需要 使用 java/golang sdk 去操作 k8s CR 资源;写这篇blog的起因也是因为需要去操作 seldon 的CR 来部署 machine leaning model
最好使用
> 4.6.0
版本
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
<version>4.8.0</version>
</dependency>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-model</artifactId>
<version>4.8.0</version>
</dependency>
这里并不打算使用CRD新创建一个CR,直接来看Seldon的CRD
Rex@xxx:~/Rex$ kubectl get crd seldondeployments.machinelearning.seldon.io -o yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
cert-manager.io/inject-ca-from: seldon-system/seldon-serving-cert
creationTimestamp: "2020-03-27T02:44:08Z"
generation: 1
labels:
app: seldon
app.kubernetes.io/instance: seldon-core
app.kubernetes.io/name: seldon-core-operator
app.kubernetes.io/version: 1.0.2
name: seldondeployments.machinelearning.seldon.io
resourceVersion: "247082"
selfLink:
uid:
spec:
conversion:
strategy: None
group: machinelearning.seldon.io
names:
kind: SeldonDeployment
listKind: SeldonDeploymentList
plural: seldondeployments
shortNames:
- sdep
singular: seldondeployment
preserveUnknownFields: true
scope: Namespaced
subresources:
status: {}
validation:
... (省略万字validation...)
versions:
- name: v1
served: true
storage: true
- name: v1alpha2
served: true
storage: false
- name: v1alpha3
served: true
storage: false
status:
acceptedNames:
kind: SeldonDeployment
listKind: SeldonDeploymentList
plural: seldondeployments
shortNames:
- sdep
singular: seldondeployment
conditions:
- lastTransitionTime: "2020-03-27T02:44:08Z"
message: no conflicts found
reason: NoConflicts
status: "True"
type: NamesAccepted
- lastTransitionTime: null
message: the initial names have been accepted
reason: InitialNamesAccepted
status: "True"
type: Established
storedVersions:
- v1
查看此CR的实例
Rex@xxx:~/Rex$ kubectl get sdep -n seldon-system
NAME AGE
model-wines-quality 23h
使用fabric8的kubernetes-client
去操作CR,首先需要创建 CustomResourceDefinitionContext
在定义CRD context的时候,需要从CRD中获取相应信息
@Bean
public CustomResourceDefinitionContext seldonCrdCxt(){
return new CustomResourceDefinitionContext
.Builder()
.withGroup("machinelearning.seldon.io")
.withScope("Namespaced")
.withVersion("v1alpha2")
.withPlural("seldondeployments")
.build();
拿到了CustomResourceDefinitionContext
之后,只需要简单的调用 KubernetesClient.customResource(CustomResourceDefinitionContext customResourceDefinition)
/**
* Typeless API for interacting with CustomResources. You can do basic operations with CustomResources
* without having any model. You just need to pass an object providing basic information of
* CustomResource. CustomResource objects are parsed as HashMaps.
*
* @param customResourceDefinition CustomResourceDefinitionContext - information about CustomResource like versioning, namespaced or not and group etc
* @return a RawCustomResourceOperations object which offers several functions for creating, deleting, updating, watching CustomResources.
*/
RawCustomResourceOperationsImpl customResource(CustomResourceDefinitionContext customResourceDefinition);
for example:
Map<String, Object> deployments = k8sClient.customResource(seldonCrd).list(namespace);