kubernetes k8s CRD嵌入k8s本机类型

ffscu2ro  于 12个月前  发布在  Kubernetes
关注(0)|答案(1)|浏览(139)

使用Operator-SDK开发K8s操作符。要求是侦听CR并执行操作,如创建secret和secretMap,然后通过挂载secret和secretMap来更新工作负载(Deployment/DaemonSet/StatefulSet)。在协调CR之前,工作负载应处于挂起状态。
为了实现这一点,在CRD规范中,嵌入k8s Deployment,StatefulSet或DaemonSet对象。完成预处理并调整工作负载后,将工作负载应用到集群。

type Foo struct{
  metav1.TypeMeta   `json:",inline"`
  metav1.ObjectMeta `json:"metadata,omitempty"`

   Spec   FooSpec   `json:"spec,omitempty"`
   Status FooStatus `json:"status,omitempty"`
}
type FooSpec struc{
   Template <Deployment|DaemonSet|StatefulSet> `json:"template,omitempty"`
}

上面是模板示例。在此Template可以是deployment或statefulSet或DaemonSet。
如何在golang中使用operator-sdk定义这样的CRD规范?
如何在协调循环中将Template强制转换为实际对象(Deployment/DaemonSet/StatefulSet)?

lymnna71

lymnna711#

一种选择是拆分模板类型并添加一个决定工作负载类型的字段。验证标记可用于指定工作负载的种类。

type Foo struct{
   metav1.TypeMeta   `json:",inline"`
   metav1.ObjectMeta `json:"metadata,omitempty"`

   Spec   FooSpec   `json:"spec,omitempty"`
   Status FooStatus `json:"status,omitempty"`
}
type FooSpec struct{
   // +kubebuilder:validation:Required
   // +kubebuilder:validation:Enum=Deployment,DaemonSet,StatefulSet
   Kind                string            `json:"kind,omitempty"`
   DeploymentTemplate  DeploymentSpec    `json:"deploymentTemplate,omitempty"`
   DaemonSetTemplate   DaemonSetSpec     `json:"daemonSetTemplate,omitempty"`
   StatefulSetTemplate StatefulSetSpec   `json:"statefulSetTemplate,omitempty"`
}

然后,您可以使用reflect包来比较您想要的工作负载和协调器中的实际工作负载。

// check your deployment for example
if !reflect.DeepEqual(instance.Spec.DeploymentSpec, actualDeployment.Spec) {
    // update your deployment
}

相关问题