PersistentVolume
// PersistentVolume struct captures the details of the implementation of PV storage
type PersistentVolume struct {
metav1.TypeMeta
// +optional
metav1.ObjectMeta
//Spec defines a persistent volume owned by the cluster
// +optional
Spec PersistentVolumeSpec
// Status represents the current information about persistent volume.
// +optional
Status PersistentVolumeStatus
}
PersistentVolumeSpec
定义持久卷所需的大部分细节
// PersistentVolumeSpec has most of the details required to define a persistent volume
type PersistentVolumeSpec struct {
// Resources represents the actual resources of the volume
Capacity ResourceList
// Source represents the location and type of a volume to mount.
PersistentVolumeSource
// AccessModes contains all ways the volume can be mounted
//三种访问方式分别为ReadWriteOnce(RWO),ReadOnlyMany(ROX),ReadWriteMany(RWX)
// RWO, 那么只能被挂载在某一个Kubernetes的工作节点上,当再次尝试在其他节点挂载的时候,系统会报Multi-Attach的错误(可以同一个节点上多个Pod同时读写)
// ROX,name可以同时在多个节点上挂载且为只读
// RMX, 那么可以同时在多个节点上挂载并被不同的Pod读写。
// +optional
AccessModes []PersistentVolumeAccessMode
// ClaimRef is part of a bi-directional binding between PersistentVolume and PersistentVolumeClaim.
// ClaimRef is expected to be non-nil when bound.
// claim.VolumeName is the authoritative bind between PV and PVC.
// When set to non-nil value, PVC.Spec.Selector of the referenced PVC is
// ignored, i.e. labels of this PV do not need to match PVC selector.
// +optional
ClaimRef *ObjectReference
// Optional: what happens to a persistent volume when released from its claim.包含三种策略"Recycle","Delete","Retain"。默认策略为"Retain"
//"Recycle",当该存储卷从声明中被释放后将被回收至未绑定的存储卷池中,DEPRECATED: The PersistentVolumeReclaimRecycle called Recycle is being deprecated. See announcement here: https://groups.google.com/forum/#!topic/kubernetes-dev/uexugCza84I
// "Delete", 当该存储卷从声明中释放后将在kubernetes中删除
// "Retain",默认策略,意味着卷将停留在当前阶段(已释放),供管理员手动回收
// +optional
PersistentVolumeReclaimPolicy PersistentVolumeReclaimPolicy
// Name of StorageClass to which this persistent volume belongs. Empty value
// means that this volume does not belong to any StorageClass.
// +optional
StorageClassName string
// A list of mount options, e.g. ["ro", "soft"]. Not validated - mount will
// simply fail if one is invalid.
// +optional
MountOptions []string
// volumeMode defines if a volume is intended to be used with a formatted filesystem
// or to remain in raw block state. Value of Filesystem is implied when not included in spec. "Block"或"Filesystem"
// +optional
VolumeMode *PersistentVolumeMode
// NodeAffinity 定义约束通过NodeSelector限制可以从哪些节点访问此存储卷
// This field influences the scheduling of pods that use this volume.
// +optional
NodeAffinity *VolumeNodeAffinity
}
PersistentVolumeStatus
// PersistentVolumeStatus represents the status of PV storage
type PersistentVolumeStatus struct {
// Phase indicates if a volume is available, bound to a claim, or released by a claim。阶段包括"Pending","Available","Bound", "Released", "Failed"。
// Pending, 代表该存储卷暂不可用
// Available,代表存储卷暂未被绑定,可用的卷由绑定器所持有,并与PVC(PersistentVolumeClaim)相匹配
// Bound,代表存储卷已经被绑定
// Released,代表存储卷绑定的PVC(PersistentVolumeClaim)已被删除,一个已释放的存储卷在再次可用之前必须进行回收,这个阶段由PVC绑定器通知另一个进程回收资源
// Failed,代表存储卷从PVC中释放后未能被正确回收或删除
// +optional
Phase PersistentVolumePhase
// A human-readable message indicating details about why the volume is in this state.
// +optional
Message string
// Reason is a brief CamelCase string that describes any failure and is meant for machine parsing and tidy display in the CLI
// +optional
Reason string
}
PersistentVolumeSource
// PersistentVolumeSource is similar to VolumeSource but meant for the administrator who creates PVs.
// Exactly one of its members must be set.
type PersistentVolumeSource struct {
// GCEPersistentDisk represents a GCE Disk resource that is attached to a
// kubelet's host machine and then exposed to the pod.
// +optional
GCEPersistentDisk *GCEPersistentDiskVolumeSource
// AWSElasticBlockStore represents an AWS EBS disk that is attached to a
// kubelet's host machine and then exposed to the pod.
// +optional
AWSElasticBlockStore *AWSElasticBlockStoreVolumeSource
// HostPath represents a directory on the host.
// Provisioned by a developer or tester.
// This is useful for single-node development and testing only!
// On-host storage is not supported in any way and WILL NOT WORK in a multi-node cluster.
// +optional
HostPath *HostPathVolumeSource
// Glusterfs represents a Glusterfs volume that is attached to a host and exposed to the pod
// +optional
Glusterfs *GlusterfsPersistentVolumeSource
// NFS represents an NFS mount on the host that shares a pod's lifetime
// +optional
NFS *NFSVolumeSource
// RBD represents a Rados Block Device mount on the host that shares a pod's lifetime
// +optional
RBD *RBDPersistentVolumeSource
// Quobyte represents a Quobyte mount on the host that shares a pod's lifetime
// +optional
Quobyte *QuobyteVolumeSource
// ISCSIPersistentVolumeSource represents an ISCSI resource that is attached to a
// kubelet's host machine and then exposed to the pod.
// +optional
ISCSI *ISCSIPersistentVolumeSource
// FlexVolume represents a generic volume resource that is
// provisioned/attached using an exec based plugin.
// +optional
FlexVolume *FlexPersistentVolumeSource
// Cinder represents a cinder volume attached and mounted on kubelets host machine.
// +optional
Cinder *CinderPersistentVolumeSource
// CephFS represents a Ceph FS mount on the host that shares a pod's lifetime
// +optional
CephFS *CephFSPersistentVolumeSource
// FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod.
// +optional
FC *FCVolumeSource
// Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running
// +optional
Flocker *FlockerVolumeSource
// AzureFile represents an Azure File Service mount on the host and bind mount to the pod.
// +optional
AzureFile *AzureFilePersistentVolumeSource
// VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine
// +optional
VsphereVolume *VsphereVirtualDiskVolumeSource
// AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
// +optional
AzureDisk *AzureDiskVolumeSource
// PhotonPersistentDisk represents a Photon Controller persistent disk attached and mounted on kubelets host machine
PhotonPersistentDisk *PhotonPersistentDiskVolumeSource
// PortworxVolume represents a portworx volume attached and mounted on kubelets host machine
// +optional
PortworxVolume *PortworxVolumeSource
// ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.
// +optional
ScaleIO *ScaleIOPersistentVolumeSource
// Local represents directly-attached storage with node affinity
// +optional
Local *LocalVolumeSource
// StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod
// More info: https://examples.k8s.io/volumes/storageos/README.md
// +optional
StorageOS *StorageOSPersistentVolumeSource
// CSI (Container Storage Interface) represents storage that is handled by an external CSI driver.
// +optional
CSI *CSIPersistentVolumeSource
}