Diagrama de relación StorageClass, 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 archivosexternal-storage/ceph/rbd/deploy/rbac/clusterrole.yaml
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "create", "delete"]