Kubernetes postStart hook 导致竞争条件
Kubernetes postStart hook leads to race condition
我在 Kubernetes 上使用 MySQL 和 postStart
挂钩,它应该 运行 在数据库启动后进行查询。
这是我template.yaml
的相关部分:
spec:
containers:
- name: ${{APP}}
image: ${REGISTRY}/${NAMESPACE}/${APP}:${VERSION}
imagePullPolicy: Always
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- hostname && sleep 12 && echo $QUERY | /opt/rh/rh-mysql80/root/usr/bin/mysql
-h localhost -u root -D grafana
-P 3306
ports:
- name: tcp3306
containerPort: 3306
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 15
timeoutSeconds: 1
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 120
timeoutSeconds: 1
当 pod 启动时,数据库的 PVC 损坏并且 pod 崩溃。当我重新启动 pod 时,它可以工作。我猜查询 运行s,当数据库还没有启动时。我想这可能会通过 readinessprobe 得到解决,但我不是这些主题的专家。
有没有其他人运行遇到过类似的问题并且知道如何解决?
请注意,postStart
将至少被调用一次,但也可能被调用多次。这使得 postStart
成为 运行 查询的糟糕位置。
您可以在单独的 MYSQL 容器中设置 pod restartPolicy: OnFailure
和 运行 查询。使用 wait 和 运行 查询启动第二个容器。请注意,您的查询应产生幂等结果,否则您的数据完整性可能会中断;考虑何时使用现有数据卷重新创建 Pod。
我在 Kubernetes 上使用 MySQL 和 postStart
挂钩,它应该 运行 在数据库启动后进行查询。
这是我template.yaml
的相关部分:
spec:
containers:
- name: ${{APP}}
image: ${REGISTRY}/${NAMESPACE}/${APP}:${VERSION}
imagePullPolicy: Always
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- hostname && sleep 12 && echo $QUERY | /opt/rh/rh-mysql80/root/usr/bin/mysql
-h localhost -u root -D grafana
-P 3306
ports:
- name: tcp3306
containerPort: 3306
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 15
timeoutSeconds: 1
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 120
timeoutSeconds: 1
当 pod 启动时,数据库的 PVC 损坏并且 pod 崩溃。当我重新启动 pod 时,它可以工作。我猜查询 运行s,当数据库还没有启动时。我想这可能会通过 readinessprobe 得到解决,但我不是这些主题的专家。
有没有其他人运行遇到过类似的问题并且知道如何解决?
请注意,postStart
将至少被调用一次,但也可能被调用多次。这使得 postStart
成为 运行 查询的糟糕位置。
您可以在单独的 MYSQL 容器中设置 pod restartPolicy: OnFailure
和 运行 查询。使用 wait 和 运行 查询启动第二个容器。请注意,您的查询应产生幂等结果,否则您的数据完整性可能会中断;考虑何时使用现有数据卷重新创建 Pod。