如何在 Kubernetes 上创建 MySQL 容器时进行初始化?

27

我想在MySQL容器中设置初始数据。 在docker-compose.yml中,这段代码可以在运行容器时创建初始数据。

volumes:
  - db:/var/lib/mysql
  - "./docker/mysql/conf.d:/etc/mysql/conf.d"
  - "./docker/mysql/init.d:/docker-entrypoint-initdb.d"

然而,当我运行时,如何在Kubernetes上创建初始数据?

3个回答

47
根据MySQL Docker镜像README,与容器启动时数据初始化相关的部分是确保所有初始化文件都挂载到容器的/docker-entrypoint-initdb.d文件夹中。
您可以在ConfigMap中定义初始数据,并像这样在Pod中挂载相应的卷:
apiVersion: v1
kind: Pod
metadata:
  name: mysql
spec:
  containers:
  - name: mysql
    image: mysql        
    ports:
      - containerPort: 3306
    volumeMounts:
      - name: mysql-initdb
        mountPath: /docker-entrypoint-initdb.d
  volumes:
    - name: mysql-initdb
      configMap:
        name: mysql-initdb-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-initdb-config
data:
  initdb.sql: |
    CREATE TABLE friends (id INT, name VARCHAR(256), age INT, gender VARCHAR(3));
    INSERT INTO friends VALUES (1, 'John Smith', 32, 'm');
    INSERT INTO friends VALUES (2, 'Lilian Worksmith', 29, 'f');
    INSERT INTO friends VALUES (3, 'Michael Rupert', 27, 'm');

虽然我设置了hostPath,但似乎需要绝对路径。然而我遇到了这个错误。error: code = 2 desc = failed to start container "ae00a8dc51d8895506881960a310c447b67643ccd088d164891a68f32f124634": Error response from daemon: mkdir /gcptmp: read-only file system - Harry
@Harry 我已经更新了我的答案,使用 ConfigMap 来使用卷。使用 hostPath 需要你将容器运行为特权容器或修改主机上的文件权限以使其可写入 hostPath 卷中,在大多数情况下这是不必要的。 - ivan.sim
1
如果SQL语句很大,配置的yaml文件可能会变得混乱不堪。 在我的当前情况下,我创建了包括初始SQL文件的扩展MySQL镜像。 但是,我从你那里学到了很多。谢谢!! - Harry
看起来不错!我会试一下的!谢谢。之后我会反馈的! - Harry
1
当我将configmap添加到volumes字段中时,我会得到```spec.template.spec.volumes[0].configMap: Forbidden: may not specify more than 1 volume type
  • spec.template.spec.containers[0].volumeMounts[0].name: Not found: "mysql-initdb"```。有人知道问题是什么吗?这是我的配置
- name: mysql-persistent-storage configMap: name: mysql-initdb-config persistentVolumeClaim: claimName: mysql-volumeclaim```
- pizza
显示剩余3条评论

8

第一步:创建包含SQL脚本的持久化卷

kind: PersistentVolume
apiVersion: v1
metadata:
  name: mysql-initdb-pv-volume
  labels:
    type: local
    app: mysql
spec:
  storageClassName: manual
  capacity:
    storage: 1Mi
  accessModes:
    - ReadOnlyMany
  hostPath:
    path: "/path/to/initdb/sql/scripts"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-initdb-pv-claim
  labels:
    app: mysql
spec:
  storageClassName: manual
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 1Mi

注意:假设您的SQL脚本存放在/path/to/initdb/sql/scripts中。

第二步:将卷挂载到/docker-entrypoint-initdb.d中。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 3306
          volumeMounts:
            - mountPath: /docker-entrypoint-initdb.d
              name: mysql-initdb
      volumes:
        - name: mysql-initdb
          persistentVolumeClaim:
            claimName: mysql-initdb-pv-claim

就是这样。

注意:这同样适用于PostgreSQL。


0

你需要像这样创建 pv 和 pvclaim,然后部署 MySQL 数据库。

kind: PersistentVolume
apiVersion: v1
metadata:
  name: sfg-dev-mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/tmp/data"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: sfg-dev-mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

创建密钥:

kubectl create secret generic mysql-secret --from-literal=mysql-root-password=kube1234 --from-literal=mysql-user=testadm --from-literal=mysql-password=kube1234
kubectl create configmap db --from-literal=mysql-database: database

MySQL 部署:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: sfg-dev-mysql-db
  labels:
    app: sfg-dev-mysql
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: sfg-dev-mysql
        tier: db
    spec:
      containers:
      - image: mysql:8.0.2
        name: mysql
        env:
        - name: MYSQL_DATABASE
          valueFrom:
            configMapKeyRef:
              name: db
              key: mysql-database        
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: mysql-root-password
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: mysql-user
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: mysql-password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: sfg-dev-mysql-pv-claim

我有一些SQL文件用于创建表和插入数据。 当创建容器时,我想将其用于初始化。 这段代码似乎与此无关。 - Harry
正如Ivan所回复的那样,您需要使用PV、PVC挂载SQL文件系统。 - sfgroups

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接