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。