clase de almacenamiento
En el artículo anterior, aprendimos a usar PV y PVC, pero los PV anteriores son todos estáticos, ¿qué significa eso? Si quiero usar un PVC, debo crear manualmente un PV. También dijimos que este método no puede satisfacer nuestras necesidades en gran medida. Por ejemplo, tenemos una aplicación que requiere una concurrencia de almacenamiento relativamente alta. Otra aplicación tiene una concurrencia de almacenamiento relativamente alta. requisitos de velocidad de lectura y escritura, especialmente para aplicaciones de tipo StatefulSet, no es apropiado usar simplemente PV estático. En este caso, necesitamos usar PV dinámico, que es lo que queremos hoy. Aprenda StorageClass.
crear
Para usar StorageClass, tenemos que instalar el programa de configuración automática correspondiente. Por ejemplo, si usamos nfs como backend de almacenamiento aquí, entonces necesitamos usar un programa de configuración automática nfs-client, que también llamamos Provisioner. Este programa usa nuestro El servidor nfs ha sido configurado para crear automáticamente volúmenes persistentes, es decir, para crear automáticamente PV para nosotros.
- El PV creado automáticamente
${namespace}-${pvcName}-${pvName}
se crea en el directorio de datos compartidos en el servidor NFS con este formato de nomenclatura - Y cuando se recicle el PV, se
archieved-${namespace}-${pvcName}-${pvName}
almacenará en el servidor NFS en este formato de nomenclatura.
Por supuesto, antes de la implementación nfs-client
, primero debemos instalar correctamente el servidor nfs. Ya lo hemos aprobado en el artículo anterior. La dirección del servicio es 10.151.30.57 , y el directorio de datos compartidos es **/data/k8s/**, y luego implementamos nfs -client es suficiente, también podemos consultar directamente la documentación de nfs-client: https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client, simplemente instálelo .
Paso 1 : configure la implementación, reemplace los parámetros correspondientes dentro con nuestra propia configuración nfs (nfs-client.yaml)
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 10.151.30.57
- name: NFS_PATH
value: /data/k8s
volumes:
- name: nfs-client-root
nfs:
server: 10.151.30.57
path: /data/k8s
Paso 2 : Reemplace las variables de entorno NFS_SERVER y NFS_PATH y, por supuesto, también incluya la configuración de nfs a continuación. Podemos ver que aquí usamos un nfs-client-provisioner, por lo que también necesitamos crear un sa y luego vincularlo. Permisos serviceAccount
correspondientes : (nfs-cliente-sa.yaml)
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
Creamos uno nuevo llamado nfs-client-provisioner aquí ServiceAccount
, y luego vinculamos un nfs-client-provisioner-runner llamado ClusterRole
, que ClusterRole
declaró algunos permisos, incluidos agregar persistentvolumes
, eliminar, modificar, verificar, etc. Permisos, por lo que podemos usar esto ServiceAccount
para crear automáticamente PV.
Paso 3 : después de completar la declaración de implementación de nfs-client, podemos crear un StorageClass
objeto: (nfs-client-class.yaml)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: course-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
Declaramos un objeto denominado Course-nfs-storage , tenga en cuenta que el valor correspondiente StorageClass
a continuación debe ser el mismo que el valor de la variable de entorno PROVISIONER_NAME anterior.provisioner
Deployment
Ahora vamos a crear estos objetos de recursos:
$ kubectl create -f nfs-client.yaml
$ kubectl create -f nfs-client-sa.yaml
$ kubectl create -f nfs-client-class.yaml
Una vez completada la creación, verifique el estado del recurso:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
...
nfs-client-provisioner-7648b664bc-7f9pk 1/1 Running 0 7h
...
$ kubectl get storageclass
NAME PROVISIONER AGE
course-nfs-storage fuseim.pri/ifs 11s
nueva construcción
StorageClass
El objeto de recurso se creó con éxito arriba . A continuación, probemos el PV dinámico a través de un ejemplo. Primero, cree un objeto de PVC: (test-pvc.yaml)
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
Aquí declaramos un objeto PVC, adoptamos el modo de acceso de ReadWriteMany y solicitamos un espacio de 1Mi, pero podemos ver que no hemos identificado ninguna información asociada con StorageClass en el archivo PVC anterior, por lo que si creamos directamente este objeto PVC ahora , podemos enlazar automáticamente al objeto PV apropiado? Obviamente no (siempre que no haya un PV adecuado), aquí tenemos dos métodos para usar el objeto StorageClass que creamos anteriormente para crear automáticamente un PV adecuado para nosotros:
- El primer método: agregue un identificador para declarar el objeto StorageClass en este objeto de PVC, aquí podemos usar un atributo de anotaciones para identificarlo, de la siguiente manera:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
annotations:
volume.beta.kubernetes.io/storage-class: "course-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
- El segundo método: podemos configurar StorageClass de este curso-nfs-storage como el backend de almacenamiento predeterminado de Kubernetes, y podemos usar el comando kubectl patch para actualizar:
$ kubectl patch storageclass course-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
Los dos métodos anteriores son posibles. Por supuesto, para no afectar el comportamiento predeterminado del sistema, aún usamos el primer método aquí, simplemente créelo directamente:
$ kubectl create -f test-pvc.yaml
persistentvolumeclaim "test-pvc" created
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
...
test-pvc Bound pvc-73b5ffd2-8b4b-11e8-b585-525400db4df7 1Mi RWX course-nfs-storage 2m
...
Podemos ver que un objeto de PVC llamado test-pvc se ha creado con éxito, y el estado ya es Bound. ¿También se generó un objeto VOLUME correspondiente? La columna más importante es STORAGECLASS. ¿Tiene valor ahora? El objeto StorageClass que acabamos de crear es curso-nfs-almacenamiento.
Luego mira el objeto PV:
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
...
pvc-73b5ffd2-8b4b-11e8-b585-525400db4df7 1Mi RWX Delete Bound default/test-pvc course-nfs-storage 8m
...
Puede ver si un objeto PV asociado se genera automáticamente, el modo de acceso es RWX y la política de reciclaje es Eliminar. Este objeto PV no lo creamos manualmente, pero se crea automáticamente a través de nuestro objeto StorageClass anterior. Así es como se crea StorageClass.
prueba
A continuación, usemos un ejemplo simple para probar el objeto de PVC que declaramos anteriormente con StorageClass: (test-pod.yaml)
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: busybox
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1"
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-pvc
El Pod anterior es muy simple. Utiliza un contenedor busybox para crear un archivo SUCCESS en el directorio /mnt, y luego monta el directorio /mnt en el objeto de recurso test-pvc recién creado arriba. La verificación es muy simple, solo necesita para verificar si hay un archivo SUCCESS en el directorio de datos compartidos en nuestro servidor nfs:
$ kubectl create -f test-pod.yaml
pod "test-pod" created
Luego podemos ver los datos en el directorio de datos compartidos del servidor nfs:
$ ls /data/k8s/
default-test-pvc-pvc-73b5ffd2-8b4b-11e8-b585-525400db4df7
Podemos ver que hay una carpeta con un nombre largo debajo. ¿Es el método de nomenclatura de esta carpeta el mismo que nuestras reglas anteriores: ** espacio de nombres − {espacio de nombres}-nam es p a ce − {pvcName}-${pvName}** es el mismo, y luego verifique si hay otros archivos en esta carpeta:
$ ls /data/k8s/default-test-pvc-pvc-73b5ffd2-8b4b-11e8-b585-525400db4df7
SUCCESS
Vemos que hay un archivo SUCCESS a continuación, ¿prueba que nuestra verificación anterior fue exitosa?
Además, podemos ver que estamos creando manualmente un objeto PVC aquí. En el trabajo real, usar StorageClass es más un tipo de servicio StatefulSet. Para el tipo de servicio StatefulSet, también podemos usar directamente StorageClass a través de un atributo volumeClaimTemplates, de la siguiente manera : ( prueba-statefulset-nfs.yaml)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nfs-web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nfs-web
template:
metadata:
labels:
app: nfs-web
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
annotations:
volume.beta.kubernetes.io/storage-class: course-nfs-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
De hecho, en volumeClaimTemplates hay una plantilla de un objeto de PVC, que es similar a la plantilla de nuestro StatefulSet. En realidad, es una plantilla de un pod. No creamos objetos de PVC por separado, pero usamos esta plantilla para crear objetos dinámicamente. Sí , este método se usa mucho bajo el tipo de servicio StatefulSet.
Cree el objeto anterior directamente:
$ kubectl create -f test-statefulset-nfs.yaml
statefulset.apps "nfs-web" created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
...
nfs-web-0 1/1 Running 0 1m
nfs-web-1 1/1 Running 0 1m
nfs-web-2 1/1 Running 0 33s
...
Una vez completada la creación, puede ver que los tres pods anteriores se ejecutaron correctamente y luego verifique el objeto de PVC:
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
...
www-nfs-web-0 Bound pvc-cc36b3ce-8b50-11e8-b585-525400db4df7 1Gi RWO course-nfs-storage 2m
www-nfs-web-1 Bound pvc-d38285f9-8b50-11e8-b585-525400db4df7 1Gi RWO course-nfs-storage 2m
www-nfs-web-2 Bound pvc-e348250b-8b50-11e8-b585-525400db4df7 1Gi RWO course-nfs-storage 1m
...
Podemos ver si también se generan 3 objetos PVC. El nombre está compuesto por el nombre de la plantilla y el nombre del Pod. Estos 3 objetos PVC también están vinculados. Obviamente, también podemos verlo cuando verificamos el PV. Los 3 objetos PV correspondientes :
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
... 1d
pvc-cc36b3ce-8b50-11e8-b585-525400db4df7 1Gi RWO Delete Bound default/www-nfs-web-0 course-nfs-storage 4m
pvc-d38285f9-8b50-11e8-b585-525400db4df7 1Gi RWO Delete Bound default/www-nfs-web-1 course-nfs-storage 4m
pvc-e348250b-8b50-11e8-b585-525400db4df7 1Gi RWO Delete Bound default/www-nfs-web-2 course-nfs-storage 4m
...
Ver el directorio de datos compartidos en el servidor nfs:
$ ls /data/k8s/
...
default-www-nfs-web-0-pvc-cc36b3ce-8b50-11e8-b585-525400db4df7
default-www-nfs-web-1-pvc-d38285f9-8b50-11e8-b585-525400db4df7
default-www-nfs-web-2-pvc-e348250b-8b50-11e8-b585-525400db4df7
...
¿También tiene tres directorios de datos correspondientes? Así es como usamos StorageClass. StorageClass se usa principalmente para servicios de tipo StatefulSet. Continuaremos aprendiendo sobre esto en los siguientes artículos.