El volumen se puede dividir en las siguientes tres categorías según el uso:
(1) Volumen, volúmenes de datos locales y de red
(2) Volumen persistente
(3) Volumen persistente, volumen de datos de suministro dinámico
Nota: El volumen en Kubernetes brinda la capacidad de montar almacenamiento externo en un contenedor.
Nota: Pod necesita establecer la fuente de volumen (spec.volumes) y el punto de montaje (spec.containers.volumeMounts) antes de usar el volumen correspondiente.
1 volumen de almacenamiento local y almacenamiento en red de k8s
Volumen de datos locales y volumen de datos de red en volumen:
(1) Volumen de datos locales: emptyDir, hostPath.
(2) Volumen de datos de la red: NFS.
1.1 emptyDir (directorio vacío)
Cree un volumen vacío y móntelo en el contenedor del Pod. También se eliminará la eliminación de pod del volumen. Escenario de aplicación: uso compartido de datos entre contenedores que se ejecutan en el mismo pod.
#docker pull busybox
#docker pull centos
#docker pull library / bash: El
archivo 4.4.23 empty.yaml
crea dos contenedores, uno para escribir y otro para leer, para probar si los datos son compartidos.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: write
image: library/bash:4.4.23
imagePullPolicy: IfNotPresent
command: ["sh","-c","while true; do echo 'hello' >> /data/hello.txt; sleep 2; done;"]
volumeMounts:
#将名为data的数据卷,挂载在容器的/data下面
- name: data
mountPath: /data
- name: read
image: centos
imagePullPolicy: IfNotPresent
command: ["bash","-c","tail -f /data/hello.txt"]
volumeMounts:
#将名为data的数据卷,挂载在容器的/data下面
- name: data
mountPath: /data
#定义一个数据卷来源
volumes:
#定义数据卷名字
- name: data
emptyDir: {
}
#kubectl apply -f empty.yaml
由于通过指定的镜像启动容器后,容器内部没有常驻进程,导致容器启动成功后即退出,从而进行了持续的重启。
command: ["sh","-c","while true; do echo 'hello' >> /data/hello.txt; sleep 2; done;"]
#kubectl logs my-pod -c read se
escribe cada dos segundos, por lo que los datos impresos se pueden ver de forma continua.
1.2 hostPath (montaje local)
Monte el archivo o directorio del sistema de archivos del nodo en el contenedor del Pod. Escenario de aplicación: el contenedor del Pod necesita acceder al archivo de host.
Archivo hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- sleep 36000
# 挂载点
volumeMounts:
#将名为data的数据卷,挂载在容器的/data下面
- name: data
mountPath: /data
volumes:
- name: data
#挂载来源,宿主机的/tmp目录
hostPath:
path: /tmp
type: Directory
#kubectl apply -f hostpath.yaml
Compruebe en qué nodo está programado el pod.
#kubectl get pods -n default -o wide
Vea los datos en / tmp en el host y muéstrelos correctamente en el directorio / data del pod.
1.3 NFS (Volumen de red de almacenamiento de intercambio de archivos)
192.168.0.165 mymaster
192.168.0.163 myworker
(1) Instalar nfs: (se requiere el servicio nfs y cada máquina debe estar instalada)
#yum install -y nfs-utils #安装nfs服务
#yum install -y rpcbind#安装rpc服务
#注意:先启动rpc服务,再启动nfs服务,每台机器都启动。
#systemctl start rpcbind #先启动rpc服务
#systemctl enable rpcbind #设置开机启动
#systemctl start nfs-server #启动nfs服务
#systemctl enable nfs-server #设置开机启动
(2) Configure mymaster como servidor, configure el directorio / some / path para compartirlo y tenga permisos de lectura y escritura
#cat /etc/exports
/some/path 192.168.0.0/24(rw,no_root_squash)
#docker pull nginx
En este momento, cuando estás en el lado del cliente, no necesitas usar deliberadamente mount para montar, porque k8s lo montará automáticamente por nosotros.
(3) Archivo nfs.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
#将名为wwwroot的数据卷,挂载在容器的nginx的html目录下
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
#定义数据卷名字为wwwroot,类型为nfs
volumes:
- name: wwwroot
nfs:
server: mymaster
path: /some/path
#kubectl apply -f nfs.yaml
#kubectl exec -it nginx-deployment-5f58c6b8f9-8x4tb-sh
Compruebe si hay contenido en el directorio
#cat /some/path/aa.html
my name is lucy
2 Instale pv y pvc almacenados localmente
镜像 rancher / local-path-provisioner: v0.0.11
#docker load -i local-path-provisioner.tar
文件 local-path-storage.yaml
apiVersion: v1
kind: Namespace
metadata:
name: local-path-storage
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: local-path-provisioner-service-account
namespace: local-path-storage
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: local-path-provisioner-role
rules:
- apiGroups: [""]
resources: ["nodes", "persistentvolumeclaims"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["endpoints", "persistentvolumes", "pods"]
verbs: ["*"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "patch"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: local-path-provisioner-bind
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: local-path-provisioner-role
subjects:
- kind: ServiceAccount
name: local-path-provisioner-service-account
namespace: local-path-storage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: local-path-provisioner
namespace: local-path-storage
spec:
replicas: 1
selector:
matchLabels:
app: local-path-provisioner
template:
metadata:
labels:
app: local-path-provisioner
spec:
serviceAccountName: local-path-provisioner-service-account
containers:
- name: local-path-provisioner
image: rancher/local-path-provisioner:v0.0.11
imagePullPolicy: IfNotPresent
command:
- local-path-provisioner
- --debug
- start
- --config
- /etc/config/config.json
volumeMounts:
- name: config-volume
mountPath: /etc/config/
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumes:
- name: config-volume
configMap:
name: local-path-config
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-path
annotations: #添加为默认StorageClass
storageclass.beta.kubernetes.io/is-default-class: "true"
provisioner: rancher.io/local-path
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
---
kind: ConfigMap
apiVersion: v1
metadata:
name: local-path-config
namespace: local-path-storage
data:
config.json: |-
{
"nodePathMap":[
{
"node":"DEFAULT_PATH_FOR_NON_LISTED_NODES",
"paths":["/opt/local-path-provisioner"]
}
]
}
#kubectl apply -f local-path-storage.yaml
Ver el almacenamiento predeterminado