docker - 无法将现有数据挂载到 kubernetes 中的持久卷

标签 docker kubernetes clickhouse

我正在使用 clickhouse 数据库,数据存储在 /media/user/data/clickhouse/media/user/data/clickhouse-server 中。当我运行 docker 容器时

$ docker run \
    --name local-clickhouse \
    --ulimit nofile=262144:262144 \
    -u 1000:1000 \
    -p 8123:8123 \
    -p 9000:9000 \
    -p 9009:9009 \
    -v /media/user/data/clickhouse:/var/lib/clickhouse \
    -v /media/user/data/clickhouse-server:/var/log/clickhouse-server \
    -dit clickhouse/clickhouse-server

我看到了数据,一切都很好。我正在尝试使用带有以下持久卷配置的 minikube 在 pod 中运行它:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: host-pv-clickhouse
spec:
  capacity:
    storage: 4000Gi   
  volumeMode: Filesystem
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /media/user/data/clickhouse
    type: DirectoryOrCreate

apiVersion: v1
kind: PersistentVolume
metadata:
  name: host-pv-clickhouse-server
spec:
  capacity:
    storage: 4000Gi 
  volumeMode: Filesystem  
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /media/user/data/clickhouse-server
    type: DirectoryOrCreate

此外,我还有持久卷声明:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: host-pvc-clickhouse-server
spec:
  volumeName: host-pv-clickhouse-server
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2000Gi
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: host-pvc-clickhouse
spec:
  volumeName: host-pv-clickhouse
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2000Gi

最后是服务和部署:

apiVersion: v1
kind: Service
metadata:
  name: clickhouse
spec:
  type: NodePort
  ports:
    - protocol: TCP
      name: tcp
      port: 9000
      targetPort: 9000
      nodePort: 30003
    - protocol: TCP
      name: http
      port: 8123
      targetPort: 8123
      nodePort: 30004
    - protocol: TCP
      name: interncomm
      port: 9009
      targetPort: 9009
      nodePort: 30005
  selector:
    app: clickhouse
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: clickhouse
  labels:
    app: clickhouse
spec:
  replicas: 1
  selector:
    matchLabels:
      app: clickhouse
  template:
    metadata:
      labels:
        app: clickhouse
    spec:
      containers:
        - name: clickhouse
          image: clickhouse/clickhouse-server:latest
          ports:
            - containerPort: 8123
              name: http
            - containerPort: 9000
              name: tcp
            - containerPort: 9009
              name: interncomm
          volumeMounts:
            - name: clickhouse-volume
              mountPath: /var/lib/clickhouse
            - name: clickhouse-server-volume
              mountPath: /var/log/clickhouse-server
      volumes:
        - name: clickhouse-volume
          persistentVolumeClaim: 
            claimName: host-pvc-clickhouse
        - name: clickhouse-server-volume
          persistentVolumeClaim: 
            claimName: host-pvc-clickhouse-server

当我运行时 kubectl apply -f chdb_node.yaml 它可以工作,我可以通过 clickhouse 的 Web gui 访问数据库。但是,数据不存在。

关于如何解决这个问题有什么建议吗?

最佳答案

首先检查主机上的 /media/user/data/clickhouse/media/user/data/clickhouse-server 中的数据是否确实包含预期的 ClickHouse数据。

请记住,当您使用 Minikube 时,它​​通常在虚拟机(如 VirtualBox)中运行。这意味着您提供的 hostPath 引用的是虚拟机的文件系统,而不是您的实际主机。
要将 Minikube 中的主机文件系统与 hostPath 一起使用,您应该使用 minikube mount 确保该目录已正确安装到 Minikube VM 中。 .

minikube mount /media/user/data:/media/user/data

这会将主机中的 /media/user/data 目录挂载到 Minikube VM 的同一位置。完成此操作后,您的 hostPath 配置应该按预期工作。

警告:您的 Docker 运行命令指定 UID 和 GID 为 1000:1000 的用户和组。确保 /media/user/data/clickhouse/media/user/data/clickhouse-server 处的文件和目录归此 UID 和 GID 所有。如果没有,ClickHouse 服务器可能无法读取它们。
在 Kubernetes pod 中,您没有指定运行容器的用户或组。您可能希望使用 the securityContext 设置与 Docker 相同的用户。 :

spec:
    containers:
    - name: clickhouse
        ...
        securityContext:
        runAsUser: 1000
        runAsGroup: 1000

关于docker - 无法将现有数据挂载到 kubernetes 中的持久卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76882035/

相关文章:

docker - 如何在 Docker 容器中设置 net.core.* 和 net.ipv4.* sysctl 属性

bash - 列出kubernetes节点的内存和cpu

go - 将自定义 Webhook 添加到 Kubernetes GO Operator

kubernetes - 部署和PVC

clickhouse - 无法启动 ClickHouse。退出代码 203

wordpress - 在 docker 容器中的 nginx 上进行 Woocommerce webhook 调试

docker - python3 nodejs docker 图像

docker - 如何从一个私有(private)注册表中提取 Docker 镜像并将其推送到 Jenkins 管道中的第二个不同的私有(private)注册表

clickhouse - 通过 clickhouse 命令行连接到远程 clickhouse db