kubernetes 两个StatefulSet pods创建之间的时间间隔不等于spec.minReadySeconds,

sqxo8psd  于 4个月前  发布在  Kubernetes
关注(0)|答案(7)|浏览(42)

发生了什么?

当我尝试使用超过2个副本创建有状态集(例如如下所示)时,Pods创建之间的时间间隔是minReadySeconds中配置的值的两倍。

# k get po
NAME    READY   STATUS    RESTARTS   AGE
sts-0   1/1     Running   0          24s
sts-1   1/1     Running   0          4s

从结果中可以看出,这两个pods创建之间的时间间隔为(24s-4s)= 20s,但实际上spec.minReadySeconds是10而不是20。
根据IUR,这两个pods创建之间的时间间隔等于spec.minReadySeconds

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts
spec:
  serviceName: "nginx"
  replicas: 2
  minReadySeconds: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest

期望发生什么?

这两个pods创建之间的时间间隔等于spec.minReadySeconds

如何尽可能精确地重现它?

yaml如上所述。

还需要了解其他信息吗?

  • 无响应*

Kubernetes版本

$ kubectl version
# paste output here

Kubernetes v1.26.3

云提供商

OS版本

# On Linux:
$ cat /etc/os-release
# paste output here
$ uname -a
# paste output here

# On Windows:
C:\> wmic os get Caption, Version, BuildNumber, OSArchitecture
# paste output here

安装工具

容器运行时(CRI)和版本(如果适用)

相关插件(CNI,CSI,...)和版本(如果适用)

z4bn682m

z4bn682m2#

根据您提供的文本内容,问题可能与在重新平衡StatefulSet时,状态集控制器引用(curControllerRef)被更新了两次有关。具体来说,当Pod更新时,如果其对象元数据(ObjectMeta)发生变化,将触发重新排队并更新状态集的状态。

以下是相关代码片段:

// 在kubernetes/pkg/controller/statefulset/stateful_set.go文件的第223行到第238行
if curControllerRef != nil {
    set := ssc.resolveControllerRef(curPod.Namespace, curControllerRef)
    if set == nil {
        return
    }
    klog.V(4).Infof("Pod %s updated, objectMeta %+v -> %+v.", curPod.Name, oldPod.ObjectMeta, curPod.ObjectMeta)
    ssc.enqueueStatefulSet(set)
    // TODO: MinReadySeconds in the Pod will generate an Available condition to be added in
    // the Pod status which in turn will trigger a requeue of the owning replica set thus
    // having its status updated with the newly available replica.
    if !podutil.IsPodReady(oldPod) && podutil.IsPodReady(curPod) && set.Spec.MinReadySeconds > 0 {
        klog.V(2).Infof("StatefulSet %s will be enqueued after %ds for availability check", set.Name, set.Spec.MinReadySeconds)
        // Add a second to avoid milliseconds skew in AddAfter.
        // See https://github.com/kubernetes/kubernetes/issues/39785#issuecomment-279959133 for more info.
        ssc.enqueueSSAfter(set, (time.Duration(set.Spec.MinReadySeconds) * time.Second) + time.Second)
    }
}

以及:

// 在kubernetes/pkg/controller/statefulset/stateful_set.go文件的第487行到第489行
if set.Spec.MinReadySeconds > 0 && status != nil && status.AvailableReplicas != *set.Spec.Replicas {
    ssc.enqueueSSAfter(set, time.Duration(set.Spec.MinReadySeconds)*time.Second)
}

这意味着在调用enqueueSSAfter之后的第二次,工作队列事件将更新(延迟时间加倍)。

qzlgjiam

qzlgjiam3#

Kubernetes项目目前缺乏足够的贡献者来充分应对所有问题。
此机器人根据以下规则对未分类的问题进行分级处理:

  • lifecycle/stale应用后的90天不活动后,将应用lifecycle/stale
  • lifecycle/stale应用后的30天不活动后,将应用lifecycle/rotten
  • lifecycle/rotten应用后的30天不活动后,该问题将被关闭

您可以:

  • 将此问题标记为新鲜的/remove-lifecycle stale
  • 使用/close关闭此问题
  • 提供帮助,请使用Issue Triage

请将反馈发送至sig-contributor-experience@kubernetes/community
/lifecycle stale

6g8kf2rb

6g8kf2rb4#

Kubernetes项目目前缺乏足够的活跃贡献者来充分应对所有问题。
此机器人根据以下规则对未分类的问题进行分级处理:

  • lifecycle/stale应用后的90天内无活动,将应用lifecycle/stale
  • lifecycle/stale应用后的30天内无活动,将应用lifecycle/rotten
  • lifecycle/rotten应用后的30天内无活动,将关闭该问题

您可以:

  • 使用/remove-lifecycle rotten标记此问题为新鲜
  • 使用/close关闭此问题
  • 提供帮助,使用Issue Triage

请将反馈发送至sig-contributor-experience@kubernetes/community
/lifecycle rotten

lskq00tm

lskq00tm5#

与#108266(评论)类似的问题。

qyuhtwio

qyuhtwio6#

/triage accepted
/priority important-longterm
dwbf0jvd

dwbf0jvd7#

/remove-lifecycle rotten

相关问题