k8s中pod目录访问权限不足

相关背景

在调试mysql-operator和mysql,在部署mysql的过程中,一直出现,mysqld: File ‘/var/lib/mysql-bin.index’ permission deined或者报错Can’t find error-message file ‘/usr/local/mysql/errmsg.sys’

cluster.yaml

apiVersion: mysql.presslabs.org/v1alpha1
kind: MysqlCluster
metadata:
  name: my-cluster
spec:
  replicas: 2
  secretName: my-secret
  volumeSpec:
    hostPath:
      path: /data/mysql
      type: DirectoryOrCreate
  mysqlConf:
    innodb-buffer-pool-size: 1Gi

通过kubectl describe pod podname查看到pod是卡在了mysql-init-log或mysql容器启动过程中。
通过kubectl logs podname -c containername查看到容器的报错都为无法读写容器内/var/lib/mysql目录,而导致容器执行异常退出,而且镜像都在percona镜像。
服务器/data/mysql挂载了容器中的/var/lib/mysql。

思路

  1. 判断是服务器上的/data/mysql权限配置不对,导致容器挂载后无权限。容器的默认用户为mysql,uid为999,gid为999。通过将/data/mysql权限设置为777,以及将目录用户和组设置为999:999,问题依旧存在。分析有误。
  2. 通过手动模拟容器挂载,复现该问题,判断是否为容器启动时候的权限问题。
    docker run -v /data/mysql:/var/lib/mysql -it percona bash,进入容器后,/var/lib/mysql目录用户就为999,可以访问并读写文件,无问题。分析有误。
  3. 通过改变挂载目录/data/mysql变为/data,很奇怪,可以通过init-container,但是无法执行mysql的逻辑。问题依旧存在。
  4. 可能是k8s启动有问题,通过模拟mysql容器化启动逻辑,启动后进入pod,判断问题能否复现。
    执行kubectl apply -f pod.yaml,让容器一直在sleep中,并进入容器kubectl exec -it podname – bash,发现/var/lib/mysql的目录用户和组都为root,则确认问题。k8s启动pod和docker启动容器的逻辑不同,k8s会默认使用root来创建设置挂载目录,而docker是使用宿主机上的目录的用户和组。
    相关代码:
apiVersion: v1
kind: Pod
metadata:
  name: mytest
spec:
  containers:
    - name: percona
      image: percona
      volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql
      imagePullPolicy: IfNotPresent
      command:
        - /usr/bin/bash
        - -c
        - sleep 200000000
  volumes:
    - name: mysql
      hostPath:
        path: /data/mysql
  1. 修复
    使用init-container挂载相同目录来修改目录权限解决。相关代码:
apiVersion: mysql.presslabs.org/v1alpha1
kind: MysqlCluster
metadata:
  name: my-cluster
spec:
  replicas: 2
  secretName: my-secret
  volumeSpec:
    hostPath:
      path: /data/mysql
      type: DirectoryOrCreate
  mysqlConf:
    innodb-buffer-pool-size: 1Gi
  podSpec:
    initContainers:
      - name: volume-permissions
        image: busybox
        securityContext:
          runAsUser: 0
        command:
          - sh
          - -c
          - chmod 750 /datea/mysqlk; chown 999:999 /data/mysql
        volumeMounts:
          - name: data
            mountPath: /data/mysql
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Kubernetes (K8s) 是一个开源的容器编排平台,可以用于自动化管理容器的部署、扩展和操作。在 K8s Pod 是最小的可部署单元,可以包含一个或多个容器,并共享同一个网络命名空间和 IPC(进程间通信)。 共享内存是一种进程间通信的方式,用于使不同的进程可以互相访问和修改同一块内存区域。在 K8s Pod 内容器,可以通过多种方式实现共享内存。 一种常见的方式是使用共享卷(Shared Volume)。共享卷可以被多个容器挂载,在这些容器之间共享相同的文件或目录。通过在容器的定义文件配置共享卷,可以将特定的文件系统路径挂载到所有相关容器,从而实现共享内存的目的。 另一种方式是使用共享内存的网络协议,如共享内存网络(Shared Memory Network)。共享内存网络是一种高性能的通信机制,可以在同一个主机上的不同容器之间实现低延迟、高吞吐量的数据传输。通过在容器的定义文件配置和启动共享内存网络,可以使相关容器能够共享内存区域,进而实现共享内存的目的。 需要注意的是,在 K8s 实现共享内存时,需要留意容器之间的数据隔离和安全性,以避免潜在的数据泄露或冲突问题。可以通过合理的访问控制和权限管理等方式,确保共享内存的安全和可靠。 总之,K8s Pod 内容器可以通过共享卷或共享内存网络等方式实现共享内存。这种共享内存的机制可以使容器之间能够互相访问和修改同一块内存区域,从而实现数据共享和协同工作的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值