如何忽略多容器 Pod 中容器的故障?

Stq*_*tqs 6 kubernetes

我有一个多容器应用程序:app + sidecar。两个容器都应该一直处于活动状态,但 sidecar 并不是那么重要。Sidecar 依赖于外部资源,如果该资源不可用 - Sidecar 就会崩溃。它会导致整个吊舱瘫痪。Kubernetes 尝试重新创建 pod,但失败了,因为 sidecar 现在无法启动。但从我的业务逻辑角度来看,sidecar 崩溃是绝对正常的。拥有那个边车很好,但不是强制性的。我不希望 sidecar 在崩溃时带走主应用程序。实现这一目标的最佳 Kubernetes 原生方式是什么?是否有可能告诉 kubernetes 将 sidecar 的故障忽略为“误报”事件,这绝对没问题?

我在 Pod 规范中找不到任何控制该行为的内容。

我的yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myapp
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: myapp
    spec:
      volumes:
      - name: logs-dir
        emptyDir: {}
      containers:
      - name: myapp
        image: ${IMAGE}
        ports:
        - containerPort: 9009
        volumeMounts:
        - name: logs-dir
          mountPath: /usr/src/app/logs
        resources:
          limits:
            cpu: "1"
            memory: "512Mi"
        readinessProbe:
          initialDelaySeconds: 60 
          failureThreshold: 8 
          timeoutSeconds: 1
          periodSeconds: 8 
          httpGet:
            scheme: HTTP
            path: /myapp/v1/admin-service/git-info
            port: 9009
      - name: graylog-sidecar
        image: digiapulssi/graylog-sidecar:latest
        volumeMounts:
        - name: logs-dir
          mountPath: /log
        env:
        - name: GS_TAGS
          value: "[\"myapp\"]"
        - name: GS_NODE_ID
          value: "nodeid"
        - name: GS_SERVER_URL
          value: "${GRAYLOG_URL}"
        - name: GS_LIST_LOG_FILES
          value: "[\"/ctwf\"]"
        - name: GS_UPDATE_INTERVAL
          value: "10"
        resources:
          limits:
            memory: "128Mi"
            cpu: "0.1"
Run Code Online (Sandbox Code Playgroud)

gar*_*ium 0

自定义 livenessProbe 应该有所帮助,但对于您的场景,我将使用您的主应用程序容器的活性,即myapp.
考虑到您不关心副作用(如上所述)。我会将 pod 设置restartPolicyNever,然后为您的 main 定义一个自定义的 liveinessProbe myapp。这样,无论哪个容器发生故障,Pod 都永远不会重新启动,但是当您的myapp容器的活力失败时kubelet,容器将重新启动!参考下面,链接

Pod 正在运行并且有两个容器。容器 1 失败退出。

记录失败事件。如果restartPolicy为:Always:重启容器;Pod 阶段保持运行状态。OnFailure:重启容器;Pod 阶段保持运行状态。Never:不重启Container;Pod 阶段保持运行状态。

所以更新后的(伪)yaml 应该如下所示

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myapp
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    ...
    spec:
      ...
      restartPolicy: Never
      containers:
      - name: myapp
        ...
        livenessProbe:
          exec:
            command:
            - /bin/sh
            - -c
            - {{ your custom liveliness check command goes }}
          failureThreshold: 3
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        readinessProbe:
          ...
      - name: graylog-sidecar
        ...
Run Code Online (Sandbox Code Playgroud)

注意:因为我不知道你的应用程序,所以我无法编写命令,但对于我的 jboss 服务器,我使用这个(给你的例子)

livenessProbe:
          exec:
            command:
            - /bin/sh
            - -c
            - /opt/jboss/wildfly/bin/jboss-cli.sh --connect --commands="read-attribute
              server-state"
          failureThreshold: 3
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
Run Code Online (Sandbox Code Playgroud)