Kubernetes单节点环境安装hostpath-provisioner

开发和运维人员在进行开发或测试部署的时候,常常使用的是单节点的Kubernetes环境。了解Kubernetes的都知道,在Kubernetes中,Pod一旦重启,Pod中的数据就会丢失,因此需要持久化存储的支持。虽然Kubernetes的PV支持多种存储驱动方式,网上大部分推荐使用的是NFS,但避免不了要先搭建一个NFS Server,而且集群只有一个节点,这种方式不仅麻烦而且低效。这个时候hostPath方式就成了最佳的选择,开销最小效率最高,并且可以结合StorageClass来实现其动态供给。

hostpath-provisioner介绍


hostpath-provisioner是一种在单节点Kubernetes集群中动态供应Kubernetes HostPath Volumes的工具。基于kubernetes-sigs/sig-storage-lib-external-provisioner/hostpath-provisioner示例项目。提供官方Helm Chart,部署十分方便。

兼容矩阵


hostpath-provisioner version chart version Helm2 Helm3
v0.2.4 0.2.12 ×
v0.2.3 0.2.11
v0.2.3 0.2.10
v0.2.3 0.2.9
v0.2.3 0.2.8
v0.2.3 0.2.7
v0.2.2 0.2.6
v0.2.2 0.2.5
v0.2.2 0.2.4
v0.2.1 0.2.3
v0.2.1 0.2.2
v0.2.0 0.2.0

安装hostpath-provisioner


Helm2

说明
以chart version 0.2.11版本为例,0.2.12开始不再支持Helm2

添加Helm仓库

1
helm repo add rimusz https://charts.rimusz.net

创建hostpath-provisioner命令空间(命名空间可自定义),并将hostpath-provisioner安装在此命名空间中

1
kubectl create namespace hostpath-provisioner

安装hostpath-provisioner

  • release名称为my-hostpath-provisioner(release名称可自定义)
  • --set storageClass.defaultClass=false指定是否将hostpath作为默认StorageClass
  • 0.2.11及其之前版本不支持直接传递参数设置自定义目录作为主机路径挂载点,默认为/mnt/hostpath,若需修改,需先执行helm fetch rimusz/hostpath-provisioner --version 0.2.11 --untar拉取chart,然后修改values.yaml中的NodeHostPath为指定目录,最后执行helm install --name my-hostpath-provisioner -f values.yaml . --namespace hostpath-provisioner --set storageClass.defaultClass=false安装
  • 更多参数可按版本到https://artifacthub.io/packages/helm/rimusz/hostpath-provisioner查看
1
helm install --name my-hostpath-provisioner rimusz/hostpath-provisioner --version 0.2.11 --namespace hostpath-provisioner --set storageClass.defaultClass=false

查看pod是否处于Running状态

1
kubectl get pod -n hostpath-provisioner

Helm3

说明
以chart version 0.2.12版本为例

添加Helm仓库

1
helm repo add rimusz https://charts.rimusz.net

创建hostpath-provisioner命令空间(命名空间可自定义),并将hostpath-provisioner安装在此命名空间中

1
kubectl create namespace hostpath-provisioner

安装hostpath-provisioner

  • release名称为my-hostpath-provisioner(release名称可自定义)
  • --set storageClass.defaultClass=false指定是否将hostpath作为默认StorageClass
  • --set nodeHostPath=/mnt/hostpath设置一个自定义目录作为主机路径挂载点,默认为/mnt/hostpath
  • 更多参数可按版本到https://artifacthub.io/packages/helm/rimusz/hostpath-provisioner查看
1
helm install my-hostpath-provisioner rimusz/hostpath-provisioner --version 0.2.12 --namespace hostpath-provisioner --set storageClass.defaultClass=false --set nodeHostPath=/mnt/hostpath

查看pod是否处于Running状态

1
kubectl get pod -n hostpath-provisioner

验证hostpath-provisioner


执行如下YAML,测试创建HostPath PVC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
cat > /root/hostpath-pvc.yaml << EOF
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-hostpath-pvc
spec:
storageClassName: "hostpath"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi

---
kind: Deployment
apiVersion: apps/v1
metadata:
name: test-deployment
labels:
app: test-deployment
spec:
replicas: 1
selector:
matchLabels:
app: test-deployment
template:
metadata:
labels:
app: test-deployment
spec:
containers:
- name: test-deployment
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
volumeMounts:
- name: hostpath-pvc
mountPath: "/usr/share/nginx/html"
volumes:
- name: hostpath-pvc
persistentVolumeClaim:
claimName: test-hostpath-pvc
EOF

kubectl apply -f /root/hostpath-pvc.yaml

# 确认PVC和PV是否创建成功,Pod是否正常Running
kubectl get pvc
kubectl get pv
kubectl get pod

# 查看是否存在对应pvc目录
ls /mnt/hostpath/

# 验证完删除
kubectl delete -f /root/hostpath-pvc.yaml

# 查看对应pvc目录是否删除
ls /mnt/hostpath/

删除hostpath-provisioner


Helm2

1
helm delete --purge my-hostpath-provisioner

Helm3

1
helm delete my-hostpath-provisioner --namespace hostpath-provisioner