我有一个多容器应用程序: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)
自定义 livenessProbe 应该有所帮助,但对于您的场景,我将使用您的主应用程序容器的活性,即myapp
.
考虑到您不关心副作用(如上所述)。我会将 pod 设置restartPolicy
为Never
,然后为您的 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)
归档时间: |
|
查看次数: |
6240 次 |
最近记录: |