如果 Pod 未处于运行状态,则 statefulset 无法回滚

Bha*_*sad 5 openshift kubernetes-statefulset okd

我已经使用自动滚动策略部署了 mongo 有状态 pod,下面是它的模板。部署成功,Pod 进入 Running 状态。

- apiVersion: apps/v1beta1
  kind: StatefulSet
  metadata:
    name: mongo
  spec:
    serviceName: "mongo"
    podManagementPolicy: Parallel
    replicas: 3
    strategy:
      type: Rolling
    template:
      metadata:
        labels:
          role: mongo
          environment: test
      spec:
        terminationGracePeriodSeconds: 10
        containers:
          - name: mongo
            image: mongo:4.0
            imagePullPolicy: Always
            command:
              - mongod
              - "--replSet"
              - rs0
              - "--bind_ip"
              - 0.0.0.0
              - "--smallfiles"
              - "--noprealloc"
            ports:
              - containerPort: 27017
            volumeMounts:
              - name: mongo-persistent-storage
                mountPath: /data/db
          - name: mongo-sidecar
            image: cvallance/mongo-k8s-sidecar
            env:
              - name: MONGO_SIDECAR_POD_LABELS
                value: "role=mongo,environment=test"
    updateStrategy:
      type: RollingUpdate
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下 set 命令更新 mongo 的图像,

oc set image statefulset/mongo mongo=mongo:4.2 -n mongo-replica
Run Code Online (Sandbox Code Playgroud)

在尝试更新图像时,pod 出现“CrashLoopBackOff”错误。我希望 Pod 自动回滚到之前运行的版本。

但是豆荚在“CrashLoopBackOff”错误状态下被击中。我希望 pod 回滚到之前运行的版本。任何建议在这里将不胜感激。

小智 1

遗憾的是,Statefulset 没有回滚功能,但您可以使用探针保证您的服务,配置良好的 Liveness 和 Readiness 探针后,更改后的版本将仅取代正在运行的版本,且探针回答 ok 状态。

这样,您的 3 个副本中只有一个会因故障而崩溃,您可以通过它来解决问题或手动回滚更改,但不会丢失服务的交付。

有关此内容的更多详细信息,您可以在 k8s 文档中查看: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#forced-rollback

关于探针,您可以在这里得到很好的解释: https://www.openshift.com/blog/liveness-and-readiness-probes