kubernetes 官方简介:https://kubernetes.io/docs/concepts/storage/persistent-volumes/#volume-cloning
码云:https://gitee.com/cainiao555/kubernrtes-PVstatic
提前须知几点:
1、pv 的回收策略
pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)。
#番外篇更改回收策略:
1、选择你的 PersistentVolumes 中的一个并更改它的回收策略:
2、kubectl patch pv -p ‘{“spec”:“persistentVolumeReclaimPolicy”:“Retain”}}’
这里的 是你选择的 PersistentVolume 的名字。
验证你选择的 PersistentVolume 拥有正确的策略:
kubectl get pv
2、pv支持以下类型:
3、PV卷阶段状态:
Available – 资源尚未被claim使用
Bound – 卷已经被绑定到claim了
Released – claim被删除,卷处于释放状态,但未被集群回收。
Failed – 卷自动回收失败
一、搭建NFS服务
搭建NFS服务
二、NFS共享文件
1)、添加nfs服务共享文件:
cat /etc/exports
2)、创建共享目录:
mkdir -p /root/kubernetes/pv_pvc/volumes/v{
1,2,3,4,5}
3)、创建测试显示文件——index.html
echo 1 > /root/kubernetes/pv_pvc/volumes/v1/index.html
echo 2 > /root/kubernetes/pv_pvc/volumes/v2/index.html
echo 3 > /root/kubernetes/pv_pvc/volumes/v3/index.html
echo 4 > /root/kubernetes/pv_pvc/volumes/v4/index.html
echo 5 > /root/kubernetes/pv_pvc/volumes/v5/index.html
4)、重载nfs共享配置文件
exportfs -arv
5)、查看本机共享文件
exportfs -arv
6)、添加内核参数:
#添加如下两条nfs服务——rpcbind避免服务启动失败
vim /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
sysctl -p
三、创建数据卷PV
1)、创建pv yaml文件
#分别对于卷的访问模式
apiVersion: v1
kind: PersistentVolume #设置控制器为PV
metadata:
name: pv01 #定义pv名称
labels:
name: pv01
spec:
nfs: #定义存储类型为nfs
path: /root/kubernetes/pv_pvc/volumes/v1 #nfs共享路径
server: 192.168.11.128 #nfs共享服务service
accessModes: #访问模式
- ReadWriteOnce #该卷可以通过单个节点以读写方式安装
- ReadOnlyMany #该卷可以被许多节点只读安装
- ReadWriteMany #该卷可以被许多节点读写安装
capacity: #容量
storage: 1Gi #存储大小
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02
labels:
name: pv02
spec:
nfs: #定义存储类型为nfs
path: /root/kubernetes/pv_pvc/volumes/v2 #nfs共享路径
server: 192.168.11.128 #nfs共享服务service
accessModes: #访问模式
- ReadWriteOnce #该卷可以通过单个节点以读写方式安装
capacity:
storage: 2Gi #存储大小
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv03
labels:
name: pv03
spec:
nfs: #定义存储类型为nfs
path: /root/kubernetes/pv_pvc/volumes/v3 #nfs共享路径
server: 192.168.11.128 #nfs共享服务service
accessModes: #访问模式
- ReadOnlyMany #该卷可以被许多节点只读安装
capacity:
storage: 3Gi #存储
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv04
labels:
name: pv04
spec:
nfs: #定义存储类型为nfs
path: /root/kubernetes/pv_pvc/volumes/v4 #nfs共享路径
server: 192.168.11.128 #nfs共享服务service
accessModes: #访问模式
- ReadWriteMany #该卷可以被许多节点读写安装
capacity:
storage: 4Gi #存储
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv05
labels:
name: pv05
spec:
nfs: #定义存储类型为nfs
path: /root/kubernetes/pv_pvc/volumes/v5 #nfs共享路径
server: 192.168.11.128 #nfs共享服务service
accessModes: #访问模式
- ReadWriteOnce #该卷可以通过单个节点以读写方式安装
capacity:
storage: 5Gi #存储
kubectl apply -f pv.yaml
3)、查看创建生的pv卷
kubectl get pv
四、创建PVC
1)编写pvc.yaml文件
apiVersion: v1
kind: PersistentVolumeClaim #定义类型为PVC
metadata:
name: pvcpod #定义pvc名字为pvcpod
spec:
accessModes: #访问模式
- ReadWriteOnce #该卷可以通过单个节点以读写方式安装
resources: #资源
requests: #定义资源请求
storage: 3Gi #请求的容量为3Gi
2)、生成pvc
kubectl apply -f pvc.yaml
3)、查看pvc
kubectl get pvc
五、测试:
1)、查看pv05卷的详细信息:
kubectl describe pv pv05
vim pod.yaml
apiVersion: extensions/v1beta1
kind: Deployment #控制器
metadata:
name: pvc-nginx #这个标签为启动pod时候的名字
spec:
replicas: 1 #启动副本数
selector: #设置标签
matchLabels:
app: pvc-nginx #这个标签相当于分组,查看(kubectl get pods --show-labels)
minReadySeconds: 5 #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
revisionHistoryLimit: 2 #要保留以允许回滚的旧复制集数
strategy: #策略
type: RollingUpdate #默认为滚动更新(可以不写)
rollingUpdate: #滚动更新
maxSurge: 1 #升级过程中最多可以比原先设置多出的POD数量
maxUnavailable: 1 #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
template: #模板(相当于定义好的一个python中的模块)
metadata:
labels: #标签
app: pvc-nginx #需要与上面定义selector标签一致,相当于划分在同一个组
spec:
containers: #模板(容器模板)
- name: pvc-nginx #node节点启动的容器名字(kind控制器名字+标签名),可以去node节点查看容器名
image: nginx #镜像名
imagePullPolicy: IfNotPresent #拉取镜像(选择方式——直接使用本地拥有的镜像)
ports:
- containerPort: 80 #容器开放的监听端口
volumeMounts: #挂载容器的目录
- name: nginxpvc #特别注意:容器挂载名字和本地挂载名字需要一致(下面名字)
mountPath: /usr/share/nginx/html/ #容器挂载的目录路径
restartPolicy: Always #重新启动pod中所有容器的策略
volumes: #挂载目录方式——本地/网络
- name: nginxpvc #特别注意:容器挂载名字和本地挂载名字需要一致(上面名字)
persistentVolumeClaim: #使用pvc进行挂载
claimName: pvcpod #生成PVC卷的名称
3)、启动pod 容器
kubectl apply -f pod.yaml
4)、查看生成的pod
kubectl get pod -o wide |egrep "^pvc-nginx"
5)、测试是否可以访问到nfs共享目录/root/kubernetes/pv_pvc/volumes/v5下的index.html文件
curl 10.244.1.193
六、将pod对外提供服务
1)编辑svc的yaml文件
vim svc.yaml
apiVersion: v1
kind: Service #控制器为service
metadata:
name: pvc-nginx #svc的名称
spec:
type: NodePort #通过请求从群集外部与服务联系
ports:
- port: 80 #pod内部提供服务端口
targetPort: 80 #相当于docke中宿主机与容器映射端口
nodePort: 30808 #对外提供的访问端口
selector: #选择器
app: pvc-nginx #生成pod的名称,前提得正常运行不然怎么提供服务呢?
2)、生成svc
kubectl apply -f svc.yaml
3)、查看svc
kubectl get svc |grep pvc-nginx