0

我在 Kubernetes 上使用带有postStart钩子的 MySQL,它应该在数据库启动后运行查询。

这是我的相关部分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 时,它可以工作。我猜查询会在数据库尚未启动时运行。我想这可能会通过 readinessprobe 解决,但我不是这些主题的专家。

有没有其他人遇到过类似的问题并知道如何解决?

4

1 回答 1

2

请注意,postStart将至少调用一次,但也可能多次调用。这使得postStart运行查询的地方很糟糕。

您可以设置 podrestartPolicy: OnFailure并在单独的 MYSQL 容器中运行查询。等待启动您的第二个容器并运行您的查询。请注意,您的查询应该产生幂等结果,否则您的数据完整性可能会中断;考虑何时使用现有数据量重新创建 pod。

于 2021-11-17T10:34:43.500 回答