Browse Source
Add snapshot-controller for CSI drivers and snapshot CRDs, add a default volumesnapshotclass when running cinder CSI (#6537)
Add snapshot-controller for CSI drivers and snapshot CRDs, add a default volumesnapshotclass when running cinder CSI (#6537)
* add snapshot-controller and v1beta1 snapshot api * fix typo * udpate manifest to v1beta1 * update * update manifests * fix spelling * wait until crd is applied * fix missing info in kube module * revert snapshotclass * add snapshot crds before applying the csi driver * add crds, missed them in last commit * use pull policy from kubespraypull/6623/head
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 778 additions and 5 deletions
Unified View
Diff Options
-
13library/kube.py
-
15roles/download/defaults/main.yml
-
7roles/kubernetes-apps/csi_driver/cinder/templates/cinder-csi-controllerplugin-rbac.yml.j2
-
10roles/kubernetes-apps/csi_driver/cinder/templates/cinder-csi-nodeplugin-rbac.yml.j2
-
27roles/kubernetes-apps/csi_driver/csi_crd/tasks/main.yml
-
84roles/kubernetes-apps/csi_driver/csi_crd/templates/volumesnapshotclasses.yml.j2
-
232roles/kubernetes-apps/csi_driver/csi_crd/templates/volumesnapshotcontents.yml.j2
-
187roles/kubernetes-apps/csi_driver/csi_crd/templates/volumesnapshots.yml.j2
-
15roles/kubernetes-apps/meta/main.yml
-
5roles/kubernetes-apps/snapshots/cinder-csi/defaults/main.yml
-
17roles/kubernetes-apps/snapshots/cinder-csi/tasks/main.yml
-
13roles/kubernetes-apps/snapshots/cinder-csi/templates/cinder-csi-snapshot-class.yml.j2
-
14roles/kubernetes-apps/snapshots/meta/main.yml
-
2roles/kubernetes-apps/snapshots/snapshot-controller/defaults/main.yml
-
25roles/kubernetes-apps/snapshots/snapshot-controller/tasks/main.yml
-
85roles/kubernetes-apps/snapshots/snapshot-controller/templates/rbac-snapshot-controller.yml.j2
-
32roles/kubernetes-apps/snapshots/snapshot-controller/templates/snapshot-controller.yml.j2
@ -0,0 +1,27 @@ |
|||||
|
--- |
||||
|
- name: CSI CRD | Generate Manifests |
||||
|
template: |
||||
|
src: "{{ item.file }}.j2" |
||||
|
dest: "{{ kube_config_dir }}/{{ item.file }}" |
||||
|
with_items: |
||||
|
- {name: volumesnapshotclasses, file: volumesnapshotclasses.yml} |
||||
|
- {name: volumesnapshotcontents, file: volumesnapshotcontents.yml} |
||||
|
- {name: volumesnapshots, file: volumesnapshots.yml} |
||||
|
register: csi_crd_manifests |
||||
|
when: inventory_hostname == groups['kube-master'][0] |
||||
|
tags: csi-driver |
||||
|
|
||||
|
- name: CSI CRD | Apply Manifests |
||||
|
kube: |
||||
|
kubectl: "{{ bin_dir }}/kubectl" |
||||
|
filename: "{{ kube_config_dir }}/{{ item.item.file }}" |
||||
|
state: "latest" |
||||
|
wait: true |
||||
|
with_items: |
||||
|
- "{{ csi_crd_manifests.results }}" |
||||
|
when: |
||||
|
- inventory_hostname == groups['kube-master'][0] |
||||
|
- not item is skipped |
||||
|
loop_control: |
||||
|
label: "{{ item.item.file }}" |
||||
|
tags: csi-driver |
@ -0,0 +1,84 @@ |
|||||
|
--- |
||||
|
apiVersion: apiextensions.k8s.io/v1beta1 |
||||
|
kind: CustomResourceDefinition |
||||
|
metadata: |
||||
|
annotations: |
||||
|
controller-gen.kubebuilder.io/version: v0.2.5 |
||||
|
api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/260" |
||||
|
creationTimestamp: null |
||||
|
name: volumesnapshotclasses.snapshot.storage.k8s.io |
||||
|
spec: |
||||
|
additionalPrinterColumns: |
||||
|
- JSONPath: .driver |
||||
|
name: Driver |
||||
|
type: string |
||||
|
- JSONPath: .deletionPolicy |
||||
|
description: Determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass |
||||
|
should be deleted when its bound VolumeSnapshot is deleted. |
||||
|
name: DeletionPolicy |
||||
|
type: string |
||||
|
- JSONPath: .metadata.creationTimestamp |
||||
|
name: Age |
||||
|
type: date |
||||
|
group: snapshot.storage.k8s.io |
||||
|
names: |
||||
|
kind: VolumeSnapshotClass |
||||
|
listKind: VolumeSnapshotClassList |
||||
|
plural: volumesnapshotclasses |
||||
|
singular: volumesnapshotclass |
||||
|
preserveUnknownFields: false |
||||
|
scope: Cluster |
||||
|
subresources: {} |
||||
|
validation: |
||||
|
openAPIV3Schema: |
||||
|
description: VolumeSnapshotClass specifies parameters that a underlying storage |
||||
|
system uses when creating a volume snapshot. A specific VolumeSnapshotClass |
||||
|
is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses |
||||
|
are non-namespaced |
||||
|
properties: |
||||
|
apiVersion: |
||||
|
description: 'APIVersion defines the versioned schema of this representation |
||||
|
of an object. Servers should convert recognized schemas to the latest |
||||
|
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' |
||||
|
type: string |
||||
|
deletionPolicy: |
||||
|
description: deletionPolicy determines whether a VolumeSnapshotContent created |
||||
|
through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot |
||||
|
is deleted. Supported values are "Retain" and "Delete". "Retain" means |
||||
|
that the VolumeSnapshotContent and its physical snapshot on underlying |
||||
|
storage system are kept. "Delete" means that the VolumeSnapshotContent |
||||
|
and its physical snapshot on underlying storage system are deleted. Required. |
||||
|
enum: |
||||
|
- Delete |
||||
|
- Retain |
||||
|
type: string |
||||
|
driver: |
||||
|
description: driver is the name of the storage driver that handles this |
||||
|
VolumeSnapshotClass. Required. |
||||
|
type: string |
||||
|
kind: |
||||
|
description: 'Kind is a string value representing the REST resource this |
||||
|
object represents. Servers may infer this from the endpoint the client |
||||
|
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' |
||||
|
type: string |
||||
|
parameters: |
||||
|
additionalProperties: |
||||
|
type: string |
||||
|
description: parameters is a key-value map with storage driver specific |
||||
|
parameters for creating snapshots. These values are opaque to Kubernetes. |
||||
|
type: object |
||||
|
required: |
||||
|
- deletionPolicy |
||||
|
- driver |
||||
|
type: object |
||||
|
version: v1beta1 |
||||
|
versions: |
||||
|
- name: v1beta1 |
||||
|
served: true |
||||
|
storage: true |
||||
|
status: |
||||
|
acceptedNames: |
||||
|
kind: "" |
||||
|
plural: "" |
||||
|
conditions: [] |
||||
|
storedVersions: [] |
@ -0,0 +1,232 @@ |
|||||
|
--- |
||||
|
apiVersion: apiextensions.k8s.io/v1beta1 |
||||
|
kind: CustomResourceDefinition |
||||
|
metadata: |
||||
|
annotations: |
||||
|
controller-gen.kubebuilder.io/version: v0.2.5 |
||||
|
api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/260" |
||||
|
creationTimestamp: null |
||||
|
name: volumesnapshotcontents.snapshot.storage.k8s.io |
||||
|
spec: |
||||
|
additionalPrinterColumns: |
||||
|
- JSONPath: .status.readyToUse |
||||
|
description: Indicates if a snapshot is ready to be used to restore a volume. |
||||
|
name: ReadyToUse |
||||
|
type: boolean |
||||
|
- JSONPath: .status.restoreSize |
||||
|
description: Represents the complete size of the snapshot in bytes |
||||
|
name: RestoreSize |
||||
|
type: integer |
||||
|
- JSONPath: .spec.deletionPolicy |
||||
|
description: Determines whether this VolumeSnapshotContent and its physical snapshot |
||||
|
on the underlying storage system should be deleted when its bound VolumeSnapshot |
||||
|
is deleted. |
||||
|
name: DeletionPolicy |
||||
|
type: string |
||||
|
- JSONPath: .spec.driver |
||||
|
description: Name of the CSI driver used to create the physical snapshot on the |
||||
|
underlying storage system. |
||||
|
name: Driver |
||||
|
type: string |
||||
|
- JSONPath: .spec.volumeSnapshotClassName |
||||
|
description: Name of the VolumeSnapshotClass to which this snapshot belongs. |
||||
|
name: VolumeSnapshotClass |
||||
|
type: string |
||||
|
- JSONPath: .spec.volumeSnapshotRef.name |
||||
|
description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent |
||||
|
object is bound. |
||||
|
name: VolumeSnapshot |
||||
|
type: string |
||||
|
- JSONPath: .metadata.creationTimestamp |
||||
|
name: Age |
||||
|
type: date |
||||
|
group: snapshot.storage.k8s.io |
||||
|
names: |
||||
|
kind: VolumeSnapshotContent |
||||
|
listKind: VolumeSnapshotContentList |
||||
|
plural: volumesnapshotcontents |
||||
|
singular: volumesnapshotcontent |
||||
|
preserveUnknownFields: false |
||||
|
scope: Cluster |
||||
|
subresources: |
||||
|
status: {} |
||||
|
validation: |
||||
|
openAPIV3Schema: |
||||
|
description: VolumeSnapshotContent represents the actual "on-disk" snapshot |
||||
|
object in the underlying storage system |
||||
|
properties: |
||||
|
apiVersion: |
||||
|
description: 'APIVersion defines the versioned schema of this representation |
||||
|
of an object. Servers should convert recognized schemas to the latest |
||||
|
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' |
||||
|
type: string |
||||
|
kind: |
||||
|
description: 'Kind is a string value representing the REST resource this |
||||
|
object represents. Servers may infer this from the endpoint the client |
||||
|
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' |
||||
|
type: string |
||||
|
spec: |
||||
|
description: spec defines properties of a VolumeSnapshotContent created |
||||
|
by the underlying storage system. Required. |
||||
|
properties: |
||||
|
deletionPolicy: |
||||
|
description: deletionPolicy determines whether this VolumeSnapshotContent |
||||
|
and its physical snapshot on the underlying storage system should |
||||
|
be deleted when its bound VolumeSnapshot is deleted. Supported values |
||||
|
are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent |
||||
|
and its physical snapshot on underlying storage system are kept. "Delete" |
||||
|
means that the VolumeSnapshotContent and its physical snapshot on |
||||
|
underlying storage system are deleted. In dynamic snapshot creation |
||||
|
case, this field will be filled in with the "DeletionPolicy" field |
||||
|
defined in the VolumeSnapshotClass the VolumeSnapshot refers to. For |
||||
|
pre-existing snapshots, users MUST specify this field when creating |
||||
|
the VolumeSnapshotContent object. Required. |
||||
|
enum: |
||||
|
- Delete |
||||
|
- Retain |
||||
|
type: string |
||||
|
driver: |
||||
|
description: driver is the name of the CSI driver used to create the |
||||
|
physical snapshot on the underlying storage system. This MUST be the |
||||
|
same as the name returned by the CSI GetPluginName() call for that |
||||
|
driver. Required. |
||||
|
type: string |
||||
|
source: |
||||
|
description: source specifies from where a snapshot will be created. |
||||
|
This field is immutable after creation. Required. |
||||
|
properties: |
||||
|
snapshotHandle: |
||||
|
description: snapshotHandle specifies the CSI "snapshot_id" of a |
||||
|
pre-existing snapshot on the underlying storage system. This field |
||||
|
is immutable. |
||||
|
type: string |
||||
|
volumeHandle: |
||||
|
description: volumeHandle specifies the CSI "volume_id" of the volume |
||||
|
from which a snapshot should be dynamically taken from. This field |
||||
|
is immutable. |
||||
|
type: string |
||||
|
type: object |
||||
|
volumeSnapshotClassName: |
||||
|
description: name of the VolumeSnapshotClass to which this snapshot |
||||
|
belongs. |
||||
|
type: string |
||||
|
volumeSnapshotRef: |
||||
|
description: volumeSnapshotRef specifies the VolumeSnapshot object to |
||||
|
which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName |
||||
|
field must reference to this VolumeSnapshotContent's name for the |
||||
|
bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent |
||||
|
object, name and namespace of the VolumeSnapshot object MUST be provided |
||||
|
for binding to happen. This field is immutable after creation. Required. |
||||
|
properties: |
||||
|
apiVersion: |
||||
|
description: API version of the referent. |
||||
|
type: string |
||||
|
fieldPath: |
||||
|
description: 'If referring to a piece of an object instead of an |
||||
|
entire object, this string should contain a valid JSON/Go field |
||||
|
access statement, such as desiredState.manifest.containers[2]. |
||||
|
For example, if the object reference is to a container within |
||||
|
a pod, this would take on a value like: "spec.containers{name}" |
||||
|
(where "name" refers to the name of the container that triggered |
||||
|
the event) or if no container name is specified "spec.containers[2]" |
||||
|
(container with index 2 in this pod). This syntax is chosen only |
||||
|
to have some well-defined way of referencing a part of an object. |
||||
|
TODO: this design is not final and this field is subject to change |
||||
|
in the future.' |
||||
|
type: string |
||||
|
kind: |
||||
|
description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' |
||||
|
type: string |
||||
|
name: |
||||
|
description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' |
||||
|
type: string |
||||
|
namespace: |
||||
|
description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' |
||||
|
type: string |
||||
|
resourceVersion: |
||||
|
description: 'Specific resourceVersion to which this reference is |
||||
|
made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' |
||||
|
type: string |
||||
|
uid: |
||||
|
description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' |
||||
|
type: string |
||||
|
type: object |
||||
|
required: |
||||
|
- deletionPolicy |
||||
|
- driver |
||||
|
- source |
||||
|
- volumeSnapshotRef |
||||
|
type: object |
||||
|
status: |
||||
|
description: status represents the current information of a snapshot. |
||||
|
properties: |
||||
|
creationTime: |
||||
|
description: creationTime is the timestamp when the point-in-time snapshot |
||||
|
is taken by the underlying storage system. In dynamic snapshot creation |
||||
|
case, this field will be filled in with the "creation_time" value |
||||
|
returned from CSI "CreateSnapshotRequest" gRPC call. For a pre-existing |
||||
|
snapshot, this field will be filled with the "creation_time" value |
||||
|
returned from the CSI "ListSnapshots" gRPC call if the driver supports |
||||
|
it. If not specified, it indicates the creation time is unknown. The |
||||
|
format of this field is a Unix nanoseconds time encoded as an int64. |
||||
|
On Unix, the command `date +%s%N` returns the current time in nanoseconds |
||||
|
since 1970-01-01 00:00:00 UTC. |
||||
|
format: int64 |
||||
|
type: integer |
||||
|
error: |
||||
|
description: error is the latest observed error during snapshot creation, |
||||
|
if any. |
||||
|
properties: |
||||
|
message: |
||||
|
description: 'message is a string detailing the encountered error |
||||
|
during snapshot creation if specified. NOTE: message may be logged, |
||||
|
and it should not contain sensitive information.' |
||||
|
type: string |
||||
|
time: |
||||
|
description: time is the timestamp when the error was encountered. |
||||
|
format: date-time |
||||
|
type: string |
||||
|
type: object |
||||
|
readyToUse: |
||||
|
description: readyToUse indicates if a snapshot is ready to be used |
||||
|
to restore a volume. In dynamic snapshot creation case, this field |
||||
|
will be filled in with the "ready_to_use" value returned from CSI |
||||
|
"CreateSnapshotRequest" gRPC call. For a pre-existing snapshot, this |
||||
|
field will be filled with the "ready_to_use" value returned from the |
||||
|
CSI "ListSnapshots" gRPC call if the driver supports it, otherwise, |
||||
|
this field will be set to "True". If not specified, it means the readiness |
||||
|
of a snapshot is unknown. |
||||
|
type: boolean |
||||
|
restoreSize: |
||||
|
description: restoreSize represents the complete size of the snapshot |
||||
|
in bytes. In dynamic snapshot creation case, this field will be filled |
||||
|
in with the "size_bytes" value returned from CSI "CreateSnapshotRequest" |
||||
|
gRPC call. For a pre-existing snapshot, this field will be filled |
||||
|
with the "size_bytes" value returned from the CSI "ListSnapshots" |
||||
|
gRPC call if the driver supports it. When restoring a volume from |
||||
|
this snapshot, the size of the volume MUST NOT be smaller than the |
||||
|
restoreSize if it is specified, otherwise the restoration will fail. |
||||
|
If not specified, it indicates that the size is unknown. |
||||
|
format: int64 |
||||
|
minimum: 0 |
||||
|
type: integer |
||||
|
snapshotHandle: |
||||
|
description: snapshotHandle is the CSI "snapshot_id" of a snapshot on |
||||
|
the underlying storage system. If not specified, it indicates that |
||||
|
dynamic snapshot creation has either failed or it is still in progress. |
||||
|
type: string |
||||
|
type: object |
||||
|
required: |
||||
|
- spec |
||||
|
type: object |
||||
|
version: v1beta1 |
||||
|
versions: |
||||
|
- name: v1beta1 |
||||
|
served: true |
||||
|
storage: true |
||||
|
status: |
||||
|
acceptedNames: |
||||
|
kind: "" |
||||
|
plural: "" |
||||
|
conditions: [] |
||||
|
storedVersions: [] |
@ -0,0 +1,187 @@ |
|||||
|
--- |
||||
|
apiVersion: apiextensions.k8s.io/v1beta1 |
||||
|
kind: CustomResourceDefinition |
||||
|
metadata: |
||||
|
annotations: |
||||
|
controller-gen.kubebuilder.io/version: v0.2.5 |
||||
|
api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/260" |
||||
|
creationTimestamp: null |
||||
|
name: volumesnapshots.snapshot.storage.k8s.io |
||||
|
spec: |
||||
|
additionalPrinterColumns: |
||||
|
- JSONPath: .status.readyToUse |
||||
|
description: Indicates if a snapshot is ready to be used to restore a volume. |
||||
|
name: ReadyToUse |
||||
|
type: boolean |
||||
|
- JSONPath: .spec.source.persistentVolumeClaimName |
||||
|
description: Name of the source PVC from where a dynamically taken snapshot will |
||||
|
be created. |
||||
|
name: SourcePVC |
||||
|
type: string |
||||
|
- JSONPath: .spec.source.volumeSnapshotContentName |
||||
|
description: Name of the VolumeSnapshotContent which represents a pre-provisioned |
||||
|
snapshot. |
||||
|
name: SourceSnapshotContent |
||||
|
type: string |
||||
|
- JSONPath: .status.restoreSize |
||||
|
description: Represents the complete size of the snapshot. |
||||
|
name: RestoreSize |
||||
|
type: string |
||||
|
- JSONPath: .spec.volumeSnapshotClassName |
||||
|
description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. |
||||
|
name: SnapshotClass |
||||
|
type: string |
||||
|
- JSONPath: .status.boundVolumeSnapshotContentName |
||||
|
description: The name of the VolumeSnapshotContent to which this VolumeSnapshot |
||||
|
is bound. |
||||
|
name: SnapshotContent |
||||
|
type: string |
||||
|
- JSONPath: .status.creationTime |
||||
|
description: Timestamp when the point-in-time snapshot is taken by the underlying |
||||
|
storage system. |
||||
|
name: CreationTime |
||||
|
type: date |
||||
|
- JSONPath: .metadata.creationTimestamp |
||||
|
name: Age |
||||
|
type: date |
||||
|
group: snapshot.storage.k8s.io |
||||
|
names: |
||||
|
kind: VolumeSnapshot |
||||
|
listKind: VolumeSnapshotList |
||||
|
plural: volumesnapshots |
||||
|
singular: volumesnapshot |
||||
|
preserveUnknownFields: false |
||||
|
scope: Namespaced |
||||
|
subresources: |
||||
|
status: {} |
||||
|
validation: |
||||
|
openAPIV3Schema: |
||||
|
description: VolumeSnapshot is a user's request for either creating a point-in-time |
||||
|
snapshot of a persistent volume, or binding to a pre-existing snapshot. |
||||
|
properties: |
||||
|
apiVersion: |
||||
|
description: 'APIVersion defines the versioned schema of this representation |
||||
|
of an object. Servers should convert recognized schemas to the latest |
||||
|
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' |
||||
|
type: string |
||||
|
kind: |
||||
|
description: 'Kind is a string value representing the REST resource this |
||||
|
object represents. Servers may infer this from the endpoint the client |
||||
|
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' |
||||
|
type: string |
||||
|
spec: |
||||
|
description: 'spec defines the desired characteristics of a snapshot requested |
||||
|
by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots |
||||
|
Required.' |
||||
|
properties: |
||||
|
source: |
||||
|
description: source specifies where a snapshot will be created from. |
||||
|
This field is immutable after creation. Required. |
||||
|
properties: |
||||
|
persistentVolumeClaimName: |
||||
|
description: persistentVolumeClaimName specifies the name of the |
||||
|
PersistentVolumeClaim object in the same namespace as the VolumeSnapshot |
||||
|
object where the snapshot should be dynamically taken from. This |
||||
|
field is immutable. |
||||
|
type: string |
||||
|
volumeSnapshotContentName: |
||||
|
description: volumeSnapshotContentName specifies the name of a pre-existing |
||||
|
VolumeSnapshotContent object. This field is immutable. |
||||
|
type: string |
||||
|
type: object |
||||
|
volumeSnapshotClassName: |
||||
|
description: 'volumeSnapshotClassName is the name of the VolumeSnapshotClass |
||||
|
requested by the VolumeSnapshot. If not specified, the default snapshot |
||||
|
class will be used if one exists. If not specified, and there is no |
||||
|
default snapshot class, dynamic snapshot creation will fail. Empty |
||||
|
string is not allowed for this field. TODO(xiangqian): a webhook validation |
||||
|
on empty string. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes' |
||||
|
type: string |
||||
|
required: |
||||
|
- source |
||||
|
type: object |
||||
|
status: |
||||
|
description: 'status represents the current information of a snapshot. NOTE: |
||||
|
status can be modified by sources other than system controllers, and must |
||||
|
not be depended upon for accuracy. Controllers should only use information |
||||
|
from the VolumeSnapshotContent object after verifying that the binding |
||||
|
is accurate and complete.' |
||||
|
properties: |
||||
|
boundVolumeSnapshotContentName: |
||||
|
description: 'boundVolumeSnapshotContentName represents the name of |
||||
|
the VolumeSnapshotContent object to which the VolumeSnapshot object |
||||
|
is bound. If not specified, it indicates that the VolumeSnapshot object |
||||
|
has not been successfully bound to a VolumeSnapshotContent object |
||||
|
yet. NOTE: Specified boundVolumeSnapshotContentName alone does not |
||||
|
mean binding is valid. Controllers MUST always verify bidirectional |
||||
|
binding between VolumeSnapshot and VolumeSnapshotContent to |
||||
|
avoid possible security issues.' |
||||
|
type: string |
||||
|
creationTime: |
||||
|
description: creationTime is the timestamp when the point-in-time snapshot |
||||
|
is taken by the underlying storage system. In dynamic snapshot creation |
||||
|
case, this field will be filled in with the "creation_time" value |
||||
|
returned from CSI "CreateSnapshotRequest" gRPC call. For a pre-existing |
||||
|
snapshot, this field will be filled with the "creation_time" value |
||||
|
returned from the CSI "ListSnapshots" gRPC call if the driver supports |
||||
|
it. If not specified, it indicates that the creation time of the snapshot |
||||
|
is unknown. |
||||
|
format: date-time |
||||
|
type: string |
||||
|
error: |
||||
|
description: error is the last observed error during snapshot creation, |
||||
|
if any. This field could be helpful to upper level controllers(i.e., |
||||
|
application controller) to decide whether they should continue on |
||||
|
waiting for the snapshot to be created based on the type of error |
||||
|
reported. |
||||
|
properties: |
||||
|
message: |
||||
|
description: 'message is a string detailing the encountered error |
||||
|
during snapshot creation if specified. NOTE: message may be logged, |
||||
|
and it should not contain sensitive information.' |
||||
|
type: string |
||||
|
time: |
||||
|
description: time is the timestamp when the error was encountered. |
||||
|
format: date-time |
||||
|
type: string |
||||
|
type: object |
||||
|
readyToUse: |
||||
|
description: readyToUse indicates if a snapshot is ready to be used |
||||
|
to restore a volume. In dynamic snapshot creation case, this field |
||||
|
will be filled in with the "ready_to_use" value returned from CSI |
||||
|
"CreateSnapshotRequest" gRPC call. For a pre-existing snapshot, this |
||||
|
field will be filled with the "ready_to_use" value returned from the |
||||
|
CSI "ListSnapshots" gRPC call if the driver supports it, otherwise, |
||||
|
this field will be set to "True". If not specified, it means the readiness |
||||
|
of a snapshot is unknown. |
||||
|
type: boolean |
||||
|
restoreSize: |
||||
|
anyOf: |
||||
|
- type: integer |
||||
|
- type: string |
||||
|
description: restoreSize represents the complete size of the snapshot |
||||
|
in bytes. In dynamic snapshot creation case, this field will be filled |
||||
|
in with the "size_bytes" value returned from CSI "CreateSnapshotRequest" |
||||
|
gRPC call. For a pre-existing snapshot, this field will be filled |
||||
|
with the "size_bytes" value returned from the CSI "ListSnapshots" |
||||
|
gRPC call if the driver supports it. When restoring a volume from |
||||
|
this snapshot, the size of the volume MUST NOT be smaller than the |
||||
|
restoreSize if it is specified, otherwise the restoration will fail. |
||||
|
If not specified, it indicates that the size is unknown. |
||||
|
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ |
||||
|
x-kubernetes-int-or-string: true |
||||
|
type: object |
||||
|
required: |
||||
|
- spec |
||||
|
type: object |
||||
|
version: v1beta1 |
||||
|
versions: |
||||
|
- name: v1beta1 |
||||
|
served: true |
||||
|
storage: true |
||||
|
status: |
||||
|
acceptedNames: |
||||
|
kind: "" |
||||
|
plural: "" |
||||
|
conditions: [] |
||||
|
storedVersions: [] |
@ -0,0 +1,5 @@ |
|||||
|
--- |
||||
|
snapshot_classes: |
||||
|
- name: cinder-csi-snapshot |
||||
|
is_default: false |
||||
|
force_create: true |
@ -0,0 +1,17 @@ |
|||||
|
--- |
||||
|
- name: Kubernetes Snapshots | Copy Cinder CSI Snapshot Class template |
||||
|
template: |
||||
|
src: "cinder-csi-snapshot-class.yml.j2" |
||||
|
dest: "{{ kube_config_dir }}/cinder-csi-snapshot-class.yml" |
||||
|
register: manifests |
||||
|
when: |
||||
|
- inventory_hostname == groups['kube-master'][0] |
||||
|
|
||||
|
- name: Kubernetes Snapshots | Add Cinder CSI Snapshot Class |
||||
|
kube: |
||||
|
kubectl: "{{ bin_dir }}/kubectl" |
||||
|
filename: "{{ kube_config_dir }}/cinder-csi-snapshot-class.yml" |
||||
|
state: "latest" |
||||
|
when: |
||||
|
- inventory_hostname == groups['kube-master'][0] |
||||
|
- manifests.changed |
@ -0,0 +1,13 @@ |
|||||
|
{% for class in snapshot_classes %} |
||||
|
--- |
||||
|
kind: VolumeSnapshotClass |
||||
|
apiVersion: snapshot.storage.k8s.io/v1beta1 |
||||
|
metadata: |
||||
|
name: "{{ class.name }}" |
||||
|
annotations: |
||||
|
storageclass.kubernetes.io/is-default-class: "{{ class.is_default | default(false) | ternary("true","false") }}" |
||||
|
driver: cinder.csi.openstack.org |
||||
|
deletionPolicy: Delete |
||||
|
parameters: |
||||
|
force-create: "{{ class.force_create }}" |
||||
|
{% endfor %} |
@ -0,0 +1,14 @@ |
|||||
|
--- |
||||
|
dependencies: |
||||
|
- role: kubernetes-apps/snapshots/snapshot-controller |
||||
|
when: |
||||
|
- cinder_csi_enabled |
||||
|
tags: |
||||
|
- snapshot-controller |
||||
|
|
||||
|
- role: kubernetes-apps/snapshots/cinder-csi |
||||
|
when: |
||||
|
- cinder_csi_enabled |
||||
|
tags: |
||||
|
- snapshot |
||||
|
- cinder-csi-driver |
@ -0,0 +1,2 @@ |
|||||
|
--- |
||||
|
snapshot_controller_replicas: 1 |
@ -0,0 +1,25 @@ |
|||||
|
--- |
||||
|
- name: Snapshot Controller | Generate Manifests |
||||
|
template: |
||||
|
src: "{{ item.file }}.j2" |
||||
|
dest: "{{ kube_config_dir }}/{{ item.file }}" |
||||
|
with_items: |
||||
|
- {name: rbac-snapshot-controller, file: rbac-snapshot-controller.yml} |
||||
|
- {name: snapshot-controller, file: snapshot-controller.yml} |
||||
|
register: snapshot_controller_manifests |
||||
|
when: inventory_hostname == groups['kube-master'][0] |
||||
|
tags: snapshot-controller |
||||
|
|
||||
|
- name: Snapshot Controller | Apply Manifests |
||||
|
kube: |
||||
|
kubectl: "{{ bin_dir }}/kubectl" |
||||
|
filename: "{{ kube_config_dir }}/{{ item.item.file }}" |
||||
|
state: "latest" |
||||
|
with_items: |
||||
|
- "{{ snapshot_controller_manifests.results }}" |
||||
|
when: |
||||
|
- inventory_hostname == groups['kube-master'][0] |
||||
|
- not item is skipped |
||||
|
loop_control: |
||||
|
label: "{{ item.item.file }}" |
||||
|
tags: snapshot-controller |
@ -0,0 +1,85 @@ |
|||||
|
# RBAC file for the snapshot controller. |
||||
|
# |
||||
|
# The snapshot controller implements the control loop for CSI snapshot functionality. |
||||
|
# It should be installed as part of the base Kubernetes distribution in an appropriate |
||||
|
# namespace for components implementing base system functionality. For installing with |
||||
|
# Vanilla Kubernetes, kube-system makes sense for the namespace. |
||||
|
|
||||
|
apiVersion: v1 |
||||
|
kind: ServiceAccount |
||||
|
metadata: |
||||
|
name: snapshot-controller |
||||
|
namespace: kube-system |
||||
|
|
||||
|
--- |
||||
|
kind: ClusterRole |
||||
|
apiVersion: rbac.authorization.k8s.io/v1 |
||||
|
metadata: |
||||
|
# rename if there are conflicts |
||||
|
name: snapshot-controller-runner |
||||
|
rules: |
||||
|
- apiGroups: [""] |
||||
|
resources: ["persistentvolumes"] |
||||
|
verbs: ["get", "list", "watch"] |
||||
|
- 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: ["snapshot.storage.k8s.io"] |
||||
|
resources: ["volumesnapshotclasses"] |
||||
|
verbs: ["get", "list", "watch"] |
||||
|
- apiGroups: ["snapshot.storage.k8s.io"] |
||||
|
resources: ["volumesnapshotcontents"] |
||||
|
verbs: ["create", "get", "list", "watch", "update", "delete"] |
||||
|
- apiGroups: ["snapshot.storage.k8s.io"] |
||||
|
resources: ["volumesnapshots"] |
||||
|
verbs: ["get", "list", "watch", "update"] |
||||
|
- apiGroups: ["snapshot.storage.k8s.io"] |
||||
|
resources: ["volumesnapshots/status"] |
||||
|
verbs: ["update"] |
||||
|
|
||||
|
--- |
||||
|
kind: ClusterRoleBinding |
||||
|
apiVersion: rbac.authorization.k8s.io/v1 |
||||
|
metadata: |
||||
|
name: snapshot-controller-role |
||||
|
subjects: |
||||
|
- kind: ServiceAccount |
||||
|
name: snapshot-controller |
||||
|
namespace: kube-system |
||||
|
roleRef: |
||||
|
kind: ClusterRole |
||||
|
# change the name also here if the ClusterRole gets renamed |
||||
|
name: snapshot-controller-runner |
||||
|
apiGroup: rbac.authorization.k8s.io |
||||
|
|
||||
|
--- |
||||
|
kind: Role |
||||
|
apiVersion: rbac.authorization.k8s.io/v1 |
||||
|
metadata: |
||||
|
namespace: kube-system |
||||
|
name: snapshot-controller-leaderelection |
||||
|
rules: |
||||
|
- apiGroups: ["coordination.k8s.io"] |
||||
|
resources: ["leases"] |
||||
|
verbs: ["get", "watch", "list", "delete", "update", "create"] |
||||
|
|
||||
|
--- |
||||
|
kind: RoleBinding |
||||
|
apiVersion: rbac.authorization.k8s.io/v1 |
||||
|
metadata: |
||||
|
name: snapshot-controller-leaderelection |
||||
|
namespace: kube-system |
||||
|
subjects: |
||||
|
- kind: ServiceAccount |
||||
|
name: snapshot-controller |
||||
|
namespace: kube-system |
||||
|
roleRef: |
||||
|
kind: Role |
||||
|
name: snapshot-controller-leaderelection |
||||
|
apiGroup: rbac.authorization.k8s.io |
@ -0,0 +1,32 @@ |
|||||
|
# This YAML file shows how to deploy the snapshot controller |
||||
|
|
||||
|
# The snapshot controller implements the control loop for CSI snapshot functionality. |
||||
|
# It should be installed as part of the base Kubernetes distribution in an appropriate |
||||
|
# namespace for components implementing base system functionality. For installing with |
||||
|
# Vanilla Kubernetes, kube-system makes sense for the namespace. |
||||
|
|
||||
|
--- |
||||
|
kind: StatefulSet |
||||
|
apiVersion: apps/v1 |
||||
|
metadata: |
||||
|
name: snapshot-controller |
||||
|
namespace: kube-system |
||||
|
spec: |
||||
|
serviceName: "snapshot-controller" |
||||
|
replicas: {{ snapshot_controller_replicas }} |
||||
|
selector: |
||||
|
matchLabels: |
||||
|
app: snapshot-controller |
||||
|
template: |
||||
|
metadata: |
||||
|
labels: |
||||
|
app: snapshot-controller |
||||
|
spec: |
||||
|
serviceAccount: snapshot-controller |
||||
|
containers: |
||||
|
- name: snapshot-controller |
||||
|
image: {{ snapshot_controller_image_repo }}:{{ snapshot_controller_image_tag }} |
||||
|
args: |
||||
|
- "--v=5" |
||||
|
- "--leader-election=false" |
||||
|
imagePullPolicy: {{ k8s_image_pull_policy }} |
Write
Preview
Loading…
Cancel
Save