我正在使用 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/