update
This commit is contained in:
		
							
								
								
									
										4
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					# More info: https://docs.docker.com/engine/reference/builder/#dockerignore-file
 | 
				
			||||||
 | 
					# Ignore build and test binaries.
 | 
				
			||||||
 | 
					bin/
 | 
				
			||||||
 | 
					testbin/
 | 
				
			||||||
							
								
								
									
										26
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					# Binaries for programs and plugins
 | 
				
			||||||
 | 
					*.exe
 | 
				
			||||||
 | 
					*.exe~
 | 
				
			||||||
 | 
					*.dll
 | 
				
			||||||
 | 
					*.so
 | 
				
			||||||
 | 
					*.dylib
 | 
				
			||||||
 | 
					bin
 | 
				
			||||||
 | 
					testbin/*
 | 
				
			||||||
 | 
					Dockerfile.cross
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Test binary, build with `go test -c`
 | 
				
			||||||
 | 
					*.test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Output of the go coverage tool, specifically when used with LiteIDE
 | 
				
			||||||
 | 
					*.out
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Kubernetes Generated files - skip generated files, except for vendored files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					!vendor/**/zz_generated.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# editor and IDE paraphernalia
 | 
				
			||||||
 | 
					.idea
 | 
				
			||||||
 | 
					*.swp
 | 
				
			||||||
 | 
					*.swo
 | 
				
			||||||
 | 
					*~
 | 
				
			||||||
