【问题标题】:K8S MySql configmap - Read-only file systemK8S MySql configmap - 只读文件系统
【发布时间】:2022-01-27 20:20:22
【问题描述】:

我正在尝试使用 kubernetes configmap 和 PV 和 PVC 传递 mysql 配置,但出现错误。

chown: /var/lib/mysql/..data: Read-only file system
chown: /var/lib/mysql/crud.sql: Read-only file system
chown: /var/lib/mysql/..2021_12_29_12_32_17.053559530: Read-only file system
chown: /var/lib/mysql/..2021_12_29_12_32_17.053559530: Read-only file system
chown: /var/lib/mysql/: Read-only file system
chown: /var/lib/mysql/: Read-only file system

如果我不是initContainers 使用我得到错误:

2021-12-29 12:49:05+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
chown: changing ownership of '/var/lib/mysql/': Read-only file system
chown: changing ownership of '/var/lib/mysql/..data': Read-only file system
chown: changing ownership of '/var/lib/mysql/crud.sql': Read-only file system
chown: changing ownership of '/var/lib/mysql/..2021_12_29_12_43_00.339135384': Read-only file system
chown: changing ownership of '/var/lib/mysql/..2021_12_29_12_43_00.339135384/crud.sql': Read-only file system

Deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.deployment.mysql.name }}
  namespace: {{ .Values.namespace }}
spec:
  selector:
    matchLabels:
      app: {{ .Values.deployment.mysql.name }}
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: {{ .Values.deployment.mysql.name }}
    spec:
      # initContainers:
      # - name: chmod-er
      #   image: busybox:latest
      #   command:
      #   - /bin/chown
      #   - -R
      #   - "999:999" 
      #   - /var/lib/mysql
      #   volumeMounts:
      #   - name: cm2
      #     mountPath: /var/lib/mysql

      containers:
      - image: {{ .Values.deployment.mysql.image }}
        name: {{ .Values.deployment.mysql.name }}
        securityContext:
          runAsUser: 0
        env:
         - name: MYSQL_ROOT_PASSWORD
           valueFrom: 
             secretKeyRef:
              name: mysql-secret
              key: mysql-root-password
        ports:
        - containerPort: {{ .Values.deployment.mysql.port }}
          name: {{ .Values.deployment.mysql.name }} 
        volumeMounts:
        - name: cm2
          mountPath: /var/lib/mysql/
          readOnly: false
      volumes:
      - name: mysqlvolume
        persistentVolumeClaim:
          claimName: mysqlvolume
          readOnly: false
      - name: cm2
        configMap:
          name: cm2

如您所见,我尝试使用 initContainers,但仍然遇到相同的错误。

pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysqlvolume
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 1Gi
  hostPath:
    path: C:\Users\ib151w\.minikube\volume

pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysqlvolume
  namespace: {{ .Values.namespace }}
  namespace: app
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Mi

configmap.yaml

apiVersion: v1
data:
  crud.sql: |-
    /*!40101 SET NAMES utf8 */;
    /*!40014 SET FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET SQL_NOTES=0 */;
    CREATE DATABASE /*!32312 IF NOT EXISTS*/ crud /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
    USE crud;

    DROP TABLE IF EXISTS books;
    CREATE TABLE `books` (
      `id` int NOT NULL AUTO_INCREMENT,
      `first_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
      `last_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
      `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
      `phone` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
      `department` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
      `manager` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
      `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
kind: ConfigMap
metadata:
  creationTimestamp: "2021-12-29T10:24:41Z"
  name: cm2
  namespace: app
  resourceVersion: "6526"
  uid: 31ab7ef8-94a4-41d3-af19-ddfceb04e124

我只是想在 Pod 启动时将此配置传递给 Pod,因此 mysql Pod 将包含我想要的数据库。

【问题讨论】:

    标签: mysql kubernetes configmap


    【解决方案1】:

    您正在安装 configMap(cm2),而 k8s 将 configMaps 安装为只读。您的意思是在/var/lib/mysql/ 下挂载mysqlvolume 并在其他地方挂载cm2? Mysql /var/lib/mysql 是 MySQL 写入 tablespace 数据的数据目录,而不是你挂载 configMap 的位置

    如果是这样:

    volumeMounts:
            - name: cm2
            - mountPath: /var/lib/mysql/
    

    这个应该改成

    volumeMounts:
            - name: mysqlvolume
            - mountPath: /var/lib/mysql/
    
    volumeMounts:
            - name: cm2
            - mountPath: ~/db_scripts ( or any other path)
    

    您还需要在容器上执行命令mysql < ~/db_scripts/crud.sql创建表。

    【讨论】:

    • 不,我不知道这是解决方法,我想将 CM 挂载到 /var/lib/mysql/ cm,就像数据库配置、db.sql 或类似的东西需要被放到/var/lib/mysql/ 注入到数据库和表等等。
    • @AngusYoungus DB配置SQL文件需要写权限有什么原因吗?数据库不需要写权限来设置数据库和表。但是,数据库需要写权限才能写它的表空间。
    • /var/lib/mysql是一个mysql数据目录,它写入表空间,你不应该在它下面挂载建表sql文件。
    • 到我需要注入 db.conf 文件的位置,当 pod 启动时,他拥有我在 conf 文件中编写的所有表?
    • 我更新了答案以包含 crud.sql 的挂载路径,您还需要执行命令mysql < ~/db_scripts/crud.sql
    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2018-04-10
    • 2012-06-03
    • 2020-04-26
    • 1970-01-01
    • 2016-08-04
    • 2020-07-01
    相关资源
    最近更新 更多