From 0fc88877f32001d82d9c00caeb2731f7b73f839c Mon Sep 17 00:00:00 2001 From: yike21 Date: Sat, 1 Apr 2023 17:18:36 +0800 Subject: [PATCH] add customizations for apps.krusie.io/v1beta1/StatefulSet Signed-off-by: yike21 --- .../v1beta1/StatefulSet/customizations.yaml | 125 ++++++++++++++++++ .../testdata/desired-statefulset-nginx.yaml | 48 +++++++ .../testdata/observed-statefulset-nginx.yaml | 58 ++++++++ .../StatefulSet/testdata/status-file.yaml | 27 ++++ 4 files changed, 258 insertions(+) create mode 100644 pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/customizations.yaml create mode 100644 pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/desired-statefulset-nginx.yaml create mode 100644 pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/observed-statefulset-nginx.yaml create mode 100644 pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/status-file.yaml diff --git a/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/customizations.yaml b/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/customizations.yaml new file mode 100644 index 000000000..9b813a036 --- /dev/null +++ b/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/customizations.yaml @@ -0,0 +1,125 @@ +apiVersion: config.karmada.io/v1alpha1 +kind: ResourceInterpreterCustomization +metadata: + name: declarative-configuration-statefulset +spec: + target: + apiVersion: apps.kruise.io/v1beta1 + kind: StatefulSet + customizations: + replicaResource: + luaScript: > + local kube = require("kube") + function GetReplicas(obj) + replica = obj.spec.replicas + requirement = kube.accuratePodRequirements(obj.spec.template) + return replica, requirement + end + replicaRevision: + luaScript: > + function ReviseReplica(obj, desiredReplica) + obj.spec.replicas = desiredReplica + return obj + end + statusAggregation: + luaScript: > + function AggregateStatus(desiredObj, statusItems) + if statusItems == nil then + return desiredObj + end + if desiredObj.status == nil then + desiredObj.status = {} + end + if desiredObj.metadata.generation == nil then + desiredObj.metadata.generation = 0 + end + generation = desiredObj.metadata.generation + replicas = 0 + readyReplicas = 0 + currentReplicas = 0 + updatedReplicas = 0 + availableReplicas = 0 + updatedReadyReplicas = 0 + updateRevision = '' + currentRevision = '' + for i = 1, #statusItems do + if statusItems[i].status ~= nil and statusItems[i].status.replicas ~= nil then + replicas = replicas + statusItems[i].status.replicas + end + if statusItems[i].status ~= nil and statusItems[i].status.readyReplicas ~= nil then + readyReplicas = readyReplicas + statusItems[i].status.readyReplicas + end + if statusItems[i].status ~= nil and statusItems[i].status.currentReplicas ~= nil then + currentReplicas = currentReplicas + statusItems[i].status.currentReplicas + end + if statusItems[i].status ~= nil and statusItems[i].status.updatedReplicas ~= nil then + updatedReplicas = updatedReplicas + statusItems[i].status.updatedReplicas + end + if statusItems[i].status ~= nil and statusItems[i].status.availableReplicas ~= nil then + availableReplicas = availableReplicas + statusItems[i].status.availableReplicas + end + if statusItems[i].status ~= nil and statusItems[i].status.updatedReadyReplicas ~= nil then + updatedReadyReplicas = updatedReadyReplicas + statusItems[i].status.updatedReadyReplicas + end + if statusItems[i].status ~= nil and statusItems[i].status.updateRevision ~= nil and statusItems[i].status.updateRevision ~= '' then + updateRevision = statusItems[i].status.updateRevision + end + if statusItems[i].status ~= nil and statusItems[i].status.currentRevision ~= nil and statusItems[i].status.currentRevision ~= '' then + currentRevision = statusItems[i].status.currentRevision + end + if statusItems[i].status ~= nil and statusItems[i].status.observedGeneration ~= nil and statusItems[i].status.observedGeneration ~= '' then + generation = statusItems[i].status.observedGeneration + end + end + desiredObj.status.observedGeneration = generation + desiredObj.status.replicas = replicas + desiredObj.status.readyReplicas = readyReplicas + desiredObj.status.currentReplicas = currentReplicas + desiredObj.status.updatedReplicas = updatedReplicas + desiredObj.status.availableReplicas = availableReplicas + desiredObj.status.updatedReadyReplicas = updatedReadyReplicas + desiredObj.status.updateRevision = updateRevision + desiredObj.status.currentRevision = currentRevision + return desiredObj + end + statusReflection: + luaScript: > + function ReflectStatus (observedObj) + status = {} + if observedObj == nil or observedObj.status == nil then + return status + end + status.replicas = observedObj.status.replicas + status.readyReplicas = observedObj.status.readyReplicas + status.currentReplicas = observedObj.status.currentReplicas + status.updatedReplicas = observedObj.status.updatedReplicas + status.availableReplicas = observedObj.status.availableReplicas + status.updateRevision = observedObj.status.updateRevision + status.currentRevision = observedObj.status.currentRevision + status.updatedReadyReplicas = observedObj.status.updatedReadyReplicas + status.observedGeneration = observedObj.status.observedGeneration + return status + end + healthInterpretation: + luaScript: > + function InterpretHealth(observedObj) + if observedObj.status.observedGeneration ~= observedObj.metadata.generation then + return false + end + if observedObj.spec.replicas ~= nil then + if observedObj.status.updatedReplicas < observedObj.spec.replicas then + return false + end + end + if observedObj.status.availableReplicas < observedObj.status.updatedReplicas then + return false + end + return true + end + dependencyInterpretation: + luaScript: > + local kube = require("kube") + function GetDependencies(desiredObj) + refs = kube.getPodDependencies(desiredObj.spec.template, desiredObj.metadata.namespace) + return refs + end diff --git a/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/desired-statefulset-nginx.yaml b/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/desired-statefulset-nginx.yaml new file mode 100644 index 000000000..b6478d42b --- /dev/null +++ b/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/desired-statefulset-nginx.yaml @@ -0,0 +1,48 @@ +apiVersion: apps.kruise.io/v1beta1 +kind: StatefulSet +metadata: + name: sample + namespace: test-statefulset +spec: + replicas: 2 + serviceName: sample-statefulset-headless-service + selector: + matchLabels: + app: sample + template: + metadata: + labels: + app: sample + spec: + volumes: + - name: configmap + configMap: + name: my-sample-config + readinessGates: + # A new condition that ensures the pod remains at NotReady state while the in-place update is happening + - conditionType: InPlaceUpdateReady + containers: + - name: nginx + image: nginx:alpine + ports: + - containerPort: 80 + name: web + env: + - name: logData + valueFrom: + configMapKeyRef: + name: mysql-config + key: log + - name: lowerData + valueFrom: + configMapKeyRef: + name: mysql-config + key: lower + podManagementPolicy: Parallel # allow parallel updates, works together with maxUnavailable + updateStrategy: + type: RollingUpdate + rollingUpdate: + # Do in-place update if possible, currently only image update is supported for in-place update + podUpdatePolicy: InPlaceIfPossible + # Allow parallel updates with max number of unavailable instances equals to 2 + maxUnavailable: 2 diff --git a/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/observed-statefulset-nginx.yaml b/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/observed-statefulset-nginx.yaml new file mode 100644 index 000000000..2fa0aba9e --- /dev/null +++ b/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/observed-statefulset-nginx.yaml @@ -0,0 +1,58 @@ +apiVersion: apps.kruise.io/v1beta1 +kind: StatefulSet +metadata: + name: sample + namespace: test-statefulset + generation: 1 +spec: + replicas: 2 + serviceName: sample-statefulset-headless-service + selector: + matchLabels: + app: sample + template: + metadata: + labels: + app: sample + spec: + volumes: + - name: configmap + configMap: + name: my-sample-config + readinessGates: + - conditionType: InPlaceUpdateReady + containers: + - name: nginx + image: nginx:alpine + ports: + - containerPort: 80 + name: web + env: + - name: logData + valueFrom: + configMapKeyRef: + name: mysql-config + key: log + - name: lowerData + valueFrom: + configMapKeyRef: + name: mysql-config + key: lower + podManagementPolicy: Parallel + updateStrategy: + type: RollingUpdate + rollingUpdate: + podUpdatePolicy: InPlaceIfPossible + maxUnavailable: 2 +status: + availableReplicas: 2 + collisionCount: 0 + currentReplicas: 2 + currentRevision: sample-5675547df7 + labelSelector: app=sample + observedGeneration: 1 + readyReplicas: 2 + replicas: 2 + updateRevision: sample-5675547df7 + updatedReadyReplicas: 2 + updatedReplicas: 2 diff --git a/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/status-file.yaml b/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/status-file.yaml new file mode 100644 index 000000000..1740b3ea3 --- /dev/null +++ b/pkg/resourceinterpreter/default/thirdparty/resourcecustomizations/apps.kruise.io/v1beta1/StatefulSet/testdata/status-file.yaml @@ -0,0 +1,27 @@ +applied: true +clusterName: member1 +health: Healthy +status: + availableReplicas: 2 + currentReplicas: 2 + currentRevision: sample-5675547df7 + observedGeneration: 1 + readyReplicas: 2 + replicas: 2 + updateRevision: sample-5675547df7 + updatedReadyReplicas: 2 + updatedReplicas: 2 +--- +applied: true +clusterName: member3 +health: Healthy +status: + availableReplicas: 2 + currentReplicas: 2 + currentRevision: sample-5675547df7 + observedGeneration: 1 + readyReplicas: 2 + replicas: 2 + updateRevision: sample-5675547df7 + updatedReadyReplicas: 2 + updatedReplicas: 2