如何在裸金属Kubernetes集群部署HA Dgraph并配置本地存储
我之前在裸金属K8s集群部署Dgraph HA时也碰到过完全一样的问题!核心原因是裸金属集群默认没有能动态创建PersistentVolume(PV)的StorageClass,而官方Dgraph配置里的PersistentVolumeClaim(PVC)需要绑定到现成的PV才能让Pod脱离Pending状态。下面是我亲测有效的解决方案,用本地存储来适配Dgraph的存储需求:
1. 创建本地存储专用的StorageClass
首先需要创建一个支持本地存储的StorageClass,关键是设置volumeBindingMode: WaitForFirstConsumer,这样K8s会先把Pod调度到有对应本地PV的节点,再完成PVC和PV的绑定,避免调度错误。
创建local-storageclass.yaml文件:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: dgraph-local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer
执行命令应用:
kubectl apply -f local-storageclass.yaml
2. 为Dgraph Alpha和Zero节点创建本地PV
本地存储需要静态创建PV,因为无法动态供给。首先在目标K8s节点上创建存储目录(比如我选node-1作为alpha-0和zero-0的运行节点):
# 在node-1节点上执行 mkdir -p /var/dgraph/alpha-0 mkdir -p /var/dgraph/zero-0 # 设置权限,确保Dgraph容器能读写(Dgraph容器默认用uid 1000) chown -R 1000:1000 /var/dgraph/alpha-0 chown -R 1000:1000 /var/dgraph/zero-0
然后创建alpha-0对应的PV文件dgraph-alpha-0-pv.yaml:
apiVersion: v1 kind: PersistentVolume metadata: name: dgraph-alpha-0-pv spec: capacity: storage: 10Gi # 根据你的需求调整大小 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: dgraph-local-storage local: path: /var/dgraph/alpha-0 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node-1 # 替换成你的节点名称
同样创建zero-0的PV文件dgraph-zero-0-pv.yaml:
apiVersion: v1 kind: PersistentVolume metadata: name: dgraph-zero-0-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: dgraph-local-storage local: path: /var/dgraph/zero-0 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node-1
执行命令创建PV:
kubectl apply -f dgraph-alpha-0-pv.yaml kubectl apply -f dgraph-zero-0-pv.yaml
3. 修改Dgraph部署配置中的PVC
打开你使用的官方Dgraph部署yaml文件,找到alpha和zero的PVC部分,添加storageClassName: dgraph-local-storage,确保PVC能匹配我们创建的StorageClass和PV。
比如alpha的PVC修改后:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: dgraph-alpha-0 namespace: dgraph spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: dgraph-local-storage # 新增这一行
zero的PVC同理修改。
4. 重新部署Dgraph
删除原来的Pending Pod,然后重新应用修改后的部署配置:
kubectl delete pod dgraph-alpha-0 dgraph-zero-0 --namespace dgraph kubectl apply -f your-modified-dgraph-deployment.yaml
等几分钟后再查看Pod状态,应该就能看到alpha和zero Pod正常启动了:
kubectl get pod --namespace dgraph
如果是多节点的HA集群(比如3个alpha、3个zero),只需要在每个节点上重复步骤2的目录创建和PV配置,每个实例对应一个绑定到特定节点的PV即可。
内容的提问来源于stack exchange,提问作者uberrebu

