如何强制Kubernete加载mysql数据库?

时间:2019-02-03 19:31:06

标签: docker kubernetes

我有以下部署yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iam-mysql
  labels:
    app: iam
    tier: mysql
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iam
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: iam
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: iam-mysql
        envFrom:
        - configMapRef:
            name: iam-mysql-conf-dev
        - secretRef:
            name: iam-mysql-pass-dev
        ports:
        - containerPort: 3306
          name: iam-mysql
        volumeMounts:
          - name: iam-mysql-persistent-storage
            mountPath: /var/lib/mysql
          - name: mysql-initdb
            mountPath: /docker-entrypoint-initdb.d
      restartPolicy: Always
      volumes:
        - name: iam-mysql-persistent-storage
          persistentVolumeClaim:
            claimName: iam-mysql-pv-claim
        - name: mysql-initdb
          configMap:
            name: iam-mysql-initdb-dev

创建新架构后,我无法使用新架构重新加载“ iam-mysql-initdb-dev”。实际上,我删除了Pod内的一个表(用户),并且当我再次创建部署时,该表(用户)不存在。这意味着一旦重新创建部署,kubernetes就不会重新加载架构。

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 /docker-entrypoint-initdb.d/目录下的初始化文件仅在数据目录为空时运行。这意味着只有第一次。

如果查看MySQL 5.6的入口点脚本,则可以看到此过程。 在line 98中,它检查数据目录是否为空。

  • 如果为空,则脚本将运行/docker-entrypoint-initdb.d/目录的初始化文件。请参见line 190-192
  • 如果不为空,则将从line 98 - 202
  • 中忽略整个入口点脚本。

在kubernetes中,当您使用持久卷时,这些卷在删除和重新创建Pod时仍然存在。因此,当pod重新启动时,数据目录不为空。因此,MySQL跳过了line 98 - 202

中的init部分。