La relación y la práctica de la clase de almacenamiento de kubernetes y PV y PVC

Diagrama de relación StorageClass, PV y PVC

La relación y la práctica de la clase de almacenamiento de kubernetes y PV y PVC

  • Volumes es la abstracción de almacenamiento más básica, que admite varios tipos, incluido el almacenamiento local, NFS, FC y numerosos almacenamientos en la nube. También podemos escribir nuestros propios complementos de almacenamiento para admitir sistemas de almacenamiento específicos. El volumen se puede utilizar directamente por Pod o por PV. Existe una relación de enlace estática entre el volumen normal y el pod. Mientras se define el pod, el tipo de almacenamiento se define mediante el atributo de volumen y el punto de montaje en el contenedor se define mediante volumeMount.

  • PersistentVolume. A diferencia del volumen ordinario, PV es un objeto de recurso en Kubernetes. Crear un PV es equivalente a crear un objeto de recurso de almacenamiento. El uso de este recurso debe solicitarse a través de PVC.

  • PersistentVolumeClaim. PVC es la solicitud de un usuario de PV de recursos de almacenamiento. Kubernetes busca dinámicamente recursos PV en el sistema y los vincula de acuerdo con las condiciones especificadas en el PVC. Actualmente, PVC y PV se pueden combinar de tres formas: StorageClassName, matchLabels o matchExpressions.

  • StorageClass. Categoría de almacenamiento, actualmente kubernetes admite muchos almacenamientos, como ceph, nfs, glusterfs, etc. . .

A continuación, este artículo utiliza el clúster ceph creado en el artículo anterior "Enseñarle cómo implementar un clúster ceph usando rpm" para proporcionar almacenamiento para kubernetes.

Crear clase de almacenamiento

1. Obtén la clave de administrador

grep key /etc/ceph/ceph.client.admin.keyring |awk '{printf "%s", $NF }'|base64

QVFCZ2ZZOWJ1dGdBQ0JBQXN5dGdLZ1BFOGlsblIzWjJqNVVKMUE9PQ==

2. Escribe ceph-secret-admin.yaml

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret-admin
type: "kubernetes.io/rbd"
data:
  key: QVFCZ2ZZOWJ1dGdBQ0JBQXN5dGdLZ1BFOGlsblIzWjJqNVVKMUE9PQ==

3. Crea un secreto

kubectl  apply -f ceph-secret-admin.yaml
kubectl  get secret
NAME                                 TYPE                                  DATA      AGE
ceph-secret-admin                    kubernetes.io/rbd                     1         6m

4. Modifique rbd-storage-class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: rbd
provisioner: kubernetes.io/rbd
parameters:
    monitors: 192.168.100.100:6789,192.168.100.101:6789,192.168.100.102:6789
    adminId: admin
    adminSecretName: ceph-secret-admin
    adminSecretNamespace: default
    pool: k8s
    userId: admin
    userSecretName: ceph-secret-admin
    userSecretNamespace: default
    fsType: ext4
    imageFormat: "2"
    imageFeatures: "layering"

5. Crea una clase de almacenamiento

kubectl apply -f rbd-storage-class.yaml

[root@qd01-stop-cloud001 rbd]# kubectl  get sc
NAME      PROVISIONER         AGE
rbd         kubernetes.io/rbd   4m

Crear PVC y PV

6. Cree pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: claim
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: rbd
  resources:
    requests:
      storage: 1Gi

7. Verifique el pvc, el estado de la pantalla es Obligado para indicar el éxito

kubectl apply -f pvc.yaml
kubectl  get pvc
NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
claim    Bound     pvc-130c2445-b4a5-11e8-9d27-782bcb3bb379   1Gi        RWO            slow           13m

Verificación de prueba

8. Cree pod.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: server
spec:
  replicas: 1
  selector:
    role: server
  template:
    metadata:
      labels:
        role: server
    spec:
      containers:
      - name: server
        image: nginx
        volumeMounts:
          - mountPath: /var/lib/www/html
            name: mypvc
      volumes:
        - name: mypvc
          persistentVolumeClaim:
            claimName: claim

9. Ver almacenamiento montado

/dev/rbd0       1G  9.1M  0.98G   1% /var/lib/kubelet/plugins/kubernetes.io/rbd/mounts/k8s-image-kubernetes-dynamic-pvc-198f56b3-b4a5-11e8-97eb-782bcb3bb379

Manejo de errores

如果出错failed to create rbd image: executable file not found in $PATH
Consulte https://blog.csdn.net/aixiaoyang168/article/details/79120095
Puede usar los siguientes elementos para crear clases de almacenamiento

Utilice almacenamiento externo para crear una clase de almacenamiento

$ git clone https://github.com/kubernetes-incubator/external-storage.git
$ tree external-storage/ceph/rbd/deploy/
├── README.md
├── non-rbac
│   └── deployment.yaml
└── rbac
    ├── clusterrole.yaml
    ├── clusterrolebinding.yaml
    ├── deployment.yaml
    └── serviceaccount.yaml

Install without RBAC roles:
cd $GOPATH/src/github.com/kubernetes-incubator/external-storage/ceph/rbd/deploy
kubectl apply -f ./non-rbac

Install with RBAC roles:
cd $GOPATH/src/github.com/kubernetes-incubator/external-storage/ceph/rbd/deploy
NAMESPACE=default     # change this if you want to deploy it in another namespace
sed -r -i "s/namespace: [^ ]+/namespace: $NAMESPACE/g" ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml
kubectl -n $NAMESPACE apply -f ./rbac

Si el secreto y el aprovisionador no están en el mismo espacio de nombres, el permiso secreto no es suficiente.
Solución:
agregue permisos secretos a los siguientes archivos
external-storage/ceph/rbd/deploy/rbac/clusterrole.yaml

  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get", "create", "delete"]

Supongo que te gusta

Origin blog.51cto.com/1648324/2551888
Recomendado
Clasificación