我有以下部署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就不会重新加载架构。
答案 0 :(得分:1)
这是预期的行为。 /docker-entrypoint-initdb.d/
目录下的初始化文件仅在数据目录为空时运行。这意味着只有第一次。
如果查看MySQL 5.6的入口点脚本,则可以看到此过程。 在line 98中,它检查数据目录是否为空。
/docker-entrypoint-initdb.d/
目录的初始化文件。请参见line 190-192 在kubernetes中,当您使用持久卷时,这些卷在删除和重新创建Pod时仍然存在。因此,当pod重新启动时,数据目录不为空。因此,MySQL跳过了line 98 - 202
中的init部分。