From f05466b2bcdaf1875921a9e672e771de6ba324a0 Mon Sep 17 00:00:00 2001 From: dongming Date: Tue, 20 Dec 2022 15:23:00 +0800 Subject: [PATCH] l-13 crd done --- api/v1/msbdeployment_types.go | 74 +++++- api/v1/zz_generated.deepcopy.go | 60 ++++- .../apps.mashibing.com_msbdeployments.yaml | 231 ++++++++++++++++++ config/rbac/role.yaml | 33 +++ 4 files changed, 390 insertions(+), 8 deletions(-) create mode 100644 config/crd/bases/apps.mashibing.com_msbdeployments.yaml create mode 100644 config/rbac/role.yaml diff --git a/api/v1/msbdeployment_types.go b/api/v1/msbdeployment_types.go index 85177db..222046c 100644 --- a/api/v1/msbdeployment_types.go +++ b/api/v1/msbdeployment_types.go @@ -17,6 +17,8 @@ limitations under the License. package v1 import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -25,17 +27,77 @@ import ( // MsbDeploymentSpec defines the desired state of MsbDeployment type MsbDeploymentSpec struct { - // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster - // Important: Run "make" to regenerate code after modifying this file + // Image 存储镜像地址 + Image string `json:"image"` + // Port 存储服务提供的端口 + Port int32 `json:"port"` + // Replicas 存储要部署多少个副本 + // +optional + Replicas int32 `json:"replicas,omitempty"` + // StartCmd 存储启动命令 + // +optional + StartCmd string `json:"startCmd,omitempty"` + // Args 存储启动命令参数 + // +optional + Args []string `json:"args,omitempty"` + // Environments 存储环境变量,直接使用pod中的定义方式 + // +optional + Environments []corev1.EnvVar `json:"environments,omitempty"` + // Expose service要暴露的端口 + Expose *Expose `json:"expose"` +} - // Foo is an example field of MsbDeployment. Edit msbdeployment_types.go to remove/update - Foo string `json:"foo,omitempty"` +// Expose defines the desired state of Expose +type Expose struct { + // Mode 模式 nodePort or ingress + Mode string `json:"mode"` + // IngressDomain 域名。在 Mode为 ingress 的时候,此项为必填 + // +optional + IngressDomain string `json:"ingressDomain,omitempty"` + // NodePort nodePort端口。在 mode 为 nodeport 的时候,此项为必填 + // +optional + NodePort int32 `json:"nodePort,omitempty"` + + // ServicePort service的端口,一般是随机生成,这里我们为了防止冲突,使用和我们提供服务相同的端口。 + // +optional + ServicePort int32 `json:"servicePort,omitempty"` } // MsbDeploymentStatus defines the observed state of MsbDeployment type MsbDeploymentStatus struct { - // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster - // Important: Run "make" to regenerate code after modifying this file + // Phase 处于什么阶段 + // +optional + Phase string `json:"phase,omitempty"` + // Message 这个阶段的信息 + // +optional + Message string `json:"message,omitempty"` + + // Reason 处于这个阶段的原因 + // +optional + Reason string `json:"reason,omitempty"` + + // Conditions 处于这个阶段的原因 + // +optional + Conditions []Condition `json:"conditions,omitempty"` +} + +// defines the observed state of Condition +type Condition struct { + // Type 子资源类型 + // +optional + Type string `json:"type,omitempty"` + // Message 这个这个子资源状态的信息 + // +optional + Message string `json:"message,omitempty"` + // Status 这个子资源的状态名称 + // +optional + Status string `json:"status,omitempty"` + // Reason 处于这个状态的原因 + // +optional + Reason string `json:"reason,omitempty"` + // LastTransitionTime 最后创建/更新的时间 + // +optional + LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty"` } //+kubebuilder:object:root=true diff --git a/api/v1/zz_generated.deepcopy.go b/api/v1/zz_generated.deepcopy.go index e58097d..99a5bed 100644 --- a/api/v1/zz_generated.deepcopy.go +++ b/api/v1/zz_generated.deepcopy.go @@ -22,16 +22,48 @@ limitations under the License. package v1 import ( + corev1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Condition) DeepCopyInto(out *Condition) { + *out = *in + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Condition. +func (in *Condition) DeepCopy() *Condition { + if in == nil { + return nil + } + out := new(Condition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Expose) DeepCopyInto(out *Expose) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Expose. +func (in *Expose) DeepCopy() *Expose { + if in == nil { + return nil + } + out := new(Expose) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MsbDeployment) DeepCopyInto(out *MsbDeployment) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - out.Status = in.Status + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MsbDeployment. @@ -87,6 +119,23 @@ func (in *MsbDeploymentList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MsbDeploymentSpec) DeepCopyInto(out *MsbDeploymentSpec) { *out = *in + if in.Args != nil { + in, out := &in.Args, &out.Args + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Environments != nil { + in, out := &in.Environments, &out.Environments + *out = make([]corev1.EnvVar, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Expose != nil { + in, out := &in.Expose, &out.Expose + *out = new(Expose) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MsbDeploymentSpec. @@ -102,6 +151,13 @@ func (in *MsbDeploymentSpec) DeepCopy() *MsbDeploymentSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MsbDeploymentStatus) DeepCopyInto(out *MsbDeploymentStatus) { *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MsbDeploymentStatus. diff --git a/config/crd/bases/apps.mashibing.com_msbdeployments.yaml b/config/crd/bases/apps.mashibing.com_msbdeployments.yaml new file mode 100644 index 0000000..685f7dc --- /dev/null +++ b/config/crd/bases/apps.mashibing.com_msbdeployments.yaml @@ -0,0 +1,231 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null + name: msbdeployments.apps.mashibing.com +spec: + group: apps.mashibing.com + names: + kind: MsbDeployment + listKind: MsbDeploymentList + plural: msbdeployments + singular: msbdeployment + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: MsbDeployment is the Schema for the msbdeployments API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: MsbDeploymentSpec defines the desired state of MsbDeployment + properties: + args: + description: Args 存储启动命令参数 + items: + type: string + type: array + environments: + description: Environments 存储环境变量,直接使用pod中的定义方式 + items: + description: EnvVar represents an environment variable present in + a Container. + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded using + the previously defined environment variables in the container + and any service environment variables. If a variable cannot + be resolved, the reference in the input string will be unchanged. + Double $$ are reduced to a single $, which allows for escaping + the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will produce the + string literal "$(VAR_NAME)". Escaped references will never + be expanded, regardless of whether the variable exists or + not. Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's value. Cannot + be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, + spec.nodeName, spec.serviceAccountName, status.hostIP, + status.podIP, status.podIPs.' + properties: + apiVersion: + description: Version of the schema the FieldPath is + written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified + API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.ephemeral-storage) are currently supported.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the exposed + resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + expose: + description: Expose service要暴露的端口 + properties: + ingressDomain: + description: IngressDomain 域名。在 Mode为 ingress 的时候,此项为必填 + type: string + mode: + description: Mode 模式 nodePort or ingress + type: string + nodePort: + description: NodePort nodePort端口。在 mode 为 nodeport 的时候,此项为必填 + format: int32 + type: integer + servicePort: + description: ServicePort service的端口,一般是随机生成,这里我们为了防止冲突,使用和我们提供服务相同的端口。 + format: int32 + type: integer + required: + - mode + type: object + image: + description: Image 存储镜像地址 + type: string + port: + description: Port 存储服务提供的端口 + format: int32 + type: integer + replicas: + description: Replicas 存储要部署多少个副本 + format: int32 + type: integer + startCmd: + description: StartCmd 存储启动命令 + type: string + required: + - expose + - image + - port + type: object + status: + description: MsbDeploymentStatus defines the observed state of MsbDeployment + properties: + conditions: + description: Conditions 处于这个阶段的原因 + items: + description: defines the observed state of Condition + properties: + lastTransitionTime: + description: LastTransitionTime 最后创建/更新的时间 + format: date-time + type: string + message: + description: Message 这个这个子资源状态的信息 + type: string + reason: + description: Reason 处于这个状态的原因 + type: string + status: + description: Status 这个子资源的状态名称 + type: string + type: + description: Type 子资源类型 + type: string + type: object + type: array + message: + description: Message 这个阶段的信息 + type: string + phase: + description: Phase 处于什么阶段 + type: string + reason: + description: Reason 处于这个阶段的原因 + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml new file mode 100644 index 0000000..2bfb619 --- /dev/null +++ b/config/rbac/role.yaml @@ -0,0 +1,33 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + creationTimestamp: null + name: manager-role +rules: +- apiGroups: + - apps.mashibing.com + resources: + - msbdeployments + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - apps.mashibing.com + resources: + - msbdeployments/finalizers + verbs: + - update +- apiGroups: + - apps.mashibing.com + resources: + - msbdeployments/status + verbs: + - get + - patch + - update