【问题标题】:mysql container won't start on kubernetes when backed by NFS Dynamic provisioner由 NFS 动态配置器支持时,mysql 容器不会在 kubernetes 上启动
【发布时间】:2020-03-07 01:11:02
【问题描述】:

我在正确启动 mysql 容器时遇到问题。但总而言之,使用 nfs 动态配置器,即使 NFS 挂载在容器中,mysql 容器也不会启动并抛出 mkdir: cannot create directory '/var/lib/mysql/': File exists 错误,并且似乎运行正常。

我从这里https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client 安装了安装在我的 K8 集群上的动态 NFS 配置程序。他们在说明中显示的测试声明和测试吊舱有效。

现在要运行mysql,我从这里取了代码sn-ps:

https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/

kubectl apply mysql-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: managed-nfs-storage  <--- THIS MATCHES MY NFS STORAGECLASS
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

kubectl apply -f mysql-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
          # Use secret in real usage
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
kubectl get pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                          STORAGECLASS          REASON   AGE
persistentvolume/mysql-pv-volume                            20Gi       RWO            Retain           Bound    default/mysql-pv-claim         managed-nfs-storage            5m16s

NAMESPACE      NAME                                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
default        persistentvolumeclaim/mysql-pv-claim    Bound    mysql-pv-volume                            20Gi       RWO            managed-nfs-storage   5m27s

pv 是由动态配置器自动创建的

得到错误...

$ kubectl logs mysql-7d7fdd478f-l2m8h
2020-03-05 18:26:21+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.47-1debian9 started.
2020-03-05 18:26:21+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-03-05 18:26:21+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.47-1debian9 started.
mkdir: cannot create directory '/var/lib/mysql/': File exists

此错误会阻止容器启动...

我去删除了部署并添加了command: [ "/bin/sh", "-c", "sleep 100000" ],这样容器就会启动...

进入容器后,我检查了 NFS 挂载是否正确挂载并且可写...

# df -h | grep mysql
nfs1.example.com:/k8/default-mysql-pv-claim-pvc-0808d1bd-69ca-4ff5-825a-b846b1133e3a  1.0T  1.6G 1023G   1% /var/lib/mysql

如果我创建一个“本地”pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

并创建了 mysql 部署,mysql pod 启动没有问题。

所以在这一点上,使用动态配置(可能只是在 NFS 上?)mysql 容器不起作用。

大家有什么建议吗?

【问题讨论】:

    标签: mysql kubernetes


    【解决方案1】:

    我不确定这是什么原因,所以这里有几个选项。

    首先您可以尝试设置securityContext,因为卷可能在没有适当权限的情况下安装。

    apiVersion: v1
    kind: Pod
    metadata:
      name: security-context-demo
    spec:
      securityContext:
        runAsUser: 1000
        runAsGroup: 3000
        fsGroup: 2000
      volumes:
      - name: sec-ctx-vol
        emptyDir: {}
      containers:
      - name: sec-ctx-demo
        image: busybox
        command: [ "sh", "-c", "sleep 1h" ]
        volumeMounts:
        - name: sec-ctx-vol
          mountPath: /data/demo
        securityContext:
          allowPrivilegeEscalation: false
    

    您可以通过在容器中输入idgid 来找出正确的组ID 和用户。 或者只使用kubectl exec -it &lt;pod-name&gt; bash

    其次,尝试使用subPath

    volumeMounts:
    - name: mysql-persistent-storage
      mountPath: "/var/lib/mysql"
      subPath: mysql
    

    如果这不起作用,我会在另一个 pod 上使用正在创建目录的initContainer 测试 NFS。 我可能会使用this guide 重做整个nfs。

    【讨论】:

    • 谢谢。我检查了 gid/uid 和 id:uid=0(root) gid=0(root) groups=0(root),gid = 0。我也尝试了 subPath,但没有骰子。我不太明白initContainer 是什么。那是在什么地方?是在容器中还是在 pod 中创建的?
    • @KevinVasko,here 是有关initContainers 的文档的链接。
    • 谢谢。我创建了一个安装驱动器的 initContainer 并将一个测试文件写入该文件夹。即使 initContainer 没有问题,主 mysql 容器也有相同的错误。我认为这与 NFS、配置没有任何关系。我认为它与mysql容器有关,但我找不到它。
    • 我不认为 mysql 容器以 root 身份运行,而是以 mysql 用户身份运行。尝试更改权限以允许该用户。
    • 在此处查看解决方案。 github.com/kubeflow/kubeflow/issues/4827#issuecomment-598803422 它基本上是 NFS 配置程序自动为 NFS 共享选择最高安全上下文,而不是像我期望的那样 sec=sys
    猜你喜欢
    • 2019-11-18
    • 2017-09-03
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多