@ -31,11 +31,11 @@ type AppServiceSpec struct {
 | 
				
			|||||||
	// Important: Run "make" to regenerate code after modifying this file
 | 
						// Important: Run "make" to regenerate code after modifying this file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Foo is an example field of AppService. Edit appservice_types.go to remove/update
 | 
						// Foo is an example field of AppService. Edit appservice_types.go to remove/update
 | 
				
			||||||
	Size     *int32               `json:"size"`
 | 
						Size      *int32               `json:"size"`
 | 
				
			||||||
	Image    string               `json:"image"`
 | 
						Image     string               `json:"image"`
 | 
				
			||||||
	Resource *Resources           `json:"resource,omitempty"`
 | 
						Resources *Resources           `json:"resource,omitempty"`
 | 
				
			||||||
	Envs     []corev1.EnvVar      `json:"envs,omitempty"`
 | 
						Envs      []corev1.EnvVar      `json:"envs,omitempty"`
 | 
				
			||||||
	Ports    []corev1.ServicePort `json:"ports,omitempty"`
 | 
						Ports     []corev1.ServicePort `json:"ports,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Resources struct {
 | 
					type Resources struct {
 | 
				
			||||||
 | 
				
			|||||||
@ -93,8 +93,8 @@ func (in *AppServiceSpec) DeepCopyInto(out *AppServiceSpec) {
 | 
				
			|||||||
		*out = new(int32)
 | 
							*out = new(int32)
 | 
				
			||||||
		**out = **in
 | 
							**out = **in
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if in.Resource != nil {
 | 
						if in.Resources != nil {
 | 
				
			||||||
		in, out := &in.Resource, &out.Resource
 | 
							in, out := &in.Resources, &out.Resources
 | 
				
			||||||
		*out = new(Resources)
 | 
							*out = new(Resources)
 | 
				
			||||||
		(*in).DeepCopyInto(*out)
 | 
							(*in).DeepCopyInto(*out)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										316
									
								
								config/crd/bases/app.treesir.pub.treesir.pub_appservices.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										316
									
								
								config/crd/bases/app.treesir.pub.treesir.pub_appservices.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,316 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					apiVersion: apiextensions.k8s.io/v1
 | 
				
			||||||
 | 
					kind: CustomResourceDefinition
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  annotations:
 | 
				
			||||||
 | 
					    controller-gen.kubebuilder.io/version: v0.11.1
 | 
				
			||||||
 | 
					  creationTimestamp: null
 | 
				
			||||||
 | 
					  name: appservices.app.treesir.pub.treesir.pub
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  group: app.treesir.pub.treesir.pub
 | 
				
			||||||
 | 
					  names:
 | 
				
			||||||
 | 
					    kind: AppService
 | 
				
			||||||
 | 
					    listKind: AppServiceList
 | 
				
			||||||
 | 
					    plural: appservices
 | 
				
			||||||
 | 
					    singular: appservice
 | 
				
			||||||
 | 
					  scope: Namespaced
 | 
				
			||||||
 | 
					  versions:
 | 
				
			||||||
 | 
					  - name: v1alpha1
 | 
				
			||||||
 | 
					    schema:
 | 
				
			||||||
 | 
					      openAPIV3Schema:
 | 
				
			||||||
 | 
					        description: AppService is the Schema for the appservices 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: AppServiceSpec defines the desired state of AppService
 | 
				
			||||||
 | 
					            properties:
 | 
				
			||||||
 | 
					              envs:
 | 
				
			||||||
 | 
					                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[''<KEY>'']`, `metadata.annotations[''<KEY>'']`,
 | 
				
			||||||
 | 
					                            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
 | 
				
			||||||
 | 
					              image:
 | 
				
			||||||
 | 
					                type: string
 | 
				
			||||||
 | 
					              ports:
 | 
				
			||||||
 | 
					                items:
 | 
				
			||||||
 | 
					                  description: ServicePort contains information on service's port.
 | 
				
			||||||
 | 
					                  properties:
 | 
				
			||||||
 | 
					                    appProtocol:
 | 
				
			||||||
 | 
					                      description: The application protocol for this port. This field
 | 
				
			||||||
 | 
					                        follows standard Kubernetes label syntax. Un-prefixed names
 | 
				
			||||||
 | 
					                        are reserved for IANA standard service names (as per RFC-6335
 | 
				
			||||||
 | 
					                        and https://www.iana.org/assignments/service-names). Non-standard
 | 
				
			||||||
 | 
					                        protocols should use prefixed names such as mycompany.com/my-custom-protocol.
 | 
				
			||||||
 | 
					                      type: string
 | 
				
			||||||
 | 
					                    name:
 | 
				
			||||||
 | 
					                      description: The name of this port within the service. This
 | 
				
			||||||
 | 
					                        must be a DNS_LABEL. All ports within a ServiceSpec must have
 | 
				
			||||||
 | 
					                        unique names. When considering the endpoints for a Service,
 | 
				
			||||||
 | 
					                        this must match the 'name' field in the EndpointPort. Optional
 | 
				
			||||||
 | 
					                        if only one ServicePort is defined on this service.
 | 
				
			||||||
 | 
					                      type: string
 | 
				
			||||||
 | 
					                    nodePort:
 | 
				
			||||||
 | 
					                      description: 'The port on each node on which this service is
 | 
				
			||||||
 | 
					                        exposed when type is NodePort or LoadBalancer.  Usually assigned
 | 
				
			||||||
 | 
					                        by the system. If a value is specified, in-range, and not
 | 
				
			||||||
 | 
					                        in use it will be used, otherwise the operation will fail.  If
 | 
				
			||||||
 | 
					                        not specified, a port will be allocated if this Service requires
 | 
				
			||||||
 | 
					                        one.  If this field is specified when creating a Service which
 | 
				
			||||||
 | 
					                        does not need it, creation will fail. This field will be wiped
 | 
				
			||||||
 | 
					                        when updating a Service to no longer need it (e.g. changing
 | 
				
			||||||
 | 
					                        type from NodePort to ClusterIP). More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport'
 | 
				
			||||||
 | 
					                      format: int32
 | 
				
			||||||
 | 
					                      type: integer
 | 
				
			||||||
 | 
					                    port:
 | 
				
			||||||
 | 
					                      description: The port that will be exposed by this service.
 | 
				
			||||||
 | 
					                      format: int32
 | 
				
			||||||
 | 
					                      type: integer
 | 
				
			||||||
 | 
					                    protocol:
 | 
				
			||||||
 | 
					                      default: TCP
 | 
				
			||||||
 | 
					                      description: The IP protocol for this port. Supports "TCP",
 | 
				
			||||||
 | 
					                        "UDP", and "SCTP". Default is TCP.
 | 
				
			||||||
 | 
					                      type: string
 | 
				
			||||||
 | 
					                    targetPort:
 | 
				
			||||||
 | 
					                      anyOf:
 | 
				
			||||||
 | 
					                      - type: integer
 | 
				
			||||||
 | 
					                      - type: string
 | 
				
			||||||
 | 
					                      description: 'Number or name of the port to access on the pods
 | 
				
			||||||
 | 
					                        targeted by the service. Number must be in the range 1 to
 | 
				
			||||||
 | 
					                        65535. Name must be an IANA_SVC_NAME. If this is a string,
 | 
				
			||||||
 | 
					                        it will be looked up as a named port in the target Pod''s
 | 
				
			||||||
 | 
					                        container ports. If this is not specified, the value of the
 | 
				
			||||||
 | 
					                        ''port'' field is used (an identity map). This field is ignored
 | 
				
			||||||
 | 
					                        for services with clusterIP=None, and should be omitted or
 | 
				
			||||||
 | 
					                        set equal to the ''port'' field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service'
 | 
				
			||||||
 | 
					                      x-kubernetes-int-or-string: true
 | 
				
			||||||
 | 
					                  required:
 | 
				
			||||||
 | 
					                  - port
 | 
				
			||||||
 | 
					                  type: object
 | 
				
			||||||
 | 
					                type: array
 | 
				
			||||||
 | 
					              resource:
 | 
				
			||||||
 | 
					                properties:
 | 
				
			||||||
 | 
					                  limits:
 | 
				
			||||||
 | 
					                    additionalProperties:
 | 
				
			||||||
 | 
					                      anyOf:
 | 
				
			||||||
 | 
					                      - type: integer
 | 
				
			||||||
 | 
					                      - type: string
 | 
				
			||||||
 | 
					                      pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
 | 
				
			||||||
 | 
					                      x-kubernetes-int-or-string: true
 | 
				
			||||||
 | 
					                    description: ResourceList is a set of (resource name, quantity)
 | 
				
			||||||
 | 
					                      pairs.
 | 
				
			||||||
 | 
					                    type: object
 | 
				
			||||||
 | 
					                  requests:
 | 
				
			||||||
 | 
					                    additionalProperties:
 | 
				
			||||||
 | 
					                      anyOf:
 | 
				
			||||||
 | 
					                      - type: integer
 | 
				
			||||||
 | 
					                      - type: string
 | 
				
			||||||
 | 
					                      pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
 | 
				
			||||||
 | 
					                      x-kubernetes-int-or-string: true
 | 
				
			||||||
 | 
					                    description: ResourceList is a set of (resource name, quantity)
 | 
				
			||||||
 | 
					                      pairs.
 | 
				
			||||||
 | 
					                    type: object
 | 
				
			||||||
 | 
					                type: object
 | 
				
			||||||
 | 
					              size:
 | 
				
			||||||
 | 
					                description: Foo is an example field of AppService. Edit appservice_types.go
 | 
				
			||||||
 | 
					                  to remove/update
 | 
				
			||||||
 | 
					                format: int32
 | 
				
			||||||
 | 
					                type: integer
 | 
				
			||||||
 | 
					            required:
 | 
				
			||||||
 | 
					            - image
 | 
				
			||||||
 | 
					            - size
 | 
				
			||||||
 | 
					            type: object
 | 
				
			||||||
 | 
					          status:
 | 
				
			||||||
 | 
					            description: AppServiceStatus defines the observed state of AppService
 | 
				
			||||||
 | 
					            properties:
 | 
				
			||||||
 | 
					              availableReplicas:
 | 
				
			||||||
 | 
					                description: Total number of available pods (ready for at least minReadySeconds)
 | 
				
			||||||
 | 
					                  targeted by this deployment.
 | 
				
			||||||
 | 
					                format: int32
 | 
				
			||||||
 | 
					                type: integer
 | 
				
			||||||
 | 
					              collisionCount:
 | 
				
			||||||
 | 
					                description: Count of hash collisions for the Deployment. The Deployment
 | 
				
			||||||
 | 
					                  controller uses this field as a collision avoidance mechanism when
 | 
				
			||||||
 | 
					                  it needs to create the name for the newest ReplicaSet.
 | 
				
			||||||
 | 
					                format: int32
 | 
				
			||||||
 | 
					                type: integer
 | 
				
			||||||
 | 
					              conditions:
 | 
				
			||||||
 | 
					                description: Represents the latest available observations of a deployment's
 | 
				
			||||||
 | 
					                  current state.
 | 
				
			||||||
 | 
					                items:
 | 
				
			||||||
 | 
					                  description: DeploymentCondition describes the state of a deployment
 | 
				
			||||||
 | 
					                    at a certain point.
 | 
				
			||||||
 | 
					                  properties:
 | 
				
			||||||
 | 
					                    lastTransitionTime:
 | 
				
			||||||
 | 
					                      description: Last time the condition transitioned from one status
 | 
				
			||||||
 | 
					                        to another.
 | 
				
			||||||
 | 
					                      format: date-time
 | 
				
			||||||
 | 
					                      type: string
 | 
				
			||||||
 | 
					                    lastUpdateTime:
 | 
				
			||||||
 | 
					                      description: The last time this condition was updated.
 | 
				
			||||||
 | 
					                      format: date-time
 | 
				
			||||||
 | 
					                      type: string
 | 
				
			||||||
 | 
					                    message:
 | 
				
			||||||
 | 
					                      description: A human readable message indicating details about
 | 
				
			||||||
 | 
					                        the transition.
 | 
				
			||||||
 | 
					                      type: string
 | 
				
			||||||
 | 
					                    reason:
 | 
				
			||||||
 | 
					                      description: The reason for the condition's last transition.
 | 
				
			||||||
 | 
					                      type: string
 | 
				
			||||||
 | 
					                    status:
 | 
				
			||||||
 | 
					                      description: Status of the condition, one of True, False, Unknown.
 | 
				
			||||||
 | 
					                      type: string
 | 
				
			||||||
 | 
					                    type:
 | 
				
			||||||
 | 
					                      description: Type of deployment condition.
 | 
				
			||||||
 | 
					                      type: string
 | 
				
			||||||
 | 
					                  required:
 | 
				
			||||||
 | 
					                  - status
 | 
				
			||||||
 | 
					                  - type
 | 
				
			||||||
 | 
					                  type: object
 | 
				
			||||||
 | 
					                type: array
 | 
				
			||||||
 | 
					              observedGeneration:
 | 
				
			||||||
 | 
					                description: The generation observed by the deployment controller.
 | 
				
			||||||
 | 
					                format: int64
 | 
				
			||||||
 | 
					                type: integer
 | 
				
			||||||
 | 
					              readyReplicas:
 | 
				
			||||||
 | 
					                description: readyReplicas is the number of pods targeted by this
 | 
				
			||||||
 | 
					                  Deployment with a Ready Condition.
 | 
				
			||||||
 | 
					                format: int32
 | 
				
			||||||
 | 
					                type: integer
 | 
				
			||||||
 | 
					              replicas:
 | 
				
			||||||
 | 
					                description: Total number of non-terminated pods targeted by this
 | 
				
			||||||
 | 
					                  deployment (their labels match the selector).
 | 
				
			||||||
 | 
					                format: int32
 | 
				
			||||||
 | 
					                type: integer
 | 
				
			||||||
 | 
					              unavailableReplicas:
 | 
				
			||||||
 | 
					                description: Total number of unavailable pods targeted by this deployment.
 | 
				
			||||||
 | 
					                  This is the total number of pods that are still required for the
 | 
				
			||||||
 | 
					                  deployment to have 100% available capacity. They may either be pods
 | 
				
			||||||
 | 
					                  that are running but not yet available or pods that still have not
 | 
				
			||||||
 | 
					                  been created.
 | 
				
			||||||
 | 
					                format: int32
 | 
				
			||||||
 | 
					                type: integer
 | 
				
			||||||
 | 
					              updatedReplicas:
 | 
				
			||||||
 | 
					                description: Total number of non-terminated pods targeted by this
 | 
				
			||||||
 | 
					                  deployment that have the desired template spec.
 | 
				
			||||||
 | 
					                format: int32
 | 
				
			||||||
 | 
					                type: integer
 | 
				
			||||||
 | 
					            type: object
 | 
				
			||||||
 | 
					        type: object
 | 
				
			||||||
 | 
					    served: true
 | 
				
			||||||
 | 
					    storage: true
 | 
				
			||||||
 | 
					    subresources:
 | 
				
			||||||
 | 
					      status: {}
 | 
				
			||||||
							
								
								
									
										33
									
								
								config/rbac/role.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								config/rbac/role.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					apiVersion: rbac.authorization.k8s.io/v1
 | 
				
			||||||
 | 
					kind: ClusterRole
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  creationTimestamp: null
 | 
				
			||||||
 | 
					  name: manager-role
 | 
				
			||||||
 | 
					rules:
 | 
				
			||||||
 | 
					- apiGroups:
 | 
				
			||||||
 | 
					  - app.treesir.pub.treesir.pub
 | 
				
			||||||
 | 
					  resources:
 | 
				
			||||||
 | 
					  - appservices
 | 
				
			||||||
 | 
					  verbs:
 | 
				
			||||||
 | 
					  - create
 | 
				
			||||||
 | 
					  - delete
 | 
				
			||||||
 | 
					  - get
 | 
				
			||||||
 | 
					  - list
 | 
				
			||||||
 | 
					  - patch
 | 
				
			||||||
 | 
					  - update
 | 
				
			||||||
 | 
					  - watch
 | 
				
			||||||
 | 
					- apiGroups:
 | 
				
			||||||
 | 
					  - app.treesir.pub.treesir.pub
 | 
				
			||||||
 | 
					  resources:
 | 
				
			||||||
 | 
					  - appservices/finalizers
 | 
				
			||||||
 | 
					  verbs:
 | 
				
			||||||
 | 
					  - update
 | 
				
			||||||
 | 
					- apiGroups:
 | 
				
			||||||
 | 
					  - app.treesir.pub.treesir.pub
 | 
				
			||||||
 | 
					  resources:
 | 
				
			||||||
 | 
					  - appservices/status
 | 
				
			||||||
 | 
					  verbs:
 | 
				
			||||||
 | 
					  - get
 | 
				
			||||||
 | 
					  - patch
 | 
				
			||||||
 | 
					  - update
 | 
				
			||||||
@ -19,7 +19,7 @@ package controllers
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	appv1alpha1 "git.treesir.pub/cdryzun/operator-demo/api/v1alpha1"
 | 
						"fmt"
 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	appsv1 "k8s.io/api/apps/v1"
 | 
						appsv1 "k8s.io/api/apps/v1"
 | 
				
			||||||
@ -27,11 +27,12 @@ import (
 | 
				
			|||||||
	"k8s.io/apimachinery/pkg/api/errors"
 | 
						"k8s.io/apimachinery/pkg/api/errors"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
						"k8s.io/apimachinery/pkg/runtime"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
					 | 
				
			||||||
	ctrl "sigs.k8s.io/controller-runtime"
 | 
						ctrl "sigs.k8s.io/controller-runtime"
 | 
				
			||||||
	"sigs.k8s.io/controller-runtime/pkg/client"
 | 
						"sigs.k8s.io/controller-runtime/pkg/client"
 | 
				
			||||||
	"sigs.k8s.io/controller-runtime/pkg/log"
 | 
						"sigs.k8s.io/controller-runtime/pkg/log"
 | 
				
			||||||
	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 | 
						"sigs.k8s.io/controller-runtime/pkg/reconcile"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						apptreesirpubv1alpha1 "git.treesir.pub/cdryzun/operator-demo/api/v1alpha1"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AppServiceReconciler reconciles a AppService object
 | 
					// AppServiceReconciler reconciles a AppService object
 | 
				
			||||||
@ -58,7 +59,7 @@ func (r *AppServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request)
 | 
				
			|||||||
	reqLogger.Info("Reconciling AppService")
 | 
						reqLogger.Info("Reconciling AppService")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Fetch the AppService instance
 | 
						// Fetch the AppService instance
 | 
				
			||||||
	instance := &appv1alpha1.AppService{}
 | 
						instance := &apptreesirpubv1alpha1.AppService{}
 | 
				
			||||||
	err := r.Get(context.TODO(), req.NamespacedName, instance)
 | 
						err := r.Get(context.TODO(), req.NamespacedName, instance)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if errors.IsNotFound(err) {
 | 
							if errors.IsNotFound(err) {
 | 
				
			||||||
@ -81,6 +82,7 @@ func (r *AppServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request)
 | 
				
			|||||||
	// 如果不需要更新,则正常返回
 | 
						// 如果不需要更新,则正常返回
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	deploy := &appsv1.Deployment{}
 | 
						deploy := &appsv1.Deployment{}
 | 
				
			||||||
 | 
						fmt.Println(deploy)
 | 
				
			||||||
	if err := r.Get(context.TODO(), req.NamespacedName, deploy); err != nil && errors.IsNotFound(err) {
 | 
						if err := r.Get(context.TODO(), req.NamespacedName, deploy); err != nil && errors.IsNotFound(err) {
 | 
				
			||||||
		// 创建关联资源
 | 
							// 创建关联资源
 | 
				
			||||||
		// 1. 创建 Deploy
 | 
							// 1. 创建 Deploy
 | 
				
			||||||
@ -107,7 +109,7 @@ func (r *AppServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request)
 | 
				
			|||||||
		return ctrl.Result{}, nil
 | 
							return ctrl.Result{}, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	oldspec := appv1alpha1.AppServiceSpec{}
 | 
						oldspec := apptreesirpubv1alpha1.AppServiceSpec{}
 | 
				
			||||||
	if err := json.Unmarshal([]byte(instance.Annotations["spec"]), &oldspec); err != nil {
 | 
						if err := json.Unmarshal([]byte(instance.Annotations["spec"]), &oldspec); err != nil {
 | 
				
			||||||
		return ctrl.Result{}, err
 | 
							return ctrl.Result{}, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -147,86 +149,71 @@ func (r *AppServiceReconciler) SetupWithManager(mgr ctrl.Manager) error {
 | 
				
			|||||||
		Complete(r)
 | 
							Complete(r)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewDeploy(app *appv1alpha1.AppService) *appsv1.Deployment {
 | 
					func NewDeploy(instance *apptreesirpubv1alpha1.AppService) *appsv1.Deployment {
 | 
				
			||||||
	labels := map[string]string{"app": app.Name}
 | 
						labels := map[string]string{
 | 
				
			||||||
	selector := &metav1.LabelSelector{MatchLabels: labels}
 | 
							"app": instance.Name,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return &appsv1.Deployment{
 | 
						return &appsv1.Deployment{
 | 
				
			||||||
		TypeMeta: metav1.TypeMeta{
 | 
							ObjectMeta: ctrl.ObjectMeta{
 | 
				
			||||||
			APIVersion: "apps/v1",
 | 
								Name:      instance.Name,
 | 
				
			||||||
			Kind:       "Deployment",
 | 
								Namespace: instance.Namespace,
 | 
				
			||||||
		},
 | 
								Labels:    labels,
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
					 | 
				
			||||||
			Name:      app.Name,
 | 
					 | 
				
			||||||
			Namespace: app.Namespace,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			OwnerReferences: []metav1.OwnerReference{
 | 
					 | 
				
			||||||
				*metav1.NewControllerRef(app, schema.GroupVersionKind{
 | 
					 | 
				
			||||||
					Group:   appsv1.SchemeGroupVersion.Group,
 | 
					 | 
				
			||||||
					Version: appsv1.SchemeGroupVersion.Version,
 | 
					 | 
				
			||||||
					Kind:    "AppService",
 | 
					 | 
				
			||||||
				}),
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Spec: appsv1.DeploymentSpec{
 | 
							Spec: appsv1.DeploymentSpec{
 | 
				
			||||||
			Replicas: app.Spec.Size,
 | 
								Replicas: instance.Spec.Size,
 | 
				
			||||||
 | 
								Selector: &metav1.LabelSelector{
 | 
				
			||||||
 | 
									MatchLabels: labels,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
			Template: corev1.PodTemplateSpec{
 | 
								Template: corev1.PodTemplateSpec{
 | 
				
			||||||
				ObjectMeta: metav1.ObjectMeta{
 | 
									ObjectMeta: ctrl.ObjectMeta{
 | 
				
			||||||
					Labels: labels,
 | 
										Labels: labels,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				Spec: corev1.PodSpec{
 | 
									Spec: corev1.PodSpec{
 | 
				
			||||||
					Containers: newContainers(app),
 | 
										Containers: newContainers(instance),
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			Selector: selector,
 | 
					 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newContainers(app *appv1alpha1.AppService) []corev1.Container {
 | 
					func NewService(instance *apptreesirpubv1alpha1.AppService) *corev1.Service {
 | 
				
			||||||
 | 
						labels := map[string]string{
 | 
				
			||||||
 | 
							"app": instance.Name,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &corev1.Service{
 | 
				
			||||||
 | 
							ObjectMeta: ctrl.ObjectMeta{
 | 
				
			||||||
 | 
								Name:      instance.Name,
 | 
				
			||||||
 | 
								Namespace: instance.Namespace,
 | 
				
			||||||
 | 
								Labels:    labels,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Spec: corev1.ServiceSpec{
 | 
				
			||||||
 | 
								Type:  corev1.ServiceTypeNodePort,
 | 
				
			||||||
 | 
								Ports: instance.Spec.Ports,
 | 
				
			||||||
 | 
								Selector: map[string]string{
 | 
				
			||||||
 | 
									"app": instance.Name,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func newContainers(instance *apptreesirpubv1alpha1.AppService) []corev1.Container {
 | 
				
			||||||
	var containerPorts []corev1.ContainerPort
 | 
						var containerPorts []corev1.ContainerPort
 | 
				
			||||||
	for _, svcPort := range app.Spec.Ports {
 | 
						for _, svcPort := range instance.Spec.Ports {
 | 
				
			||||||
		cport := corev1.ContainerPort{}
 | 
							cport := corev1.ContainerPort{}
 | 
				
			||||||
		cport.ContainerPort = svcPort.TargetPort.IntVal
 | 
							cport.ContainerPort = svcPort.TargetPort.IntVal
 | 
				
			||||||
		containerPorts = append(containerPorts, cport)
 | 
							containerPorts = append(containerPorts, cport)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return []corev1.Container{
 | 
						return []corev1.Container{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Name:  app.Name,
 | 
								Name:  instance.Name,
 | 
				
			||||||
			Image: app.Spec.Image,
 | 
								Image: instance.Spec.Image,
 | 
				
			||||||
			Resources: corev1.ResourceRequirements{
 | 
								Resources: corev1.ResourceRequirements{
 | 
				
			||||||
				Requests: app.Spec.Resources.Requests,
 | 
									Requests: instance.Spec.Resources.Requests,
 | 
				
			||||||
				Limits:   app.Spec.Resources.Limits,
 | 
									Limits:   instance.Spec.Resources.Limits,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			Ports:           containerPorts,
 | 
								Ports:           containerPorts,
 | 
				
			||||||
			ImagePullPolicy: corev1.PullIfNotPresent,
 | 
								ImagePullPolicy: corev1.PullIfNotPresent,
 | 
				
			||||||
			Env:             app.Spec.Envs,
 | 
								Env:             instance.Spec.Envs,
 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewService(app *appv1alpha1.AppService) *corev1.Service {
 | 
					 | 
				
			||||||
	return &corev1.Service{
 | 
					 | 
				
			||||||
		TypeMeta: metav1.TypeMeta{
 | 
					 | 
				
			||||||
			Kind:       "Service",
 | 
					 | 
				
			||||||
			APIVersion: "v1",
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
					 | 
				
			||||||
			Name:      app.Name,
 | 
					 | 
				
			||||||
			Namespace: app.Namespace,
 | 
					 | 
				
			||||||
			OwnerReferences: []metav1.OwnerReference{
 | 
					 | 
				
			||||||
				*metav1.NewControllerRef(app, schema.GroupVersionKind{
 | 
					 | 
				
			||||||
					Group:   appsv1.SchemeGroupVersion.Group,
 | 
					 | 
				
			||||||
					Version: appsv1.SchemeGroupVersion.Version,
 | 
					 | 
				
			||||||
					Kind:    "AppService",
 | 
					 | 
				
			||||||
				}),
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		Spec: corev1.ServiceSpec{
 | 
					 | 
				
			||||||
			Type:  corev1.ServiceTypeNodePort,
 | 
					 | 
				
			||||||
			Ports: app.Spec.Ports,
 | 
					 | 
				
			||||||
			Selector: map[string]string{
 | 
					 | 
				
			||||||
				"app": app.Name,
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user