From e12a9303eb12e1c97387dbd7b5fe2e90843a7ed2 Mon Sep 17 00:00:00 2001 From: "Jian.Li" <74582607+leejanee@users.noreply.github.com> Date: Mon, 9 Aug 2021 10:27:18 +0800 Subject: [PATCH] Li-Auto-Inc (#2042) --- docs/examples/workflow/Li-Auto-Inc/app.yaml | 58 +++ .../Li-Auto-Inc/common-definitions.yaml | 332 ++++++++++++++++++ .../workflow-step-definitions.yaml | 91 +++++ 3 files changed, 481 insertions(+) create mode 100644 docs/examples/workflow/Li-Auto-Inc/app.yaml create mode 100644 docs/examples/workflow/Li-Auto-Inc/common-definitions.yaml create mode 100644 docs/examples/workflow/Li-Auto-Inc/workflow-step-definitions.yaml diff --git a/docs/examples/workflow/Li-Auto-Inc/app.yaml b/docs/examples/workflow/Li-Auto-Inc/app.yaml new file mode 100644 index 000000000..3bc37ff42 --- /dev/null +++ b/docs/examples/workflow/Li-Auto-Inc/app.yaml @@ -0,0 +1,58 @@ +apiVersion: core.oam.dev/v1beta1 +kind: Application +metadata: + name: lixiang-app +spec: + components: + - name: base-service + type: base-service + properties: + image: nginx:1.14.2 + # 用于区分appollo环境 + cluster: default + traits: + - type: ingress + properties: + domain: base-service.dev.example.com + http: + "/": 11001 + # redis无依赖,启动后service的endpionts 需要通过http接口写入信息写入到apollo + - name: "redis" + type: helm + properties: + chart: "redis-cluster" + version: "6.2.7" + repoUrl: "https://charts.bitnami.com/bitnami" + repoType: helm + - name: proxy-service + type: proxy-service + properties: + image: nginx:1.14.2 + # 用于区分appollo环境 + cluster: default + traits: + - type: ingress + properties: + domain: proxy-service.dev.example.com + http: + "/": 11002 + workflow: + steps: + - name: apply-base-service + type: apply-base + outputs: + - name: baseIP + exportKey: clusterIP + properties: + component: base-service + - name: apply-redis + type: apply-helm + properties: + component: redis + - name: apply-proxy-service + type: apply-proxy + inputs: + - from: baseIP + parameterKey: backendIP + properties: + component: proxy-service diff --git a/docs/examples/workflow/Li-Auto-Inc/common-definitions.yaml b/docs/examples/workflow/Li-Auto-Inc/common-definitions.yaml new file mode 100644 index 000000000..d9262c753 --- /dev/null +++ b/docs/examples/workflow/Li-Auto-Inc/common-definitions.yaml @@ -0,0 +1,332 @@ +apiVersion: core.oam.dev/v1beta1 +kind: ComponentDefinition +metadata: + name: base-service +spec: + workload: + definition: + apiVersion: apps/v1 + kind: Deployment + schematic: + kube: + template: + apiVersion: apps/v1 + kind: Deployment + metadata: + labels: + appId: BASE-SERVICE + appName: base-service + version: 0.0.1 + name: base-service + spec: + replicas: 2 + revisionHistoryLimit: 5 + selector: + matchLabels: + app: base-service + template: + metadata: + labels: + antiAffinity: none + app: base-service + appId: BASE-SERVICE + version: 0.0.1 + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - base-service + - key: antiAffinity + operator: In + values: + - none + topologyKey: kubernetes.io/hostname + weight: 100 + containers: + - env: + - name: NODE_IP + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: APP_NAME + value: base-service + - name: LOG_BASE + value: /data/log + - name: RUNTIME_CLUSTER + value: default + image: base-service + imagePullPolicy: Always + name: base-service + ports: + - containerPort: 11223 + protocol: TCP + - containerPort: 11224 + protocol: TCP + volumeMounts: + - mountPath: /tmp/data/log/base-service + name: log-volume + - mountPath: /data + name: sidecar-sre + - mountPath: /app/skywalking + name: skywalking + initContainers: + - args: + - 'echo "do something" ' + command: + - /bin/sh + - -c + env: + - name: NODE_IP + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: APP_NAME + value: base-service + image: busybox + imagePullPolicy: Always + name: sidecar-sre + resources: + limits: + cpu: 100m + memory: 100Mi + volumeMounts: + - mountPath: /tmp/data/log/base-service + name: log-volume + - mountPath: /scratch + name: sidecar-sre + terminationGracePeriodSeconds: 120 + volumes: + - hostPath: + path: /logs/dev/base-service + type: DirectoryOrCreate + name: log-volume + - emptyDir: {} + name: sidecar-sre + - emptyDir: {} + name: skywalking + parameters: + - name: image + required: true + type: string + fieldPaths: + - "spec.template.spec.containers[0].image" + - name: cluster + required: true + type: string + fieldPaths: + - "spec.template.spec.containers[0].env[6].value" + - "spec.template.metadata.labels.cluster" +--- +apiVersion: core.oam.dev/v1beta1 +kind: ComponentDefinition +metadata: + name: proxy-service +spec: + workload: + definition: + apiVersion: argoproj.io/v1alpha1 + kind: Rollout + schematic: + kube: + template: + apiVersion: argoproj.io/v1alpha1 + kind: Rollout + metadata: + labels: + appId: PROXY-SERVICE + appName: proxy-service + version: 0.0.0 + name: proxy-service + spec: + replicas: 1 + revisionHistoryLimit: 1 + selector: + matchLabels: + app: proxy-service + strategy: + canary: + steps: + - setWeight: 50 + - pause: {} + template: + metadata: + labels: + app: proxy-service + appId: PROXY-SERVICE + cluster: default + version: 0.0.1 + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - proxy-service + topologyKey: kubernetes.io/hostname + weight: 100 + containers: + - env: + - name: NODE_IP + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: APP_NAME + value: proxy-service + - name: LOG_BASE + value: /app/data/log + - name: RUNTIME_CLUSTER + value: default + image: proxy-service:0.1 + imagePullPolicy: Always + name: proxy-service + ports: + - containerPort: 11024 + protocol: TCP + - containerPort: 11025 + protocol: TCP + volumeMounts: + - mountPath: /tmp/data/log/proxy-service + name: log-volume + - mountPath: /app/data + name: sidecar-sre + - mountPath: /app/skywalking + name: skywalking + initContainers: + - args: + - 'echo "do something" ' + command: + - /bin/sh + - -c + env: + - name: NODE_IP + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: APP_NAME + value: proxy-service + image: busybox + imagePullPolicy: Always + name: sidecar-sre + resources: + limits: + cpu: 100m + memory: 100Mi + volumeMounts: + - mountPath: /tmp/data/log/proxy-service + name: log-volume + - mountPath: /scratch + name: sidecar-sre + terminationGracePeriodSeconds: 120 + volumes: + - hostPath: + path: /app/logs/dev/proxy-service + type: DirectoryOrCreate + name: log-volume + - emptyDir: {} + name: sidecar-sre + - emptyDir: {} + name: skywalking + parameters: + - name: image + required: true + type: string + fieldPaths: + - "spec.template.spec.containers[0].image" + - name: cluster + required: true + type: string + fieldPaths: + - "spec.template.spec.containers[0].env[5].value" + - "spec.template.metadata.labels.cluster" +--- +apiVersion: core.oam.dev/v1beta1 +kind: TraitDefinition +metadata: + name: ingress +spec: + schematic: + cue: + template: | + parameter: { + domain: string + http: [string]: int + } + outputs: { + "service": { + apiVersion: "v1" + kind: "Service" + metadata: { + name: context.name + namespace: context.namespace + } + spec: { + selector: app: context.name + ports: [for ph, pt in parameter.http{ + protocol: "TCP" + port: pt + targetPort: pt + }] + } + } + "ingress": { + apiVersion: "networking.k8s.io/v1" + kind: "Ingress" + metadata: { + name: "\(context.name)-ingress" + namespace: context.namespace + } + spec: rules: [{ + host: parameter.domain + http: paths: [for ph, pt in parameter.http { + path: ph + pathType: "Prefix" + backend: service: { + name: context.name + port: number: pt + } + }] + }] + } + } diff --git a/docs/examples/workflow/Li-Auto-Inc/workflow-step-definitions.yaml b/docs/examples/workflow/Li-Auto-Inc/workflow-step-definitions.yaml new file mode 100644 index 000000000..97625666f --- /dev/null +++ b/docs/examples/workflow/Li-Auto-Inc/workflow-step-definitions.yaml @@ -0,0 +1,91 @@ +apiVersion: core.oam.dev/v1beta1 +kind: WorkflowStepDefinition +metadata: + name: apply-base + namespace: vela-system +spec: + schematic: + cue: + template: |- + import ("vela/op") + parameter: { + component: string + } + apply: op.#ApplyComponent & { + component: parameter.component + } + + // wait until deployment ready + wait: op.#ConditionalWait & { + continue: apply.workload.status.readyReplicas == apply.workload.status.replicas && apply.workload.status.observedGeneration == apply.workload.metadata.generation + } + + // export service ClusterIP + clusterIP: apply.traits["service"].value.spec.clusterIP +--- +apiVersion: core.oam.dev/v1beta1 +kind: WorkflowStepDefinition +metadata: + name: apply-helm + namespace: vela-system +spec: + schematic: + cue: + template: |- + import ("vela/op") + parameter: { + component: string + } + apply: op.#ApplyComponent & { + component: parameter.component + } + + // wait redis ready + wait: op.#ConditionalWait & { + // todo + continue: true + } +--- +apiVersion: core.oam.dev/v1beta1 +kind: WorkflowStepDefinition +metadata: + name: apply-proxy + namespace: vela-system +spec: + schematic: + cue: + template: |- + import ( + "vela/op" + "encoding/json" + ) + parameter: { + component: string + backendIP: string + } + + // 往三方配置中心apollo读取配置 + // config: op.#HTTPGet + + apply: op.#ApplyComponent & { + component: parameter.component + // 给环境变量中注入BackendIP + workload: patch: spec: template: spec: { + containers: [{ + // patchKey=name + env: [{name: "BackendIP",value: parameter.backendIP}] + },...] + } + } + + // wait until argo.rollout ready + wait: op.#ConditionalWait & { + continue: apply.workload.status.readyReplicas == apply.workload.status.replicas && apply.workload.status.observedGeneration == apply.workload.metadata.generation + } + + message: {...} + // 往三方配置中心apollo写配置 + notify: op.#HTTPPost & { + url: "appolo-address" + request: body: json.Marshal(message) + }