简体   繁体   English

在 Kubernetes 上创建时如何初始化 mysql 容器?

[英]How to initialize mysql container when created on Kubernetes?

I want to set initial data on MySQL of container.我想在容器的 MySQL 上设置初始数据。 In docker-compose.yml, such code can create initial data when running container.在 docker-compose.yml 中,此类代码可以在运行容器时创建初始数据。

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

However, how can I create initial data on Kubernetes when running?但是,运行时如何在 Kubernetes 上创建初始数据?

According to the MySQL Docker image README , the part that is relevant to data initialization on container start-up is to ensure all your initialization files are mount to the container's /docker-entrypoint-initdb.d folder.根据 MySQL Docker 镜像README ,与容器启动时数据初始化相关的部分是确保所有初始化文件都挂载到容器的/docker-entrypoint-initdb.d文件夹。

You can define your initial data in a ConfigMap , and mount the corresponding volume in your pod like this:您可以在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');

First: create persistent volume that contains your SQL scripts首先:创建包含您的 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

Note: assume that you have your SQL scripts in /path/to/initdb/sql/scripts注意:假设您在/path/to/initdb/sql/scripts中有 SQL 脚本

Second: mount the volume to /docker-entrypoint-initdb.d第二:将卷挂载到/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

That's it.而已。

Note: this applies to PostgreSQL too.注意:这也适用于 PostgreSQL。

you need to create pv and pvclaim like this then deploy the mysql database您需要像这样创建 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

create secret:创建秘密:

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 deployment: 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM