【问题标题】:K8s init container restart itselfK8s init 容器自行重启
【发布时间】:2020-05-31 15:00:39
【问题描述】:

我有一个包含一个 init 容器和一个应用程序容器的 pod, 它们之间有一个带有共享文件夹的卷。

我的问题是,init 容器每天运行一次甚至更多次,因此它会从卷中删除节点模块,然后由于缺少模块而导致主应用程序崩溃。 应用容器没有重启,只有 init 容器。

有人熟悉 k8s 中的这个问题吗?为什么这些重启只发生在 init 容器中?

谢谢:)

编辑: 部署 yaml 文件 -

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "25"
  creationTimestamp: "2020-05-19T06:48:18Z"
  generation: 25
  labels:
    apps: ******
    commit: ******
  name: *******
  namespace: fleet
  resourceVersion: "24059934"
  selfLink: *******
  uid: *******
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: *******
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: *******
        commit: *******
        revision: *******
    spec:
      containers:
        image: XXXXXXXXXXXX
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /ping
            port: http
            scheme: HTTP
          initialDelaySeconds: 120
          periodSeconds: 30
          successThreshold: 1
          timeoutSeconds: 30
        name: *******
        ports:
        - containerPort: 1880
          name: http
          protocol: TCP
        readinessProbe:
          failureThreshold: 20
          httpGet:
            path: /ping
            port: http
            scheme: HTTP
          initialDelaySeconds: 20
          periodSeconds: 5
          successThreshold: 1
          timeoutSeconds: 30
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /opt/breeze
          name: workdir
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: flowregistrykey
      initContainers:
        image: XXXXXXXXXXXX
        imagePullPolicy: IfNotPresent
        name: get-flow-json
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /work-dir
          name: workdir
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - emptyDir: {}
        name: workdir
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2020-06-01T12:30:10Z"
    lastUpdateTime: "2020-06-01T12:30:10Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2020-05-19T06:48:18Z"
    lastUpdateTime: "2020-06-01T12:45:05Z"
    message: ReplicaSet "collection-associator.sandbox.services.collection-8784dcb9d"
      has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 25
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

这张图片解释了问题- pod 是 7 天前创建的,但是里面的文件是今天创建的,并且没有 node_modules 文件夹 - 因为只有 init 容器再次运行,而不是 app 容器,所以没有 mpm install

【问题讨论】:

  • 你可以通过设置restartPolicy: Never来检查吗?
  • 这个设置不是只适用于整个 pod 吗?如果容器应用程序崩溃,我希望它能够恢复并再次运行。
  • initContainer 不应(重新)启动,除非(重新)创建 pod。也许您的 CI 运行并更新,例如,在我们重新创建 pod 中的 Deployment?
  • 如果你愿意分享 yaml 会更容易。
  • 我已经编辑并添加了更多解释

标签: kubernetes


【解决方案1】:

init 容器自行运行,因此它会从卷中删除节点模块

initContainer 仅在 pod 重新启动时运行。不要将其视为服务或应用程序。它应该是一个脚本,一个仅用于在您的应用程序之前进行设置的作业。

然后由于缺少模块,主应用程序崩溃。

node_modules 不是动态加载。它在你npm start时加载

你可能想试试livenessProbe

许多长时间运行的应用程序最终会转变为损坏状态,除非重新启动,否则无法恢复。 Kubernetes 提供了活性探针来检测和补救此类情况。

initContainers:
  - name: set-delete-time
    command: ["/bin/sh","-c"]
    args: 
      - |
        # Let's set 3600
        echo 3600 > deleteTime

...
containers:
  - name: node-app
    livenessProbe:
      exec:
        command:
        # If deleteTime > 0 exit 0
        # Else /tmp/deleteTime - $periodSeconds > /tmp/deleteTime
        - cat
        - /tmp/deleteTime
        - ...
      initialDelaySeconds: 5
      periodSeconds: 5

【讨论】:

  • 我确定init容器会重新运行,因为我可以看到pod是很久以前创建的,但是每次重新运行init容器后,里面的文件都会一次又一次地创建.另外..我想弄清楚这是k8s bug还是什么。另外,我已经有 livenessProbe - 主应用程序没有崩溃,所以这不是问题,但感谢您的评论:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 2019-08-01
相关资源
最近更新 更多