From dd2ff561906fe51f33047ee00ffe1cc2de39d08c Mon Sep 17 00:00:00 2001 From: Mingchen Dai Date: Wed, 11 Sep 2024 04:10:47 +0000 Subject: [PATCH] Added resource creation --- internal/controller/templates/ingress.yaml | 18 ++++++ internal/controller/templates/service.yaml | 13 +++++ .../controller/templates/stateful_set.yaml | 46 +++++++++++++++ internal/controller/utils/template_utils.go | 56 +++++++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 internal/controller/templates/ingress.yaml create mode 100644 internal/controller/templates/service.yaml create mode 100644 internal/controller/templates/stateful_set.yaml create mode 100644 internal/controller/utils/template_utils.go diff --git a/internal/controller/templates/ingress.yaml b/internal/controller/templates/ingress.yaml new file mode 100644 index 0000000..4ec55fc --- /dev/null +++ b/internal/controller/templates/ingress.yaml @@ -0,0 +1,18 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{.ObjectMeta.Name}} + namespace: {{.ObjectMeta.Namespace}} +spec: + ingressClassName: nginx + rules: + - host: {{.ObjectMeta.Name}}.devcontainer.devstar.cn + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: {{.ObjectMeta.Name}} + port: + number: 22 diff --git a/internal/controller/templates/service.yaml b/internal/controller/templates/service.yaml new file mode 100644 index 0000000..bbb9d76 --- /dev/null +++ b/internal/controller/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{.ObjectMeta.Name}} + namespace: {{.ObjectMeta.Namespace}} +spec: + selector: + app: {{.ObjectMeta.Name}} + ports: + - name: ssh + protocol: TCP + port: 22 + targetPort: 22 diff --git a/internal/controller/templates/stateful_set.yaml b/internal/controller/templates/stateful_set.yaml new file mode 100644 index 0000000..9a7154c --- /dev/null +++ b/internal/controller/templates/stateful_set.yaml @@ -0,0 +1,46 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{.ObjectMeta.Name}} + namespace: {{.ObjectMeta.Namespace}} + labels: + app: {{.ObjectMeta.Name}} +spec: + podManagementPolicy: OrderedReady + replicas: 1 + selector: + matchLabels: + app: {{.ObjectMeta.Name}} + template: + metadata: + labels: + app: {{.ObjectMeta.Name}} + spec: + containers: + - name: {{.ObjectMeta.Name}} + image: {{.Spec.Image}} + imagePullPolicy: IfNotPresent + ports: + - name: tcp-ssh + protocol: tcp + containerPort: 22 + livenessProbe: + exec: + command: + - /bin/sh + - -c + - exec ping localhost + failureThreshold: 6 + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + resources: + limits: + cpu: 150m + ephemeral-storage: 2Gi + memory: 192Mi + requests: + cpu: 100m + ephemeral-storage: 50Mi + memory: 128Mi diff --git a/internal/controller/utils/template_utils.go b/internal/controller/utils/template_utils.go new file mode 100644 index 0000000..e57c3c3 --- /dev/null +++ b/internal/controller/utils/template_utils.go @@ -0,0 +1,56 @@ +package utils + +import ( + "bytes" + "text/template" + + devcontainer_apps_v1 "devstar.cn/DevcontainerApp/api/v1" + app_v1 "k8s.io/api/apps/v1" + core_v1 "k8s.io/api/core/v1" + networking_v1 "k8s.io/api/networking/v1" + yaml_util "k8s.io/apimachinery/pkg/util/yaml" +) + +// parseTemplate 解析 Go Template 模板文件 +func parseTemplate(templateName string, app *devcontainer_apps_v1.DevcontainerApp) []byte { + tmpl, err := template.ParseFiles("internal/controller/templates/" + templateName + ".yaml") + if err != nil { + panic(err) + } + b := new(bytes.Buffer) + err = tmpl.Execute(b, app) + if err != nil { + panic(err) + } + return b.Bytes() +} + +// NewStatefulSet 根据创建 StatefulSet +func NewStatefulSet(app *devcontainer_apps_v1.DevcontainerApp) *app_v1.StatefulSet { + statefulSet := &app_v1.StatefulSet{} + err := yaml_util.Unmarshal(parseTemplate("stateful_set", app), statefulSet) + if err != nil { + panic(err) + } + return statefulSet +} + +// NewService 创建 Service +func NewService(app *devcontainer_apps_v1.DevcontainerApp) *core_v1.Service { + service := &core_v1.Service{} + err := yaml_util.Unmarshal(parseTemplate("service", app), service) + if err != nil { + panic(err) + } + return service +} + +// NewIngress 创建新的 Ingress Controller 规则 +func NewIngress(app *devcontainer_apps_v1.DevcontainerApp) *networking_v1.Ingress { + ingress := &networking_v1.Ingress{} + err := yaml_util.Unmarshal(parseTemplate("ingress", app), ingress) + if err != nil { + panic(err) + } + return ingress +}