Align federated StatefulSet's observedGeneration semantics with its native

Signed-off-by: zhy76 <958474674@qq.com>
This commit is contained in:
zhy76 2024-06-26 20:59:48 +08:00
parent 45d4b8ed3b
commit d7d28eaf3b
4 changed files with 82 additions and 18 deletions

View File

@ -24,24 +24,46 @@ spec:
statusAggregation: statusAggregation:
luaScript: > luaScript: >
function AggregateStatus(desiredObj, statusItems) function AggregateStatus(desiredObj, statusItems)
if statusItems == nil then
return desiredObj
end
if desiredObj.status == nil then if desiredObj.status == nil then
desiredObj.status = {} desiredObj.status = {}
end end
if desiredObj.metadata.generation == nil then if desiredObj.metadata.generation == nil then
desiredObj.metadata.generation = 0 desiredObj.metadata.generation = 0
end end
generation = desiredObj.metadata.generation if desiredObj.status.observedGeneration == nil then
replicas = 0 desiredObj.status.observedGeneration = 0
readyReplicas = 0 end
currentReplicas = 0
updatedReplicas = 0 -- Initialize status fields if status doest not exist
availableReplicas = 0 -- If the StatefulSet is not spread to any cluster, its status also should be aggregated
updatedReadyReplicas = 0 if statusItems == nil then
updateRevision = '' desiredObj.status.observedGeneration = desiredObj.metadata.generation
currentRevision = '' desiredObj.status.replicas = 0
desiredObj.status.readyReplicas = 0
desiredObj.status.currentReplicas = 0
desiredObj.status.updatedReplicas = 0
desiredObj.status.availableReplicas = 0
desiredObj.status.updatedReadyReplicas = 0
desiredObj.status.updateRevision = ''
desiredObj.status.currentRevision = ''
return desiredObj
end
local generation = desiredObj.metadata.generation
local observedGeneration = desiredObj.status.observedGeneration
local replicas = 0
local readyReplicas = 0
local currentReplicas = 0
local updatedReplicas = 0
local availableReplicas = 0
local updatedReadyReplicas = 0
local updateRevision = ''
local currentRevision = ''
local labelSelector = ''
-- Count all members that their status is updated to the latest generation
local observedResourceTemplateGenerationCount = 0
for i = 1, #statusItems do for i = 1, #statusItems do
if statusItems[i].status ~= nil and statusItems[i].status.replicas ~= nil then if statusItems[i].status ~= nil and statusItems[i].status.replicas ~= nil then
replicas = replicas + statusItems[i].status.replicas replicas = replicas + statusItems[i].status.replicas
@ -67,11 +89,32 @@ spec:
if statusItems[i].status ~= nil and statusItems[i].status.currentRevision ~= nil and statusItems[i].status.currentRevision ~= '' then if statusItems[i].status ~= nil and statusItems[i].status.currentRevision ~= nil and statusItems[i].status.currentRevision ~= '' then
currentRevision = statusItems[i].status.currentRevision currentRevision = statusItems[i].status.currentRevision
end end
if statusItems[i].status ~= nil and statusItems[i].status.observedGeneration ~= nil and statusItems[i].status.observedGeneration ~= '' then
generation = statusItems[i].status.observedGeneration -- Check if the member's status is updated to the latest generation
end local resourceTemplateGeneration = 0
if statusItems[i].status ~= nil and statusItems[i].status.resourceTemplateGeneration ~= nil then
resourceTemplateGeneration = statusItems[i].status.resourceTemplateGeneration
end
local memberGeneration = 0
if statusItems[i].status ~= nil and statusItems[i].status.generation ~= nil then
memberGeneration = statusItems[i].status.generation
end
local memberObservedGeneration = 0
if statusItems[i].status ~= nil and statusItems[i].status.observedGeneration ~= nil then
memberObservedGeneration = statusItems[i].status.observedGeneration
end
if resourceTemplateGeneration == generation and memberGeneration == memberObservedGeneration then
observedResourceTemplateGenerationCount = observedResourceTemplateGenerationCount + 1
end
end end
desiredObj.status.observedGeneration = generation
-- Update the observed generation based on the observedResourceTemplateGenerationCount
if observedResourceTemplateGenerationCount == #statusItems then
desiredObj.status.observedGeneration = generation
else
desiredObj.status.observedGeneration = observedGeneration
end
desiredObj.status.replicas = replicas desiredObj.status.replicas = replicas
desiredObj.status.readyReplicas = readyReplicas desiredObj.status.readyReplicas = readyReplicas
desiredObj.status.currentReplicas = currentReplicas desiredObj.status.currentReplicas = currentReplicas
@ -84,8 +127,8 @@ spec:
end end
statusReflection: statusReflection:
luaScript: > luaScript: >
function ReflectStatus (observedObj) function ReflectStatus(observedObj)
status = {} local status = {}
if observedObj == nil or observedObj.status == nil then if observedObj == nil or observedObj.status == nil then
return status return status
end end
@ -98,6 +141,20 @@ spec:
status.currentRevision = observedObj.status.currentRevision status.currentRevision = observedObj.status.currentRevision
status.updatedReadyReplicas = observedObj.status.updatedReadyReplicas status.updatedReadyReplicas = observedObj.status.updatedReadyReplicas
status.observedGeneration = observedObj.status.observedGeneration status.observedGeneration = observedObj.status.observedGeneration
-- handle resource generation report
if observedObj.metadata == nil then
return status
end
status.generation = observedObj.metadata.generation
if observedObj.metadata.annotations == nil then
return status
end
local resourceTemplateGeneration = tonumber(observedObj.metadata.annotations["resourcetemplate.karmada.io/generation"])
if resourceTemplateGeneration ~= nil then
status.resourceTemplateGeneration = resourceTemplateGeneration
end
return status return status
end end
healthInterpretation: healthInterpretation:

View File

@ -3,6 +3,7 @@ kind: StatefulSet
metadata: metadata:
name: sample name: sample
namespace: test-statefulset namespace: test-statefulset
generation: 1
spec: spec:
replicas: 2 replicas: 2
serviceName: sample-statefulset-headless-service serviceName: sample-statefulset-headless-service

View File

@ -1,6 +1,8 @@
apiVersion: apps.kruise.io/v1beta1 apiVersion: apps.kruise.io/v1beta1
kind: StatefulSet kind: StatefulSet
metadata: metadata:
annotations:
resourcetemplate.karmada.io/generation: "1"
name: sample name: sample
namespace: test-statefulset namespace: test-statefulset
generation: 1 generation: 1

View File

@ -5,6 +5,8 @@ status:
availableReplicas: 2 availableReplicas: 2
currentReplicas: 2 currentReplicas: 2
currentRevision: sample-5675547df7 currentRevision: sample-5675547df7
generation: 1
resourceTemplateGeneration: 1
observedGeneration: 1 observedGeneration: 1
readyReplicas: 2 readyReplicas: 2
replicas: 2 replicas: 2
@ -19,7 +21,9 @@ status:
availableReplicas: 2 availableReplicas: 2
currentReplicas: 2 currentReplicas: 2
currentRevision: sample-5675547df7 currentRevision: sample-5675547df7
generation: 1
observedGeneration: 1 observedGeneration: 1
resourceTemplateGeneration: 1
readyReplicas: 2 readyReplicas: 2
replicas: 2 replicas: 2
updateRevision: sample-5675547df7 updateRevision: sample-5675547df7