├── .gitattributes ├── .github └── workflows │ ├── publish.yml │ └── pull.yml ├── .gitignore ├── .travis.yml ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── OWNERS ├── README.md ├── SECURITY_CONTACTS ├── book ├── book.toml ├── custom.js └── src │ ├── README.md │ ├── SUMMARY.md │ ├── _book │ ├── Users.md │ ├── example │ │ ├── csi-app.yaml │ │ ├── csi-pvc.yaml │ │ └── csi-setup.yaml │ ├── gitbook │ │ ├── fonts │ │ │ └── fontawesome │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ ├── gitbook-plugin-fontsettings │ │ │ ├── fontsettings.js │ │ │ └── website.css │ │ ├── gitbook-plugin-highlight │ │ │ ├── ebook.css │ │ │ └── website.css │ │ ├── gitbook-plugin-lunr │ │ │ ├── lunr.min.js │ │ │ └── search-lunr.js │ │ ├── gitbook-plugin-search │ │ │ ├── lunr.min.js │ │ │ ├── search-engine.js │ │ │ ├── search.css │ │ │ └── search.js │ │ ├── gitbook-plugin-sharing │ │ │ └── buttons.js │ │ ├── gitbook.js │ │ ├── images │ │ │ ├── apple-touch-icon-precomposed-152.png │ │ │ └── favicon.ico │ │ ├── style.css │ │ └── theme.js │ ├── images │ │ ├── kubelet.png │ │ └── sidecar-container.png │ └── search_index.json │ ├── api.md │ ├── api │ └── volume-snapshot.md │ ├── changed-block-tracking.md │ ├── cluster-driver-registrar.md │ ├── cross-namespace-data-sources.md │ ├── csi-driver-object.md │ ├── csi-node-object.md │ ├── csi-objects.md │ ├── csi-proxy.md │ ├── csi-windows.md │ ├── deploying.md │ ├── developing.md │ ├── drivers.md │ ├── ephemeral-local-volumes.md │ ├── example.md │ ├── example │ ├── snapshot │ │ ├── csi-hostpath-snapshotter.yaml │ │ ├── csi-restore.yaml │ │ ├── csi-snapshot.yaml │ │ └── csi-snapshotclass.yaml │ └── usage │ │ ├── csi-app.yaml │ │ ├── csi-pvc.yaml │ │ └── csi-storageclass.yaml │ ├── external-attacher.md │ ├── external-health-monitor-agent.md │ ├── external-health-monitor-controller.md │ ├── external-provisioner.md │ ├── external-resizer.md │ ├── external-snapshot-metadata.md │ ├── external-snapshotter.md │ ├── features.md │ ├── functional-testing.md │ ├── group-snapshot-restore-feature.md │ ├── group-snapshot.md │ ├── images │ ├── kubelet.png │ └── sidecar-container.png │ ├── introduction.md │ ├── kubernetes-changelog.md │ ├── kubernetes-cluster-controllers.md │ ├── livenessprobe.md │ ├── node-driver-registrar.md │ ├── pod-info.md │ ├── prevent-volume-mode-conversion.md │ ├── project-policies.md │ ├── raw-block.md │ ├── secrets-and-credentials-storage-class.md │ ├── secrets-and-credentials-volume-group-snapshot-class.md │ ├── secrets-and-credentials-volume-snapshot-class.md │ ├── secrets-and-credentials.md │ ├── sidecar-containers.md │ ├── skip-attach.md │ ├── snapshot-controller.md │ ├── snapshot-restore-feature.md │ ├── snapshot-validation-webhook.md │ ├── storage-capacity-tracking.md │ ├── support-fsgroup.md │ ├── testing-drivers.md │ ├── token-requests.md │ ├── topology.md │ ├── troubleshooting.md │ ├── unit-testing.md │ ├── volume-attributes-class.md │ ├── volume-cloning.md │ ├── volume-datasources.md │ ├── volume-expansion.md │ ├── volume-health-monitor.md │ └── volume-limits.md ├── code-of-conduct.md └── hack ├── gen-api.json ├── gen-api.sh └── update-example.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | docs/* linguist-generated=true 2 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: publish 2 | 3 | # Controls when the workflow will run 4 | on: 5 | # Triggers the workflow on push or pull request events but only for the master branch 6 | push: 7 | branches: [ master ] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 13 | jobs: 14 | # This workflow contains a single job called "build" 15 | build: 16 | # The type of runner that the job will run on 17 | runs-on: ubuntu-latest 18 | 19 | # Steps represent a sequence of tasks that will be executed as part of the job 20 | steps: 21 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 22 | - uses: actions/checkout@v2 23 | 24 | # The same command that users can use locally is used to build documentation. 25 | - name: Build documentation 26 | run: make 27 | 28 | # Publish the result by overwriting the "gh-pages" branch with the new content. 29 | - name: Deploy 30 | uses: JamesIves/github-pages-deploy-action@4.1.4 31 | with: 32 | branch: gh-pages 33 | folder: docs 34 | git-config-name: GitHub Actions 35 | git-config-email: github-actions@kubernetes-csi 36 | # This secret was created in the repo's settings under "Secrets". 37 | # It contains an SSH private key created specifically for this job. 38 | # The corresponding public key was added to the repo's deploy keys. 39 | ssh-key: ${{ secrets.DEPLOY_KEY }} 40 | -------------------------------------------------------------------------------- /.github/workflows/pull.yml: -------------------------------------------------------------------------------- 1 | name: pull 2 | 3 | # Controls when the workflow will run 4 | on: 5 | pull_request: 6 | branches: [ master ] 7 | 8 | # Allows you to run this workflow manually from the Actions tab 9 | workflow_dispatch: 10 | 11 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 12 | jobs: 13 | # This workflow contains a single job called "build" 14 | build: 15 | # The type of runner that the job will run on 16 | runs-on: ubuntu-latest 17 | 18 | # Steps represent a sequence of tasks that will be executed as part of the job 19 | steps: 20 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 21 | - uses: actions/checkout@v2 22 | 23 | # The same command that users can use locally is used to build documentation. 24 | - name: Build documentation 25 | run: make 26 | 27 | # Publish generated site as artifact. Unfortunately viewing it requires 28 | # downloading a .zip and uncompressing that (https://github.com/actions/upload-artifact/issues/14#issuecomment-620728238) 29 | - uses: actions/upload-artifact@v4 30 | with: 31 | name: html-docs 32 | path: docs 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # The example references the latest .yaml file directly in the source repository, 2 | # therefore we don't need the copy in the generated documentation. 3 | docs/example 4 | 5 | # vim 6 | *.swp 7 | 8 | /mdbook 9 | /mdbook*.tar.gz 10 | /docs 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: generic 2 | 3 | script: bash ./hack/deploy.sh 4 | env: 5 | global: 6 | - ENCRYPTION_LABEL: "4d61ca75e316" # from travis encrypt-file deploy_key, see https://gist.github.com/domenic/ec8b0fc8ab45f39403dd#get-encrypted-credentials 7 | - COMMIT_AUTHOR_EMAIL: "travis-ci@kubernetes-csi" 8 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Welcome to Kubernetes. We are excited about the prospect of you joining our [community](https://github.com/kubernetes/community)! The Kubernetes community abides by the CNCF [code of conduct](code-of-conduct.md). Here is an excerpt: 4 | 5 | _As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities._ 6 | 7 | ## Getting Started 8 | 9 | ### Adding documentation 10 | Please feel free to send PRs for the documentation in the `book` directory. If you fork and edit on your system, please generate a new output. 11 | 12 | We have full documentation on how to get started contributing here: 13 | 14 | - [Contributor License Agreement](https://git.k8s.io/community/CLA.md) Kubernetes projects require that you sign a Contributor License Agreement (CLA) before we can accept your pull requests 15 | - [Kubernetes Contributor Guide](https://git.k8s.io/community/contributors/guide) - Main contributor documentation, or you can just jump directly to the [contributing section](https://git.k8s.io/community/contributors/guide#contributing) 16 | - [Contributor Cheat Sheet](https://git.k8s.io/community/contributors/guide/contributor-cheatsheet) - Common resources for existing developers 17 | 18 | ## Mentorship 19 | 20 | - [Mentoring Initiatives](https://git.k8s.io/community/mentoring) - We have a diverse set of mentorship programs available that are always looking for volunteers! 21 | 22 | ## Contact Information 23 | 24 | - [Slack channel](https://kubernetes.slack.com/messages/sig-storage) 25 | - [Mailing list](https://groups.google.com/forum/#!forum/kubernetes-sig-storage) 26 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ROOT := $(shell pwd) 2 | 3 | # The default is to download the official release binary 4 | # for x86_64-unknown-linux-gnu. If that default is unsuitable, 5 | # build your own binary and copy or symlink it here, or 6 | # override the variable with "make MDBOOK_BINARY=...". 7 | MDBOOK_BINARY = $(ROOT)/mdbook 8 | 9 | # The architecture can be changed. Only Linux .tar.gz files 10 | # are currently supported, though. See https://github.com/rust-lang-nursery/mdBook/releases 11 | # for available architectures. 12 | ifeq ($(shell uname),Darwin) 13 | MDBOOK_ARCH = x86_64-apple-darwin 14 | else 15 | MDBOOK_ARCH = x86_64-unknown-linux-gnu 16 | endif 17 | 18 | # The mdbook version. 19 | MDBOOK_RELEASE = v0.4.5 20 | 21 | # Download URL for mdbook and resulting file. 22 | MDBOOK_FILE = mdbook-$(MDBOOK_RELEASE)-$(MDBOOK_ARCH).tar.gz 23 | MDBOOK_URL = https://github.com/rust-lang-nursery/mdBook/releases/download/$(MDBOOK_RELEASE)/$(MDBOOK_FILE) 24 | 25 | # As an extra sanity check, the hash of the downloaded file must match before it is used. 26 | ifeq ($(shell uname),Darwin) 27 | MDBOOK_SHA1 = 9656d6dedb7a56a30aeba8214186702e7824f18d 28 | else 29 | MDBOOK_SHA1 = dd51a3bc1d41092446b710c2f4b69054dc2ea666 30 | endif 31 | 32 | all: $(MDBOOK_BINARY) 33 | cd book && $(MDBOOK_BINARY) build 34 | 35 | clean: 36 | rm -rf docs mdbook-*.tar.gz 37 | 38 | clobber: clean 39 | rm -f mdbook 40 | 41 | # Start mdbook as web server. 42 | MDBOOK_HOSTNAME ?= localhost 43 | MDBOOK_PORT = 3000 44 | serve: 45 | cd book && $(MDBOOK_BINARY) serve --hostname $(MDBOOK_HOSTNAME) --port $(MDBOOK_PORT) 46 | 47 | $(MDBOOK_BINARY): $(MDBOOK_FILE) 48 | if [ "`sha1sum < $(MDBOOK_FILE) | sed -e 's/ *-$$//'`" != $(MDBOOK_SHA1) ]; then \ 49 | echo "ERROR: hash mismatch, check downloaded file $(MDBOOK_FILE) and/or update MDBOOK_SHA1"; \ 50 | exit 1; \ 51 | fi 52 | tar xf $(MDBOOK_FILE) 53 | touch $@ 54 | 55 | $(MDBOOK_FILE): 56 | curl -L -O $(MDBOOK_URL) 57 | 58 | .PHONY: all clean clobber serve 59 | -------------------------------------------------------------------------------- /OWNERS: -------------------------------------------------------------------------------- 1 | approvers: 2 | - saad-ali 3 | - lpabon 4 | - msau42 5 | - xing-yang 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Kubernetes-CSI Documentation 2 | 3 | This repository contains documentation capturing how to develop and deploy a [Container Storage Interface](https://github.com/container-storage-interface/spec/blob/master/spec.md) (CSI) driver on Kubernetes. 4 | 5 | To access the documentation go to: [kubernetes-csi.github.io/docs](https://kubernetes-csi.github.io/docs/) 6 | 7 | To make changes to the documentation, modify the files in [book/src](https://github.com/kubernetes-csi/docs/tree/master/book/src) and submit a new PR. 8 | 9 | Once the PR is reviewed and merged, the CI will automatically generate (using [mdbook](https://github.com/rust-lang-nursery/mdBook)) the HTML to serve and check it in to [src/_book](https://github.com/kubernetes-csi/docs/tree/master/book/src/_book). 10 | 11 | To update the [CRD API documentation](book/src/api.md), run: 12 | 13 | ```sh 14 | ./hack/gen-api.sh 15 | ``` 16 | 17 | The script uses the [gen-crd-api-reference-docs](https://github.com/ahmetb/gen-crd-api-reference-docs/) tool to generate a markdown document for the [VolumeSnapshot CRD API](https://github.com/kubernetes-csi/external-snapshotter/tree/master/client/apis/volumesnapshot/v1). See the script for more information and supported configuration. 18 | 19 | ## Community, discussion, contribution, and support 20 | 21 | Learn how to engage with the Kubernetes community on the [community page](https://kubernetes.io/community/). 22 | 23 | You can reach the maintainers of this project at: 24 | 25 | - [Slack channel](https://kubernetes.slack.com/messages/sig-storage) 26 | - [Mailing list](https://groups.google.com/forum/#!forum/kubernetes-sig-storage) 27 | 28 | ### Code of conduct 29 | 30 | Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md). 31 | 32 | ## To start editing on localhost 33 | 34 | ```bash 35 | $ git clone git@github.com:kubernetes-csi/docs.git 36 | $ cd docs 37 | $ make $(pwd)/mdbook 38 | $ make serve 39 | ``` 40 | 41 | Access to http:localhost:3000 and you can view a book on localhost! 42 | -------------------------------------------------------------------------------- /SECURITY_CONTACTS: -------------------------------------------------------------------------------- 1 | # Defined below are the security contacts for this repo. 2 | # 3 | # They are the contact point for the Product Security Team to reach out 4 | # to for triaging and handling of incoming issues. 5 | # 6 | # The below names agree to abide by the 7 | # [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) 8 | # and will be removed and replaced if they violate that agreement. 9 | # 10 | # DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE 11 | # INSTRUCTIONS AT https://kubernetes.io/security/ 12 | 13 | saad-ali 14 | -------------------------------------------------------------------------------- /book/book.toml: -------------------------------------------------------------------------------- 1 | [book] 2 | title = "Kubernetes CSI Developer Documentation" 3 | description = "This site documents how to develop and deploy a Container Storage Interface (CSI) driver on Kubernetes." 4 | authors = ["The Kubernetes Authors"] 5 | 6 | [output.html] 7 | additional-js = ["custom.js"] 8 | 9 | [build] 10 | build-dir = "../docs" 11 | -------------------------------------------------------------------------------- /book/custom.js: -------------------------------------------------------------------------------- 1 | document.querySelectorAll(".production_drivers a").forEach(function(externalLink){ 2 | externalLink.addEventListener("click", function(e){ 3 | if (confirm("You are being redirected to an external website.\nThe Kubernetes community does not validate external CSI drivers and they should be used at your own risk.") == true) { 4 | return true; 5 | } else { 6 | e.preventDefault(); // cancel the event 7 | return false; 8 | } 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /book/src/README.md: -------------------------------------------------------------------------------- 1 | # Kubernetes CSI Documentation 2 | 3 | Any changes to the files in this repo will result in changes to https://kubernetes-csi.github.io/docs/ -------------------------------------------------------------------------------- /book/src/SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Kubernetes/CSI Book 2 | 3 | - [Introduction](introduction.md) 4 | - [Developing a CSI Driver for Kubernetes](developing.md) 5 | - [Versioning, Support, Compatibility Policies](project-policies.md) 6 | - [Kubernetes Changelog](kubernetes-changelog.md) 7 | - [Kubernetes Cluster Controllers](kubernetes-cluster-controllers.md) 8 | - [Snapshot Controller](snapshot-controller.md) 9 | - [Snapshot Validation Webhook](snapshot-validation-webhook.md) 10 | - [CSI Proxy](csi-proxy.md) 11 | - [Sidecar Containers](sidecar-containers.md) 12 | - [external-attacher](external-attacher.md) 13 | - [external-provisioner](external-provisioner.md) 14 | - [external-resizer](external-resizer.md) 15 | - [external-snapshotter](external-snapshotter.md) 16 | - [livenessprobe](livenessprobe.md) 17 | - [node-driver-registrar](node-driver-registrar.md) 18 | - [cluster-driver-registrar](cluster-driver-registrar.md) (deprecated) 19 | - [external-health-monitor-controller](external-health-monitor-controller.md) 20 | - [external-health-monitor-agent](external-health-monitor-agent.md) 21 | - [external-snapshot-metadata](external-snapshot-metadata.md) 22 | - [CSI objects](csi-objects.md) 23 | - [CSIDriver Object](csi-driver-object.md) 24 | - [CSINode Object](csi-node-object.md) 25 | - [Features](features.md) 26 | - [Secrets & Credentials](secrets-and-credentials.md) 27 | - [StorageClass Secrets](secrets-and-credentials-storage-class.md) 28 | - [VolumeSnapshotClass Secrets](secrets-and-credentials-volume-snapshot-class.md) 29 | - [VolumeGroupSnapshotClass Secrets](secrets-and-credentials-volume-group-snapshot-class.md) 30 | - [Topology](topology.md) 31 | - [Raw Block Volume](raw-block.md) 32 | - [Skip Attach](skip-attach.md) 33 | - [Pod Info on Mount](pod-info.md) 34 | - [Volume expansion](volume-expansion.md) 35 | - [Data Sources](volume-datasources.md) 36 | - [Cloning](volume-cloning.md) 37 | - [Volume Snapshot & Restore](snapshot-restore-feature.md) 38 | - [Volume Group Snapshot & Restore](group-snapshot-restore-feature.md) 39 | - [Ephemeral Local Volumes](ephemeral-local-volumes.md) 40 | - [Volume Limits](volume-limits.md) 41 | - [Storage Capacity Tracking](storage-capacity-tracking.md) 42 | - [Volume Health Monitoring](volume-health-monitor.md) 43 | - [Token Requests](token-requests.md) 44 | - [FSGroup Support](support-fsgroup.md) 45 | - [CSI Windows](csi-windows.md) 46 | - [Volume Mode Conversion](prevent-volume-mode-conversion.md) 47 | - [Cross-Namespace Data Sources](cross-namespace-data-sources.md) 48 | - [Changed Block Tracking](changed-block-tracking.md) 49 | - [Volume Attributes Class](volume-attributes-class.md) 50 | - [Deploying a CSI Driver on Kubernetes](deploying.md) 51 | - [Example](example.md) 52 | - [Driver Testing](testing-drivers.md) 53 | - [Unit Testing](unit-testing.md) 54 | - [Functional Testing](functional-testing.md) 55 | - [Drivers](drivers.md) 56 | - [API Reference](api.md) 57 | - [Volume Snapshot](api/volume-snapshot.md) 58 | - [Troubleshooting](troubleshooting.md) 59 | -------------------------------------------------------------------------------- /book/src/_book/Users.md: -------------------------------------------------------------------------------- 1 | # Users 2 | This section describes to users how to deploy, use, and manage a CSI driver. -------------------------------------------------------------------------------- /book/src/_book/example/csi-app.yaml: -------------------------------------------------------------------------------- 1 | kind: Pod 2 | apiVersion: v1 3 | metadata: 4 | name: my-csi-app 5 | spec: 6 | containers: 7 | - name: my-frontend 8 | image: busybox 9 | volumeMounts: 10 | - mountPath: "/data" 11 | name: my-csi-volume 12 | command: [ "sleep", "1000000" ] 13 | volumes: 14 | - name: my-csi-volume 15 | persistentVolumeClaim: 16 | claimName: csi-pvc # defined in csi-pvs.yaml -------------------------------------------------------------------------------- /book/src/_book/example/csi-pvc.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: csi-pvc 5 | spec: 6 | accessModes: 7 | - ReadWriteOnce 8 | resources: 9 | requests: 10 | storage: 1Gi 11 | storageClassName: csi-hostpath-sc # defined in csi-setup.yaml -------------------------------------------------------------------------------- /book/src/_book/example/csi-setup.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: storage.k8s.io/v1 2 | kind: StorageClass 3 | metadata: 4 | name: csi-hostpath-sc 5 | provisioner: csi-hostpath 6 | reclaimPolicy: Delete 7 | volumeBindingMode: Immediate 8 | --- 9 | apiVersion: v1 10 | kind: ServiceAccount 11 | metadata: 12 | name: csi-service-account 13 | namespace: default 14 | --- 15 | apiVersion: rbac.authorization.k8s.io/v1 16 | kind: ClusterRole 17 | metadata: 18 | name: csi-cluster-role 19 | rules: 20 | - apiGroups: 21 | - "" 22 | resources: 23 | - persistentvolumes 24 | verbs: 25 | - create 26 | - delete 27 | - get 28 | - list 29 | - watch 30 | - update 31 | - apiGroups: 32 | - "" 33 | resources: 34 | - secrets 35 | verbs: 36 | - get 37 | - list 38 | - apiGroups: 39 | - "" 40 | resources: 41 | - persistentvolumeclaims 42 | verbs: 43 | - get 44 | - list 45 | - watch 46 | - update 47 | - apiGroups: 48 | - "" 49 | resources: 50 | - nodes 51 | verbs: 52 | - get 53 | - list 54 | - watch 55 | - update 56 | - apiGroups: 57 | - storage.k8s.io 58 | resources: 59 | - volumeattachments 60 | verbs: 61 | - get 62 | - list 63 | - watch 64 | - update 65 | - apiGroups: 66 | - storage.k8s.io 67 | resources: 68 | - storageclasses 69 | verbs: 70 | - get 71 | - list 72 | - watch 73 | - apiGroups: 74 | - "" 75 | resources: 76 | - events 77 | verbs: 78 | - list 79 | - watch 80 | - create 81 | - update 82 | - patch 83 | --- 84 | apiVersion: rbac.authorization.k8s.io/v1 85 | kind: ClusterRoleBinding 86 | metadata: 87 | name: csi-role-binding 88 | roleRef: 89 | apiGroup: rbac.authorization.k8s.io 90 | kind: ClusterRole 91 | name: csi-cluster-role 92 | subjects: 93 | - kind: ServiceAccount 94 | name: csi-service-account 95 | namespace: default 96 | --- 97 | apiVersion: v1 98 | kind: Pod 99 | metadata: 100 | labels: 101 | app: hostpath-driver 102 | name: csi-pod 103 | namespace: default 104 | spec: 105 | serviceAccount: csi-service-account 106 | containers: 107 | - name: external-provisioner 108 | args: 109 | - --v=5 110 | - --provisioner=csi-hostpath 111 | - --csi-address=/csi/csi.sock 112 | image: quay.io/k8scsi/csi-provisioner:v0.2.0 113 | imagePullPolicy: Always 114 | volumeMounts: 115 | - mountPath: /csi 116 | name: socket-dir 117 | - name: driver-registrar 118 | args: 119 | - --v=5 120 | - --csi-address=/csi/csi.sock 121 | env: 122 | - name: KUBE_NODE_NAME 123 | valueFrom: 124 | fieldRef: 125 | apiVersion: v1 126 | fieldPath: spec.nodeName 127 | image: quay.io/k8scsi/driver-registrar:v0.2.0 128 | imagePullPolicy: Always 129 | volumeMounts: 130 | - mountPath: /csi 131 | name: socket-dir 132 | - name: external-attacher 133 | args: 134 | - --v=5 135 | - --csi-address=/csi/csi.sock 136 | image: quay.io/k8scsi/csi-attacher:v0.2.0 137 | imagePullPolicy: Always 138 | volumeMounts: 139 | - mountPath: /csi 140 | name: socket-dir 141 | - name: hostpath-driver 142 | args: 143 | - --v=5 144 | - --endpoint=$(CSI_ENDPOINT) 145 | - --nodeid=$(KUBE_NODE_NAME) 146 | env: 147 | - name: CSI_ENDPOINT 148 | value: unix:///csi/csi.sock 149 | - name: KUBE_NODE_NAME 150 | valueFrom: 151 | fieldRef: 152 | apiVersion: v1 153 | fieldPath: spec.nodeName 154 | image: quay.io/k8scsi/hostpathplugin:v0.2.0 155 | imagePullPolicy: Always 156 | securityContext: 157 | privileged: true 158 | volumeMounts: 159 | - mountPath: /csi 160 | name: socket-dir 161 | - mountPath: /var/lib/kubelet/pods 162 | mountPropagation: Bidirectional 163 | name: mountpoint-dir 164 | volumes: 165 | - hostPath: 166 | path: /var/lib/kubelet/plugins/csi-hostpath 167 | type: DirectoryOrCreate 168 | name: socket-dir 169 | - hostPath: 170 | path: /var/lib/kubelet/pods 171 | type: DirectoryOrCreate 172 | name: mountpoint-dir -------------------------------------------------------------------------------- /book/src/_book/gitbook/fonts/fontawesome/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubernetes-csi/docs/5041993eaa6e214c22591b8a1168fdc8548b6b38/book/src/_book/gitbook/fonts/fontawesome/FontAwesome.otf -------------------------------------------------------------------------------- /book/src/_book/gitbook/fonts/fontawesome/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubernetes-csi/docs/5041993eaa6e214c22591b8a1168fdc8548b6b38/book/src/_book/gitbook/fonts/fontawesome/fontawesome-webfont.eot -------------------------------------------------------------------------------- /book/src/_book/gitbook/fonts/fontawesome/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubernetes-csi/docs/5041993eaa6e214c22591b8a1168fdc8548b6b38/book/src/_book/gitbook/fonts/fontawesome/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /book/src/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubernetes-csi/docs/5041993eaa6e214c22591b8a1168fdc8548b6b38/book/src/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff -------------------------------------------------------------------------------- /book/src/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubernetes-csi/docs/5041993eaa6e214c22591b8a1168fdc8548b6b38/book/src/_book/gitbook/fonts/fontawesome/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /book/src/_book/gitbook/gitbook-plugin-fontsettings/fontsettings.js: -------------------------------------------------------------------------------- 1 | require(['gitbook', 'jquery'], function(gitbook, $) { 2 | // Configuration 3 | var MAX_SIZE = 4, 4 | MIN_SIZE = 0, 5 | BUTTON_ID; 6 | 7 | // Current fontsettings state 8 | var fontState; 9 | 10 | // Default themes 11 | var THEMES = [ 12 | { 13 | config: 'white', 14 | text: 'White', 15 | id: 0 16 | }, 17 | { 18 | config: 'sepia', 19 | text: 'Sepia', 20 | id: 1 21 | }, 22 | { 23 | config: 'night', 24 | text: 'Night', 25 | id: 2 26 | } 27 | ]; 28 | 29 | // Default font families 30 | var FAMILIES = [ 31 | { 32 | config: 'serif', 33 | text: 'Serif', 34 | id: 0 35 | }, 36 | { 37 | config: 'sans', 38 | text: 'Sans', 39 | id: 1 40 | } 41 | ]; 42 | 43 | // Return configured themes 44 | function getThemes() { 45 | return THEMES; 46 | } 47 | 48 | // Modify configured themes 49 | function setThemes(themes) { 50 | THEMES = themes; 51 | updateButtons(); 52 | } 53 | 54 | // Return configured font families 55 | function getFamilies() { 56 | return FAMILIES; 57 | } 58 | 59 | // Modify configured font families 60 | function setFamilies(families) { 61 | FAMILIES = families; 62 | updateButtons(); 63 | } 64 | 65 | // Save current font settings 66 | function saveFontSettings() { 67 | gitbook.storage.set('fontState', fontState); 68 | update(); 69 | } 70 | 71 | // Increase font size 72 | function enlargeFontSize(e) { 73 | e.preventDefault(); 74 | if (fontState.size >= MAX_SIZE) return; 75 | 76 | fontState.size++; 77 | saveFontSettings(); 78 | } 79 | 80 | // Decrease font size 81 | function reduceFontSize(e) { 82 | e.preventDefault(); 83 | if (fontState.size <= MIN_SIZE) return; 84 | 85 | fontState.size--; 86 | saveFontSettings(); 87 | } 88 | 89 | // Change font family 90 | function changeFontFamily(configName, e) { 91 | if (e && e instanceof Event) { 92 | e.preventDefault(); 93 | } 94 | 95 | var familyId = getFontFamilyId(configName); 96 | fontState.family = familyId; 97 | saveFontSettings(); 98 | } 99 | 100 | // Change type of color theme 101 | function changeColorTheme(configName, e) { 102 | if (e && e instanceof Event) { 103 | e.preventDefault(); 104 | } 105 | 106 | var $book = gitbook.state.$book; 107 | 108 | // Remove currently applied color theme 109 | if (fontState.theme !== 0) 110 | $book.removeClass('color-theme-'+fontState.theme); 111 | 112 | // Set new color theme 113 | var themeId = getThemeId(configName); 114 | fontState.theme = themeId; 115 | if (fontState.theme !== 0) 116 | $book.addClass('color-theme-'+fontState.theme); 117 | 118 | saveFontSettings(); 119 | } 120 | 121 | // Return the correct id for a font-family config key 122 | // Default to first font-family 123 | function getFontFamilyId(configName) { 124 | // Search for plugin configured font family 125 | var configFamily = $.grep(FAMILIES, function(family) { 126 | return family.config == configName; 127 | })[0]; 128 | // Fallback to default font family 129 | return (!!configFamily)? configFamily.id : 0; 130 | } 131 | 132 | // Return the correct id for a theme config key 133 | // Default to first theme 134 | function getThemeId(configName) { 135 | // Search for plugin configured theme 136 | var configTheme = $.grep(THEMES, function(theme) { 137 | return theme.config == configName; 138 | })[0]; 139 | // Fallback to default theme 140 | return (!!configTheme)? configTheme.id : 0; 141 | } 142 | 143 | function update() { 144 | var $book = gitbook.state.$book; 145 | 146 | $('.font-settings .font-family-list li').removeClass('active'); 147 | $('.font-settings .font-family-list li:nth-child('+(fontState.family+1)+')').addClass('active'); 148 | 149 | $book[0].className = $book[0].className.replace(/\bfont-\S+/g, ''); 150 | $book.addClass('font-size-'+fontState.size); 151 | $book.addClass('font-family-'+fontState.family); 152 | 153 | if(fontState.theme !== 0) { 154 | $book[0].className = $book[0].className.replace(/\bcolor-theme-\S+/g, ''); 155 | $book.addClass('color-theme-'+fontState.theme); 156 | } 157 | } 158 | 159 | function init(config) { 160 | // Search for plugin configured font family 161 | var configFamily = getFontFamilyId(config.family), 162 | configTheme = getThemeId(config.theme); 163 | 164 | // Instantiate font state object 165 | fontState = gitbook.storage.get('fontState', { 166 | size: config.size || 2, 167 | family: configFamily, 168 | theme: configTheme 169 | }); 170 | 171 | update(); 172 | } 173 | 174 | function updateButtons() { 175 | // Remove existing fontsettings buttons 176 | if (!!BUTTON_ID) { 177 | gitbook.toolbar.removeButton(BUTTON_ID); 178 | } 179 | 180 | // Create buttons in toolbar 181 | BUTTON_ID = gitbook.toolbar.createButton({ 182 | icon: 'fa fa-font', 183 | label: 'Font Settings', 184 | className: 'font-settings', 185 | dropdown: [ 186 | [ 187 | { 188 | text: 'A', 189 | className: 'font-reduce', 190 | onClick: reduceFontSize 191 | }, 192 | { 193 | text: 'A', 194 | className: 'font-enlarge', 195 | onClick: enlargeFontSize 196 | } 197 | ], 198 | $.map(FAMILIES, function(family) { 199 | family.onClick = function(e) { 200 | return changeFontFamily(family.config, e); 201 | }; 202 | 203 | return family; 204 | }), 205 | $.map(THEMES, function(theme) { 206 | theme.onClick = function(e) { 207 | return changeColorTheme(theme.config, e); 208 | }; 209 | 210 | return theme; 211 | }) 212 | ] 213 | }); 214 | } 215 | 216 | // Init configuration at start 217 | gitbook.events.bind('start', function(e, config) { 218 | var opts = config.fontsettings; 219 | 220 | // Generate buttons at start 221 | updateButtons(); 222 | 223 | // Init current settings 224 | init(opts); 225 | }); 226 | 227 | // Expose API 228 | gitbook.fontsettings = { 229 | enlargeFontSize: enlargeFontSize, 230 | reduceFontSize: reduceFontSize, 231 | setTheme: changeColorTheme, 232 | setFamily: changeFontFamily, 233 | getThemes: getThemes, 234 | setThemes: setThemes, 235 | getFamilies: getFamilies, 236 | setFamilies: setFamilies 237 | }; 238 | }); 239 | 240 | 241 | -------------------------------------------------------------------------------- /book/src/_book/gitbook/gitbook-plugin-highlight/ebook.css: -------------------------------------------------------------------------------- 1 | pre, 2 | code { 3 | /* http://jmblog.github.io/color-themes-for-highlightjs */ 4 | /* Tomorrow Comment */ 5 | /* Tomorrow Red */ 6 | /* Tomorrow Orange */ 7 | /* Tomorrow Yellow */ 8 | /* Tomorrow Green */ 9 | /* Tomorrow Aqua */ 10 | /* Tomorrow Blue */ 11 | /* Tomorrow Purple */ 12 | } 13 | pre .hljs-comment, 14 | code .hljs-comment, 15 | pre .hljs-title, 16 | code .hljs-title { 17 | color: #8e908c; 18 | } 19 | pre .hljs-variable, 20 | code .hljs-variable, 21 | pre .hljs-attribute, 22 | code .hljs-attribute, 23 | pre .hljs-tag, 24 | code .hljs-tag, 25 | pre .hljs-regexp, 26 | code .hljs-regexp, 27 | pre .hljs-deletion, 28 | code .hljs-deletion, 29 | pre .ruby .hljs-constant, 30 | code .ruby .hljs-constant, 31 | pre .xml .hljs-tag .hljs-title, 32 | code .xml .hljs-tag .hljs-title, 33 | pre .xml .hljs-pi, 34 | code .xml .hljs-pi, 35 | pre .xml .hljs-doctype, 36 | code .xml .hljs-doctype, 37 | pre .html .hljs-doctype, 38 | code .html .hljs-doctype, 39 | pre .css .hljs-id, 40 | code .css .hljs-id, 41 | pre .css .hljs-class, 42 | code .css .hljs-class, 43 | pre .css .hljs-pseudo, 44 | code .css .hljs-pseudo { 45 | color: #c82829; 46 | } 47 | pre .hljs-number, 48 | code .hljs-number, 49 | pre .hljs-preprocessor, 50 | code .hljs-preprocessor, 51 | pre .hljs-pragma, 52 | code .hljs-pragma, 53 | pre .hljs-built_in, 54 | code .hljs-built_in, 55 | pre .hljs-literal, 56 | code .hljs-literal, 57 | pre .hljs-params, 58 | code .hljs-params, 59 | pre .hljs-constant, 60 | code .hljs-constant { 61 | color: #f5871f; 62 | } 63 | pre .ruby .hljs-class .hljs-title, 64 | code .ruby .hljs-class .hljs-title, 65 | pre .css .hljs-rules .hljs-attribute, 66 | code .css .hljs-rules .hljs-attribute { 67 | color: #eab700; 68 | } 69 | pre .hljs-string, 70 | code .hljs-string, 71 | pre .hljs-value, 72 | code .hljs-value, 73 | pre .hljs-inheritance, 74 | code .hljs-inheritance, 75 | pre .hljs-header, 76 | code .hljs-header, 77 | pre .hljs-addition, 78 | code .hljs-addition, 79 | pre .ruby .hljs-symbol, 80 | code .ruby .hljs-symbol, 81 | pre .xml .hljs-cdata, 82 | code .xml .hljs-cdata { 83 | color: #718c00; 84 | } 85 | pre .css .hljs-hexcolor, 86 | code .css .hljs-hexcolor { 87 | color: #3e999f; 88 | } 89 | pre .hljs-function, 90 | code .hljs-function, 91 | pre .python .hljs-decorator, 92 | code .python .hljs-decorator, 93 | pre .python .hljs-title, 94 | code .python .hljs-title, 95 | pre .ruby .hljs-function .hljs-title, 96 | code .ruby .hljs-function .hljs-title, 97 | pre .ruby .hljs-title .hljs-keyword, 98 | code .ruby .hljs-title .hljs-keyword, 99 | pre .perl .hljs-sub, 100 | code .perl .hljs-sub, 101 | pre .javascript .hljs-title, 102 | code .javascript .hljs-title, 103 | pre .coffeescript .hljs-title, 104 | code .coffeescript .hljs-title { 105 | color: #4271ae; 106 | } 107 | pre .hljs-keyword, 108 | code .hljs-keyword, 109 | pre .javascript .hljs-function, 110 | code .javascript .hljs-function { 111 | color: #8959a8; 112 | } 113 | pre .hljs, 114 | code .hljs { 115 | display: block; 116 | background: white; 117 | color: #4d4d4c; 118 | padding: 0.5em; 119 | } 120 | pre .coffeescript .javascript, 121 | code .coffeescript .javascript, 122 | pre .javascript .xml, 123 | code .javascript .xml, 124 | pre .tex .hljs-formula, 125 | code .tex .hljs-formula, 126 | pre .xml .javascript, 127 | code .xml .javascript, 128 | pre .xml .vbscript, 129 | code .xml .vbscript, 130 | pre .xml .css, 131 | code .xml .css, 132 | pre .xml .hljs-cdata, 133 | code .xml .hljs-cdata { 134 | opacity: 0.5; 135 | } 136 | -------------------------------------------------------------------------------- /book/src/_book/gitbook/gitbook-plugin-lunr/search-lunr.js: -------------------------------------------------------------------------------- 1 | require([ 2 | 'gitbook', 3 | 'jquery' 4 | ], function(gitbook, $) { 5 | // Define global search engine 6 | function LunrSearchEngine() { 7 | this.index = null; 8 | this.store = {}; 9 | this.name = 'LunrSearchEngine'; 10 | } 11 | 12 | // Initialize lunr by fetching the search index 13 | LunrSearchEngine.prototype.init = function() { 14 | var that = this; 15 | var d = $.Deferred(); 16 | 17 | $.getJSON(gitbook.state.basePath+'/search_index.json') 18 | .then(function(data) { 19 | // eslint-disable-next-line no-undef 20 | that.index = lunr.Index.load(data.index); 21 | that.store = data.store; 22 | d.resolve(); 23 | }); 24 | 25 | return d.promise(); 26 | }; 27 | 28 | // Search for a term and return results 29 | LunrSearchEngine.prototype.search = function(q, offset, length) { 30 | var that = this; 31 | var results = []; 32 | 33 | if (this.index) { 34 | results = $.map(this.index.search(q), function(result) { 35 | var doc = that.store[result.ref]; 36 | 37 | return { 38 | title: doc.title, 39 | url: doc.url, 40 | body: doc.summary || doc.body 41 | }; 42 | }); 43 | } 44 | 45 | return $.Deferred().resolve({ 46 | query: q, 47 | results: results.slice(0, length), 48 | count: results.length 49 | }).promise(); 50 | }; 51 | 52 | // Set gitbook research 53 | gitbook.events.bind('start', function(e, config) { 54 | var engine = gitbook.search.getEngine(); 55 | if (!engine) { 56 | gitbook.search.setEngine(LunrSearchEngine, config); 57 | } 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /book/src/_book/gitbook/gitbook-plugin-search/search-engine.js: -------------------------------------------------------------------------------- 1 | require([ 2 | 'gitbook', 3 | 'jquery' 4 | ], function(gitbook, $) { 5 | // Global search objects 6 | var engine = null; 7 | var initialized = false; 8 | 9 | // Set a new search engine 10 | function setEngine(Engine, config) { 11 | initialized = false; 12 | engine = new Engine(config); 13 | 14 | init(config); 15 | } 16 | 17 | // Initialize search engine with config 18 | function init(config) { 19 | if (!engine) throw new Error('No engine set for research. Set an engine using gitbook.research.setEngine(Engine).'); 20 | 21 | return engine.init(config) 22 | .then(function() { 23 | initialized = true; 24 | gitbook.events.trigger('search.ready'); 25 | }); 26 | } 27 | 28 | // Launch search for query q 29 | function query(q, offset, length) { 30 | if (!initialized) throw new Error('Search has not been initialized'); 31 | return engine.search(q, offset, length); 32 | } 33 | 34 | // Get stats about search 35 | function getEngine() { 36 | return engine? engine.name : null; 37 | } 38 | 39 | function isInitialized() { 40 | return initialized; 41 | } 42 | 43 | // Initialize gitbook.search 44 | gitbook.search = { 45 | setEngine: setEngine, 46 | getEngine: getEngine, 47 | query: query, 48 | isInitialized: isInitialized 49 | }; 50 | }); -------------------------------------------------------------------------------- /book/src/_book/gitbook/gitbook-plugin-search/search.css: -------------------------------------------------------------------------------- 1 | /* 2 | This CSS only styled the search results section, not the search input 3 | It defines the basic interraction to hide content when displaying results, etc 4 | */ 5 | #book-search-results .search-results { 6 | display: none; 7 | } 8 | #book-search-results .search-results ul.search-results-list { 9 | list-style-type: none; 10 | padding-left: 0; 11 | } 12 | #book-search-results .search-results ul.search-results-list li { 13 | margin-bottom: 1.5rem; 14 | padding-bottom: 0.5rem; 15 | /* Highlight results */ 16 | } 17 | #book-search-results .search-results ul.search-results-list li p em { 18 | background-color: rgba(255, 220, 0, 0.4); 19 | font-style: normal; 20 | } 21 | #book-search-results .search-results .no-results { 22 | display: none; 23 | } 24 | #book-search-results.open .search-results { 25 | display: block; 26 | } 27 | #book-search-results.open .search-noresults { 28 | display: none; 29 | } 30 | #book-search-results.no-results .search-results .has-results { 31 | display: none; 32 | } 33 | #book-search-results.no-results .search-results .no-results { 34 | display: block; 35 | } 36 | -------------------------------------------------------------------------------- /book/src/_book/gitbook/gitbook-plugin-search/search.js: -------------------------------------------------------------------------------- 1 | require([ 2 | 'gitbook', 3 | 'jquery' 4 | ], function(gitbook, $) { 5 | var MAX_RESULTS = 15; 6 | var MAX_DESCRIPTION_SIZE = 500; 7 | 8 | var usePushState = (typeof history.pushState !== 'undefined'); 9 | 10 | // DOM Elements 11 | var $body = $('body'); 12 | var $bookSearchResults; 13 | var $searchInput; 14 | var $searchList; 15 | var $searchTitle; 16 | var $searchResultsCount; 17 | var $searchQuery; 18 | 19 | // Throttle search 20 | function throttle(fn, wait) { 21 | var timeout; 22 | 23 | return function() { 24 | var ctx = this, args = arguments; 25 | if (!timeout) { 26 | timeout = setTimeout(function() { 27 | timeout = null; 28 | fn.apply(ctx, args); 29 | }, wait); 30 | } 31 | }; 32 | } 33 | 34 | function displayResults(res) { 35 | $bookSearchResults.addClass('open'); 36 | 37 | var noResults = res.count == 0; 38 | $bookSearchResults.toggleClass('no-results', noResults); 39 | 40 | // Clear old results 41 | $searchList.empty(); 42 | 43 | // Display title for research 44 | $searchResultsCount.text(res.count); 45 | $searchQuery.text(res.query); 46 | 47 | // Create an
').html(content);
65 |
66 | $link.appendTo($title);
67 | $title.appendTo($li);
68 | $content.appendTo($li);
69 | $li.appendTo($searchList);
70 | });
71 | }
72 |
73 | function launchSearch(q) {
74 | // Add class for loading
75 | $body.addClass('with-search');
76 | $body.addClass('search-loading');
77 |
78 | // Launch search query
79 | throttle(gitbook.search.query(q, 0, MAX_RESULTS)
80 | .then(function(results) {
81 | displayResults(results);
82 | })
83 | .always(function() {
84 | $body.removeClass('search-loading');
85 | }), 1000);
86 | }
87 |
88 | function closeSearch() {
89 | $body.removeClass('with-search');
90 | $bookSearchResults.removeClass('open');
91 | }
92 |
93 | function launchSearchFromQueryString() {
94 | var q = getParameterByName('q');
95 | if (q && q.length > 0) {
96 | // Update search input
97 | $searchInput.val(q);
98 |
99 | // Launch search
100 | launchSearch(q);
101 | }
102 | }
103 |
104 | function bindSearch() {
105 | // Bind DOM
106 | $searchInput = $('#book-search-input input');
107 | $bookSearchResults = $('#book-search-results');
108 | $searchList = $bookSearchResults.find('.search-results-list');
109 | $searchTitle = $bookSearchResults.find('.search-results-title');
110 | $searchResultsCount = $searchTitle.find('.search-results-count');
111 | $searchQuery = $searchTitle.find('.search-query');
112 |
113 | // Launch query based on input content
114 | function handleUpdate() {
115 | var q = $searchInput.val();
116 |
117 | if (q.length == 0) {
118 | closeSearch();
119 | }
120 | else {
121 | launchSearch(q);
122 | }
123 | }
124 |
125 | // Detect true content change in search input
126 | // Workaround for IE < 9
127 | var propertyChangeUnbound = false;
128 | $searchInput.on('propertychange', function(e) {
129 | if (e.originalEvent.propertyName == 'value') {
130 | handleUpdate();
131 | }
132 | });
133 |
134 | // HTML5 (IE9 & others)
135 | $searchInput.on('input', function(e) {
136 | // Unbind propertychange event for IE9+
137 | if (!propertyChangeUnbound) {
138 | $(this).unbind('propertychange');
139 | propertyChangeUnbound = true;
140 | }
141 |
142 | handleUpdate();
143 | });
144 |
145 | // Push to history on blur
146 | $searchInput.on('blur', function(e) {
147 | // Update history state
148 | if (usePushState) {
149 | var uri = updateQueryString('q', $(this).val());
150 | history.pushState({ path: uri }, null, uri);
151 | }
152 | });
153 | }
154 |
155 | gitbook.events.on('page.change', function() {
156 | bindSearch();
157 | closeSearch();
158 |
159 | // Launch search based on query parameter
160 | if (gitbook.search.isInitialized()) {
161 | launchSearchFromQueryString();
162 | }
163 | });
164 |
165 | gitbook.events.on('search.ready', function() {
166 | bindSearch();
167 |
168 | // Launch search from query param at start
169 | launchSearchFromQueryString();
170 | });
171 |
172 | function getParameterByName(name) {
173 | var url = window.location.href;
174 | name = name.replace(/[\[\]]/g, '\\$&');
175 | var regex = new RegExp('[?&]' + name + '(=([^]*)|&|#|$)', 'i'),
176 | results = regex.exec(url);
177 | if (!results) return null;
178 | if (!results[2]) return '';
179 | return decodeURIComponent(results[2].replace(/\+/g, ' '));
180 | }
181 |
182 | function updateQueryString(key, value) {
183 | value = encodeURIComponent(value);
184 |
185 | var url = window.location.href;
186 | var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'),
187 | hash;
188 |
189 | if (re.test(url)) {
190 | if (typeof value !== 'undefined' && value !== null)
191 | return url.replace(re, '$1' + key + '=' + value + '$2$3');
192 | else {
193 | hash = url.split('#');
194 | url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
195 | if (typeof hash[1] !== 'undefined' && hash[1] !== null)
196 | url += '#' + hash[1];
197 | return url;
198 | }
199 | }
200 | else {
201 | if (typeof value !== 'undefined' && value !== null) {
202 | var separator = url.indexOf('?') !== -1 ? '&' : '?';
203 | hash = url.split('#');
204 | url = hash[0] + separator + key + '=' + value;
205 | if (typeof hash[1] !== 'undefined' && hash[1] !== null)
206 | url += '#' + hash[1];
207 | return url;
208 | }
209 | else
210 | return url;
211 | }
212 | }
213 | });
214 |
--------------------------------------------------------------------------------
/book/src/_book/gitbook/gitbook-plugin-sharing/buttons.js:
--------------------------------------------------------------------------------
1 | require(['gitbook', 'jquery'], function(gitbook, $) {
2 | var SITES = {
3 | 'facebook': {
4 | 'label': 'Facebook',
5 | 'icon': 'fa fa-facebook',
6 | 'onClick': function(e) {
7 | e.preventDefault();
8 | window.open('http://www.facebook.com/sharer/sharer.php?s=100&p[url]='+encodeURIComponent(location.href));
9 | }
10 | },
11 | 'twitter': {
12 | 'label': 'Twitter',
13 | 'icon': 'fa fa-twitter',
14 | 'onClick': function(e) {
15 | e.preventDefault();
16 | window.open('http://twitter.com/home?status='+encodeURIComponent(document.title+' '+location.href));
17 | }
18 | },
19 | 'google': {
20 | 'label': 'Google+',
21 | 'icon': 'fa fa-google-plus',
22 | 'onClick': function(e) {
23 | e.preventDefault();
24 | window.open('https://plus.google.com/share?url='+encodeURIComponent(location.href));
25 | }
26 | },
27 | 'weibo': {
28 | 'label': 'Weibo',
29 | 'icon': 'fa fa-weibo',
30 | 'onClick': function(e) {
31 | e.preventDefault();
32 | window.open('http://service.weibo.com/share/share.php?content=utf-8&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title));
33 | }
34 | },
35 | 'instapaper': {
36 | 'label': 'Instapaper',
37 | 'icon': 'fa fa-instapaper',
38 | 'onClick': function(e) {
39 | e.preventDefault();
40 | window.open('http://www.instapaper.com/text?u='+encodeURIComponent(location.href));
41 | }
42 | },
43 | 'vk': {
44 | 'label': 'VK',
45 | 'icon': 'fa fa-vk',
46 | 'onClick': function(e) {
47 | e.preventDefault();
48 | window.open('http://vkontakte.ru/share.php?url='+encodeURIComponent(location.href));
49 | }
50 | }
51 | };
52 |
53 |
54 |
55 | gitbook.events.bind('start', function(e, config) {
56 | var opts = config.sharing;
57 |
58 | // Create dropdown menu
59 | var menu = $.map(opts.all, function(id) {
60 | var site = SITES[id];
61 |
62 | return {
63 | text: site.label,
64 | onClick: site.onClick
65 | };
66 | });
67 |
68 | // Create main button with dropdown
69 | if (menu.length > 0) {
70 | gitbook.toolbar.createButton({
71 | icon: 'fa fa-share-alt',
72 | label: 'Share',
73 | position: 'right',
74 | dropdown: [menu]
75 | });
76 | }
77 |
78 | // Direct actions to share
79 | $.each(SITES, function(sideId, site) {
80 | if (!opts[sideId]) return;
81 |
82 | gitbook.toolbar.createButton({
83 | icon: site.icon,
84 | label: site.text,
85 | position: 'right',
86 | onClick: site.onClick
87 | });
88 | });
89 | });
90 | });
91 |
--------------------------------------------------------------------------------
/book/src/_book/gitbook/images/apple-touch-icon-precomposed-152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kubernetes-csi/docs/5041993eaa6e214c22591b8a1168fdc8548b6b38/book/src/_book/gitbook/images/apple-touch-icon-precomposed-152.png
--------------------------------------------------------------------------------
/book/src/_book/gitbook/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kubernetes-csi/docs/5041993eaa6e214c22591b8a1168fdc8548b6b38/book/src/_book/gitbook/images/favicon.ico
--------------------------------------------------------------------------------
/book/src/_book/images/kubelet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kubernetes-csi/docs/5041993eaa6e214c22591b8a1168fdc8548b6b38/book/src/_book/images/kubelet.png
--------------------------------------------------------------------------------
/book/src/_book/images/sidecar-container.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kubernetes-csi/docs/5041993eaa6e214c22591b8a1168fdc8548b6b38/book/src/_book/images/sidecar-container.png
--------------------------------------------------------------------------------
/book/src/api.md:
--------------------------------------------------------------------------------
1 | # API Reference
2 |
3 | The following is the list of CSI APIs:
4 |
5 | * [Volume Snapshot](api/volume-snapshot.md)
6 |
--------------------------------------------------------------------------------
/book/src/changed-block-tracking.md:
--------------------------------------------------------------------------------
1 | # Changed Block Tracking
2 |
3 | ## Status
4 |
5 | Status | Min K8s Version | Max K8s Version | Min CSI Version | Max CSI Version |
6 | -------|-----------------|-----------------|-----------------|-----------------|
7 | Alpha | 1.33 | - | [v1.10.0](https://github.com/container-storage-interface/spec/releases/tag/v1.10.0) | -
8 |
9 |
10 | ## Overview
11 |
12 | This optional feature provides a secure mechanism to obtain metadata
13 | on the allocated blocks of a CSI VolumeSnapshot, or the changed blocks between two arbitrary pairs of CSI VolumeSnapshot objects of the same PersistentVolume.
14 | See [Kubernetes Enhancement Proposal 3314](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3314-csi-changed-block-tracking)
15 | for full details.
16 |
17 | A CSI driver must advertise its support for this feature by specifying the
18 | `SNAPSHOT_METADATA_SERVICE` capability in the response of the
19 | [GetPluginCapabilities](https://github.com/container-storage-interface/spec/blob/master/spec.md#getplugincapabilities)
20 | RPC (part of the
21 | [CSI Identity Service](https://github.com/container-storage-interface/spec/blob/master/spec.md#identity-service-rpc)),
22 | and must implement the
23 | [CSI SnapshotMetadata Service](https://github.com/container-storage-interface/spec/blob/master/spec.md#snapshot-metadata-service-rpcs).
24 |
25 | CSI drivers that implement this feature should deploy the
26 | [external-snapshot-metadata](./external-snapshot-metadata.md)
27 | sidecar and create the associated
28 | [Snapshot Metadata Service CR](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3314-csi-changed-block-tracking#snapshot-metadata-service-custom-resource).
29 |
30 | The `external-snapshot-metadata` sidecar implements the server side of the
31 | [Kubernetes SnapshotMetadata Service API](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3314-csi-changed-block-tracking#the-kubernetes-snapshotmetadata-service-api).
32 | Backup applications obtain VolumeSnapshot metadata directly from the sidecar
33 | through this API, bypassing the Kubernetes API server for the most part.
34 | Backup application developers should refer to the [Usage](external-snapshot-metadata.md#usage)
35 | and [Resources](external-snapshot-metadata.md#resources)
36 | sections of the sidecar documentation for details.
37 |
38 |
--------------------------------------------------------------------------------
/book/src/cluster-driver-registrar.md:
--------------------------------------------------------------------------------
1 | # CSI cluster-driver-registrar
2 |
3 | ## Deprecated
4 |
5 | This sidecar container was not updated since Kubernetes 1.13. As of Kubernetes
6 | 1.16, this side car container is officially deprecated.
7 |
8 | The purpose of this side car container was to automatically register
9 | a _CSIDriver_ object containing information about the driver with Kubernetes.
10 | Without this side car, developers and CSI driver vendors will now have to add
11 | a CSIDriver object in their installation manifest or any tool that installs
12 | their CSI driver.
13 |
14 | Please see [CSIDriver](csi-driver-object.md) for more information.
15 |
16 | ## Status and Releases
17 |
18 | **Git Repository:** [https://github.com/kubernetes-csi/cluster-driver-registrar](https://github.com/kubernetes-csi/cluster-driver-registrar)
19 |
20 | **Status:** Alpha
21 |
22 | Latest stable release | Branch | Compatible with CSI Version | Container Image | Min k8s Version | Max k8s version
23 | --|--|--|--|--|--
24 | [cluster-driver-registrar v1.0.1](https://github.com/kubernetes-csi/cluster-driver-registrar/releases/tag/v1.0.1) | [release-1.0](https://github.com/kubernetes-csi/cluster-driver-registrar/tree/release-1.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | quay.io/k8scsi/csi-cluster-driver-registrar:v1.0.1 | v1.13 | -
25 | [driver-registrar v0.4.2](https://github.com/kubernetes-csi/driver-registrar/releases/tag/v0.4.2) | [release-0.4](https://github.com/kubernetes-csi/driver-registrar/tree/release-0.4) | [v0.3.0](https://github.com/container-storage-interface/spec/releases/tag/v0.3.0) | quay.io/k8scsi/driver-registrar:v0.4.2 | v1.10 | -
26 |
27 | ## Description
28 |
29 | The CSI `cluster-driver-registrar` is a sidecar container that registers a CSI Driver with a Kubernetes cluster by creating a [CSIDriver Object](csi-driver-object.md) which enables the driver to customize how Kubernetes interacts with it.
30 |
31 | ## Usage
32 |
33 | CSI drivers that use one of the following Kubernetes features should use this sidecar container:
34 |
35 | * [Skip Attach](skip-attach.md)
36 | * For drivers that don't support [`ControllerPublishVolume`](https://github.com/container-storage-interface/spec/blob/master/spec.md#controllerpublishvolume), this indicates to Kubernetes to skip the attach operation and eliminates the need to deploy the `external-attacher` sidecar.
37 | * [Pod Info on Mount](pod-info.md)
38 | * This causes Kubernetes to pass metadata such as Pod name and namespace to the `NodePublishVolume` call.
39 |
40 | If you are not using one of these features, this sidecar container (and the creation of the [CSIDriver Object](csi-driver-object.md)) is not required. However, it is still recommended, because the [CSIDriver Object](csi-driver-object.md) makes it easier for users to easily discover the CSI drivers installed on their clusters.
41 |
42 | For detailed information (binary parameters, etc.), see the README of the relevant branch.
43 |
44 | ## Deployment
45 |
46 | The CSI `cluster-driver-registrar` is deployed as a controller. See [deployment section](deploying.md) for more details.
47 |
--------------------------------------------------------------------------------
/book/src/cross-namespace-data-sources.md:
--------------------------------------------------------------------------------
1 | # Cross-namespace storage data sources
2 |
3 | ## Status
4 |
5 | Status | Min K8s Version | Max K8s Version | external-provisioner Version
6 | -------|-----------------|-----------------|-----------------------------
7 | Alpha | 1.26 | - | 3.4.0+
8 |
9 | ## Overview
10 | By default, a `VolumeSnapshot` is a namespace-scoped resource while a `VolumeSnapshotContent` is a cluster-scope resource.
11 | Consequently, you can not restore a snapshot from a different namespace than the source.
12 |
13 | With that feature enabled, you can specify a `namespace` attribute in the [`dataSourceRef`](snapshot-restore-feature.md). Once Kubernetes checks that access is OK, the new PersistentVolume can populate its data from the storage source specified in another
14 | namespace.
15 |
16 | > See the [Kubernetes Enhancement Proposal](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3294-provision-volumes-from-cross-namespace-snapshots)
17 | > for more details on the background, design and discussions.
18 |
19 | ## Usage
20 |
21 | To enable this feature, cluster administrators must:
22 | * Install a CRD for `ReferenceGrants` supplied by the [gateway API project](https://github.com/kubernetes-sigs/gateway-api)
23 | * Enable the `AnyVolumeDataSource` and `CrossNamespaceVolumeDataSource` [feature gates](https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/) for the kube-apiserver and kube-controller-manager
24 | * Install a CRD for the specific `VolumeSnapShot` controller
25 | * Start the CSI Provisioner controller with the argument `--feature-gates=CrossNamespaceVolumeDataSource=true`
26 | * Grant the CSI Provisioner with **get**, **list**, and **watch** permissions for `referencegrants` (API group `gateway.networking.k8s.io`)
27 | * Install the CSI driver
28 |
29 | > For more information about how to use the feature, visit the [Kubernetes blog](https://kubernetes.io/blog/2023/01/02/cross-namespace-data-sources-alpha/) page.
30 |
--------------------------------------------------------------------------------
/book/src/csi-node-object.md:
--------------------------------------------------------------------------------
1 | # CSINode Object
2 |
3 | ## Status
4 |
5 | Status | Min K8s Version | Max K8s Version
6 | --|--|--
7 | Alpha | 1.12 | 1.13
8 | Beta | 1.14 | 1.16
9 | GA | 1.17 | -
10 |
11 |
12 | ## What is the CSINode object?
13 |
14 | CSI drivers generate node specific information. Instead of storing this in the Kubernetes `Node` API Object, a new CSI specific Kubernetes `CSINode` object was created.
15 |
16 | It serves the following purposes:
17 |
18 | 1. Mapping Kubernetes node name to CSI Node name,
19 | * The CSI `GetNodeInfo` call returns the name by which the storage system refers to a node. Kubernetes must use this name in future `ControllerPublishVolume` calls. Therefore, when a new CSI driver is registered, Kubernetes stores the storage system node ID in the `CSINode` object for future reference.
20 | 2. Driver availability
21 | * A way for kubelet to communicate to the kube-controller-manager and kubernetes scheduler whether the driver is available (registered) on the node or not.
22 | 3. Volume topology
23 | * The CSI `GetNodeInfo` call returns a set of keys/values labels identifying the topology of that node. Kubernetes uses this information to do topology-aware provisioning (see [PVC Volume Binding Modes](https://kubernetes.io/docs/concepts/storage/storage-classes/#volume-binding-mode) for more details). It stores the key/values as labels on the Kubernetes node object. In order to recall which `Node` label keys belong to a specific CSI driver, the kubelet stores the keys in the `CSINode` object for future reference.
24 |
25 | ## What fields does the CSINode object have?
26 |
27 | Here is an example of a v1 `CSINode` object:
28 |
29 | ```YAML
30 | apiVersion: storage.k8s.io/v1
31 | kind: CSINode
32 | metadata:
33 | name: node1
34 | spec:
35 | drivers:
36 | - name: mycsidriver.example.com
37 | nodeID: storageNodeID1
38 | topologyKeys: ['mycsidriver.example.com/regions', "mycsidriver.example.com/zones"]
39 | ```
40 |
41 | What the fields mean:
42 |
43 | - `drivers` - list of CSI drivers running on the node and their properties.
44 | - `name` - the CSI driver that this object refers to.
45 | - `nodeID` - the assigned identifier for the node as determined by the driver.
46 | - `topologyKeys` - A list of topology keys assigned to the node as supported by the driver.
47 |
48 | ## What creates the CSINode object?
49 |
50 | CSI drivers do not need to create the `CSINode` object directly. Kubelet manages the object when a CSI driver registers through the kubelet plugin registration mechanism. The [node-driver-registrar](node-driver-registrar.md) sidecar container helps with this registration.
51 |
52 | ## Changes from Alpha to Beta
53 |
54 | ### CRD to Built in Type
55 | The alpha object was called `CSINodeInfo`, whereas the beta object is called
56 | `CSINode`. The alpha `CSINodeInfo` object was also defined as a [Custom Resource Definition](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#create-a-customresourcedefinition) (CRD). As part of the promotion to beta the object has been moved to the built-in Kubernetes API.
57 |
58 | In the move from alpha to beta, the API Group for this object changed from `csi.storage.k8s.io/v1alpha1` to `storage.k8s.io/v1beta1`.
59 |
60 | There is no automatic update of existing CRDs and their CRs during Kubernetes update to the new build-in type.
61 |
62 | ### Enabling CSINodeInfo on Kubernetes
63 | In Kubernetes v1.12 and v1.13, because the feature was alpha, it was disabled by default. To enable the use of `CSINodeInfo` on these versions, do the following:
64 |
65 | 1. Ensure the feature gate is enabled with `--feature-gates=CSINodeInfo=true`
66 | 2. Either ensure the `CSIDriver` CRD is automatically installed via the [Kubernetes Storage CRD addon](https://github.com/kubernetes/kubernetes/tree/release-1.13/cluster/addons/storage-crds) OR manually install the `CSINodeInfo` CRD on the Kubernetes cluster with the following command:
67 |
68 | ```
69 | $> kubectl create -f https://raw.githubusercontent.com/kubernetes/csi-api/master/pkg/crd/manifests/csinodeinfo.yaml
70 | ```
71 | Kubernetes v1.14+, uses the same Kubernetes feature flag, but because the feature is beta, it is enabled by default. And since the API type (as of beta) is built in to the Kubernetes API, installation of the CRD is no longer required.
72 |
--------------------------------------------------------------------------------
/book/src/csi-objects.md:
--------------------------------------------------------------------------------
1 | # CSI objects
2 |
3 | The Kubernetes API contains the following CSI specific objects:
4 |
5 | * [CSIDriver Object](csi-driver-object.md)
6 | * [CSINode Object](csi-node-object.md)
7 |
8 | The schema definition for the objects can be found in the [Kubernetes API reference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#-strong-config-and-storage-apis-strong-)
9 |
--------------------------------------------------------------------------------
/book/src/csi-proxy.md:
--------------------------------------------------------------------------------
1 | # CSI Proxy
2 |
3 | ## Status and Releases
4 |
5 | **Git Repository:** [https://github.com/kubernetes-csi/csi-proxy](https://github.com/kubernetes-csi/csi-proxy)
6 |
7 | **Status:** V1 starting with v1.0.0
8 |
9 | Status | Min K8s Version | Max K8s Version
10 | --|--|--
11 | v0.1.0 | 1.18 | -
12 | v0.2.0+ | 1.18 | -
13 | v1.0.0+ | 1.18 | -
14 |
15 | ## Description
16 |
17 | CSI Proxy is a binary that exposes a set of gRPC APIs around storage operations over named pipes in Windows. A container, such as CSI node plugins, can mount the named pipes depending on operations it wants to exercise on the host and invoke the APIs.
18 |
19 | Each named pipe will support a specific version of an API (e.g. v1alpha1, v2beta1) that targets a specific area of storage (e.g. disk, volume, file, SMB, iSCSI). For example, `\\.\pipe\csi-proxy-filesystem-v1alpha1`, `\\.\pipe\csi-proxy-disk-v1beta1`. Any release of csi-proxy.exe binary will strive to maintain backward compatibility across as many prior stable versions of an API group as possible. Please see details in this [CSI Windows support KEP](https://github.com/kubernetes/enhancements/tree/master/keps/sig-windows/1122-windows-csi-support)
20 |
21 | ## Usage
22 |
23 | Run csi-proxy.exe binary directly on a Windows node. The command line options are:
24 |
25 | * `-kubelet-path`: This is the prefix path of the kubelet directory in the host file system (the default value is set to `C:\var\lib\kubelet`)
26 |
27 | * `-windows-service`: Configure as a Windows Service
28 |
29 | * `-log_file`: If non-empty, use this log file. (Note: must set `logtostdrr`=false if setting -log_file)
30 |
31 |
32 | Note that `-kubelet-pod-path` and `-kubelet-csi-plugins-path` were used in prior 1.0.0 versions, and they are now replaced by new parameter `-kubelet-path`
33 |
34 | For detailed information (binary parameters, etc.), see the README of the relevant branch.
35 |
36 | ## Deployment
37 |
38 | It the responsibility of the Kubernetes distribution or cluster admin to install csi-proxy. Directly run csi-proxy.exe binary or run it as a Windows Service on Kubernetes nodes.
39 | For example,
40 |
41 | ```
42 | $flags = "-windows-service -log_file=\etc\kubernetes\logs\csi-proxy.log -logtostderr=false"
43 | sc.exe create csiproxy binPath= "${env:NODE_DIR}\csi-proxy.exe $flags"
44 | sc.exe failure csiproxy reset= 0 actions= restart/10000
45 | sc.exe start csiproxy
46 | ```
47 |
--------------------------------------------------------------------------------
/book/src/csi-windows.md:
--------------------------------------------------------------------------------
1 | # CSI Windows Support
2 |
3 | ## Status
4 |
5 | Status | Min K8s Version | Min CSI proxy Version | Min Node Driver Registrar Version
6 | --|--|--|--
7 | GA | 1.19 | 1.0.0 | 1.3.0
8 | Beta | 1.19 | 0.2.0 | 1.3.0
9 | Alpha | 1.18 | 0.1.0 | 1.3.0
10 |
11 |
12 | ## Overview
13 |
14 | CSI drivers (e.g. AzureDisk, GCE PD, etc.) are recommended to be deployed as containers. CSI driver’s node plugin typically runs on every worker node in the cluster (as a DaemonSet). Node plugin containers need to run with elevated privileges to perform storage related operations. However, Windows was not supporting privileged containers (Note: privileged containers a.k.a Host process is introduced as alpha feature in Kubernetes 1.22 very recently). To solve this problem, [CSI Proxy](https://github.com/kubernetes-csi/csi-proxy) is a binary that runs on the Windows host and executes a set of privileged storage operations on Windows nodes on behalf of containers in a CSI Node plugin daemonset. This enables multiple CSI Node plugins to execute privileged storage operations on Windows nodes without having to ship a custom privileged operation proxy.
15 |
16 | Please note that CSI controller level operations/sidecars are not supported on Windows.
17 |
18 | ## How to use the CSI Proxy for Windows?
19 | See how to install CSI Proxy in the [Deployment chapter](csi-proxy.md#Deployment).
20 |
21 | For CSI driver authors, import CSI proxy client under github.com/kubernetes-csi/csi-proxy/client. There are six client API groups including disk, filesystem, iscsi, smb, system, volume. See [link](https://github.com/kubernetes-csi/csi-proxy/tree/master/client/groups) for details.
22 | As an example, please check how GCE PD Driver import disk, volume and filesystem client API groups [here](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/blob/release-1.2/pkg/mount-manager/safe-mounter_windows.go#L28)
23 |
24 | The Daemonset specification of a CSI node plugin for Windows can mount the desired named pipes from CSI Proxy based on the version of the API groups that the node-plugin needs to execute.
25 |
26 |
27 | The following Daemonset YAML shows how to mount various API groups from CSI Proxy into a CSI Node plugin:
28 |
29 | ```
30 | kind: DaemonSet
31 | apiVersion: apps/v1
32 | metadata:
33 | name: csi-storage-node-win
34 | spec:
35 | selector:
36 | matchLabels:
37 | app: csi-driver-win
38 | template:
39 | metadata:
40 | labels:
41 | app: csi-driver-win
42 | spec:
43 | serviceAccountName: csi-node-sa
44 | nodeSelector:
45 | kubernetes.io/os: windows
46 | containers:
47 | - name: csi-driver-registrar
48 | image: registry.k8s.io/sig-storage/csi-node-driver-registrar
49 | args:
50 | - "--v=5"
51 | - "--csi-address=unix://C:\\csi\\csi.sock"
52 | - "--kubelet-registration-path=C:\\kubelet\\plugins\\plugin.csi\\csi.sock"
53 | volumeMounts:
54 | - name: plugin-dir
55 | mountPath: C:\csi
56 | - name: registration-dir
57 | mountPath: C:\registration
58 | - name: csi-driver
59 | image: registry.k8s.io/sig-storage/csi-driver:win-v1
60 | args:
61 | - "--v=5"
62 | - "--endpoint=unix:/csi/csi.sock"
63 | volumeMounts:
64 | - name: kubelet-dir
65 | mountPath: C:\var\lib\kubelet
66 | - name: plugin-dir
67 | mountPath: C:\csi
68 | - name: csi-proxy-disk-pipe
69 | mountPath: \\.\pipe\csi-proxy-disk-v1
70 | - name: csi-proxy-volume-pipe
71 | mountPath: \\.\pipe\csi-proxy-volume-v1
72 | - name: csi-proxy-filesystem-pipe
73 | mountPath: \\.\pipe\csi-proxy-filesystem-v1
74 | volumes:
75 | - name: csi-proxy-disk-pipe
76 | hostPath:
77 | path: \\.\pipe\csi-proxy-disk-v1
78 | type: ""
79 | - name: csi-proxy-volume-pipe
80 | hostPath:
81 | path: \\.\pipe\csi-proxy-volume-v1
82 | type: ""
83 | - name: csi-proxy-filesystem-pipe
84 | hostPath:
85 | path: \\.\pipe\csi-proxy-filesystem-v1
86 | type: ""
87 | - name: registration-dir
88 | hostPath:
89 | path: C:\var\lib\kubelet\plugins_registry\
90 | type: Directory
91 | - name: kubelet-dir
92 | hostPath:
93 | path: C:\var\lib\kubelet\
94 | type: Directory
95 | - name: plugin-dir
96 | hostPath:
97 | path: C:\var\lib\kubelet\plugins\csi.org.io\
98 | type: DirectoryOrCreate
99 | ```
100 |
101 |
--------------------------------------------------------------------------------
/book/src/deploying.md:
--------------------------------------------------------------------------------
1 | # Deploying CSI Driver on Kubernetes
2 |
3 | This page describes to CSI driver developers how to deploy their driver onto a Kubernetes cluster.
4 |
5 | ## Overview
6 |
7 | A CSI driver is typically deployed in Kubernetes as two components:
8 | a controller component and a per-node component.
9 |
10 | ### Controller Plugin
11 |
12 | The controller component can be deployed as a Deployment or StatefulSet on
13 | any node in the cluster. It consists of the CSI driver that implements the
14 | CSI Controller service and one or more
15 | [sidecar containers](sidecar-containers.md). These controller
16 | sidecar containers typically interact with Kubernetes objects and make calls
17 | to the driver's CSI Controller service.
18 |
19 | It generally does not need direct access to the host and can perform all its
20 | operations through the Kubernetes API and external control plane services.
21 | Multiple copies of the controller component can be deployed for HA, however
22 | it is recommended to use leader election to ensure there is only one active
23 | controller at a time.
24 |
25 | Controller sidecars include the external-provisioner, external-attacher,
26 | external-snapshotter, and external-resizer. Including a sidecar in the
27 | deployment may be optional. See each sidecar's page for more details.
28 |
29 | #### Communication with Sidecars
30 | [](https://docs.google.com/a/greatdanedata.com/drawings/d/1JExJ_98dt0NAsJ7iI0_9loeTn2rbLeEcpOMEvKrF-9w/edit?usp=sharing)
31 |
32 | Sidecar containers manage Kubernetes events and make the appropriate
33 | calls to the CSI driver. The calls are made by sharing a UNIX domain socket
34 | through an emptyDir volume between the sidecars and CSI Driver.
35 |
36 | #### RBAC Rules
37 |
38 | Most controller sidecars interact with Kubernetes objects and therefore need
39 | to set RBAC policies. Each sidecar repository contains example RBAC
40 | configurations.
41 |
42 | ### Node Plugin
43 |
44 | The node component should be deployed on every node in the cluster through a
45 | DaemonSet. It consists of the CSI driver that implements the CSI Node service and the
46 | [node-driver-registrar](node-driver-registrar) sidecar container.
47 |
48 | #### Communication with Kubelet
49 |
50 | [](https://docs.google.com/a/greatdanedata.com/drawings/d/1NXaVNDh3mSDhog7Q3Y9eELyEF24F8Z-Kk0ujR3pyOes/edit?usp=sharing)
51 |
52 | The Kubernetes kubelet runs on every node and is responsible for making the CSI
53 | Node service calls. These calls mount and unmount the storage volume from the
54 | storage system, making it available to the Pod to consume. Kubelet makes calls
55 | to the CSI driver through a UNIX domain socket shared on the host via a HostPath
56 | volume. There is also a second UNIX domain socket that the node-driver-registrar
57 | uses to register the CSI driver to kubelet.
58 |
59 | #### Driver Volume Mounts
60 | The node plugin needs direct access to the host for making block devices and/or
61 | filesystem mounts available to the Kubernetes kubelet.
62 |
63 | The mount point used by the CSI driver must be set to _Bidirectional_ to allow Kubelet
64 | on the host to see mounts created by the CSI driver container. See the example below:
65 |
66 | ```yaml
67 | containers:
68 | - name: my-csi-driver
69 | ...
70 | volumeMounts:
71 | - name: socket-dir
72 | mountPath: /csi
73 | - name: mountpoint-dir
74 | mountPath: /var/lib/kubelet/pods
75 | mountPropagation: "Bidirectional"
76 | - name: node-driver-registrar
77 | ...
78 | volumeMounts:
79 | - name: registration-dir
80 | mountPath: /registration
81 | volumes:
82 | # This volume is where the socket for kubelet->driver communication is done
83 | - name: socket-dir
84 | hostPath:
85 | path: /var/lib/kubelet/plugins/List of previous versions
20 |
21 | Latest stable release | Branch | Min CSI Version | Max CSI Version | Container Image
22 | --|--|--|--|--
23 | [external-health-monitor-controller v0.10.0](https://github.com/kubernetes-csi/external-health-monitor/releases/tag/v0.10.0) | [release-0.8](https://github.com/kubernetes-csi/external-health-monitor/tree/release-0.8) | [v1.3.0](https://github.com/container-storage-interface/spec/releases/tag/v1.3.0) | - | registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.10.0
24 | [external-health-monitor-controller v0.9.0](https://github.com/kubernetes-csi/external-health-monitor/releases/tag/v0.9.0) | [release-0.8](https://github.com/kubernetes-csi/external-health-monitor/tree/release-0.8) | [v1.3.0](https://github.com/container-storage-interface/spec/releases/tag/v1.3.0) | - | registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.9.0
25 | [external-health-monitor-controller v0.8.0](https://github.com/kubernetes-csi/external-health-monitor/releases/tag/v0.8.0) | [release-0.8](https://github.com/kubernetes-csi/external-health-monitor/tree/release-0.8) | [v1.3.0](https://github.com/container-storage-interface/spec/releases/tag/v1.3.0) | - | registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.8.0
26 | [external-health-monitor-controller v0.7.0](https://github.com/kubernetes-csi/external-health-monitor/releases/tag/v0.7.0) | [release-0.7](https://github.com/kubernetes-csi/external-health-monitor/tree/release-0.7) | [v1.3.0](https://github.com/container-storage-interface/spec/releases/tag/v1.3.0) | - | registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.7.0
27 | [external-health-monitor-controller v0.6.0](https://github.com/kubernetes-csi/external-health-monitor/releases/tag/v0.6.0) | [release-0.6](https://github.com/kubernetes-csi/external-health-monitor/tree/release-0.6) | [v1.3.0](https://github.com/container-storage-interface/spec/releases/tag/v1.3.0) | - | registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.6.0
28 | [external-health-monitor-controller v0.4.0](https://github.com/kubernetes-csi/external-health-monitor/releases/tag/v0.4.0) | [release-0.4](https://github.com/kubernetes-csi/external-health-monitor/tree/release-0.4) | [v1.3.0](https://github.com/container-storage-interface/spec/releases/tag/v1.3.0) | - | registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.4.0
29 | [external-health-monitor-controller v0.3.0](https://github.com/kubernetes-csi/external-health-monitor/releases/tag/v0.3.0) | [release-0.3](https://github.com/kubernetes-csi/external-health-monitor/tree/release-0.3) | [v1.3.0](https://github.com/container-storage-interface/spec/releases/tag/v1.3.0) | - | registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.3.0
30 | [external-health-monitor-controller v0.2.0](https://github.com/kubernetes-csi/external-health-monitor/releases/tag/v0.2.0) | [release-0.2](https://github.com/kubernetes-csi/external-health-monitor/tree/release-0.2) | [v1.3.0](https://github.com/container-storage-interface/spec/releases/tag/v1.3.0) | - | registry.k8s.io/sig-storage/csi-external-health-monitor-controller:v0.2.0
31 |
32 | List of previous versions
22 |
23 | Latest stable release | Branch | Min CSI Version | Max CSI Version | Container Image | [Min K8s Version](project-policies.md#minimum-version) | [Max K8s Version](project-policies.md#maximum-version) | [Recommended K8s Version](project-policies.md#recommended-version) |
24 | --|--|--|--|--|--|--|--
25 | [external-resizer v1.9.0](https://github.com/kubernetes-csi/external-resizer/tree/v1.9.0) | [release-1.9](https://github.com/kubernetes-csi/external-resizer/tree/release-1.8) |[v1.5.0](https://github.com/container-storage-interface/spec/releases/tag/v1.5.0) | - | registry.k8s.io/sig-storage/csi-resizer:v1.9.0 | v1.16 | - | v1.28
26 | [external-resizer v1.8.0](https://github.com/kubernetes-csi/external-resizer/tree/v1.8.0) | [release-1.8](https://github.com/kubernetes-csi/external-resizer/tree/release-1.8) |[v1.5.0](https://github.com/container-storage-interface/spec/releases/tag/v1.5.0) | - | registry.k8s.io/sig-storage/csi-resizer:v1.8.0 | v1.16 | - | v1.23
27 | [external-resizer v1.7.0](https://github.com/kubernetes-csi/external-resizer/tree/v1.7.0) | [release-1.7](https://github.com/kubernetes-csi/external-resizer/tree/release-1.7) |[v1.5.0](https://github.com/container-storage-interface/spec/releases/tag/v1.5.0) | - | registry.k8s.io/sig-storage/csi-resizer:v1.7.0 | v1.16 | - | v1.23
28 | [external-resizer v1.6.0](https://github.com/kubernetes-csi/external-resizer/tree/v1.6.0) | [release-1.6](https://github.com/kubernetes-csi/external-resizer/tree/release-1.6) |[v1.5.0](https://github.com/container-storage-interface/spec/releases/tag/v1.5.0) | - | registry.k8s.io/sig-storage/csi-resizer:v1.6.0 | v1.16 | - | v1.23
29 | [external-resizer v1.5.0](https://github.com/kubernetes-csi/external-resizer/tree/v1.5.0) | [release-1.5](https://github.com/kubernetes-csi/external-resizer/tree/release-1.5) |[v1.5.0](https://github.com/container-storage-interface/spec/releases/tag/v1.5.0) | - | registry.k8s.io/sig-storage/csi-resizer:v1.5.0 | v1.16 | - | v1.23
30 | [external-resizer v1.4.0](https://github.com/kubernetes-csi/external-resizer/tree/v1.4.0) | [release-1.4](https://github.com/kubernetes-csi/external-resizer/tree/release-1.4) |[v1.5.0](https://github.com/container-storage-interface/spec/releases/tag/v1.5.0) | - | registry.k8s.io/sig-storage/csi-resizer:v1.4.0 | v1.16 | - | v1.23
31 | [external-resizer v1.3.0](https://github.com/kubernetes-csi/external-resizer/tree/v1.3.0) | [release-1.3](https://github.com/kubernetes-csi/external-resizer/tree/release-1.3) |[v1.5.0](https://github.com/container-storage-interface/spec/releases/tag/v1.5.0) | - | registry.k8s.io/sig-storage/csi-resizer:v1.3.0 | v1.16 | - | v1.22
32 | [external-resizer v1.2.0](https://github.com/kubernetes-csi/external-resizer/tree/v1.2.0) | [release-1.2](https://github.com/kubernetes-csi/external-resizer/tree/release-1.2) |[v1.2.0](https://github.com/container-storage-interface/spec/releases/tag/v1.2.0) | - | registry.k8s.io/sig-storage/csi-resizer:v1.2.0 | v1.16 | - | v1.21
33 | [external-resizer v1.1.0](https://github.com/kubernetes-csi/external-resizer/tree/v1.1.0) | [release-1.1](https://github.com/kubernetes-csi/external-resizer/tree/release-1.1) |[v1.2.0](https://github.com/container-storage-interface/spec/releases/tag/v1.2.0) | - | registry.k8s.io/sig-storage/csi-resizer:v1.1.0 | v1.16 | - | v1.16
34 | [external-resizer v0.5.0](https://github.com/kubernetes-csi/external-resizer/tree/v0.5.0) | [release-0.5](https://github.com/kubernetes-csi/external-resizer/tree/release-0.5) |[v1.2.0](https://github.com/container-storage-interface/spec/releases/tag/v1.2.0) | - | quay.io/k8scsi/csi-resizer:v0.5.0 | v1.15 | - | v1.16
35 | [external-resizer v0.2.0](https://github.com/kubernetes-csi/external-resizer/tree/v0.2.0) | [release-0.2](https://github.com/kubernetes-csi/external-resizer/tree/release-0.2) |[v1.1.0](https://github.com/container-storage-interface/spec/releases/tag/v1.1.0) | - | quay.io/k8scsi/csi-resizer:v0.2.0 | v1.15 | - | v1.15
36 | [external-resizer v0.1.0](https://github.com/kubernetes-csi/external-resizer/tree/v0.1.0) | [release-0.1](https://github.com/kubernetes-csi/external-resizer/tree/release-0.1) |[v1.1.0](https://github.com/container-storage-interface/spec/releases/tag/v1.1.0) | - | quay.io/k8scsi/csi-resizer:v0.1.0 | v1.14 | v1.14 | v1.14
37 | [external-resizer v1.0.1](https://github.com/kubernetes-csi/external-resizer/tree/v1.0.1) | [release-1.0](https://github.com/kubernetes-csi/external-resizer/tree/release-1.0) |[v1.2.0](https://github.com/container-storage-interface/spec/releases/tag/v1.2.0) | - | quay.io/k8scsi/csi-resizer:v1.0.1 | v1.16 | - | v1.16
38 |
39 | List of previous versions
24 |
25 | Latest stable release | Branch | Min CSI Version | Max CSI Version | Container Image | [Min K8s Version](project-policies.md#minimum-version) | [Max K8s Version](project-policies.md#maximum-version) |
26 | --|--|--|--|--|--|--
27 | [livenessprobe v2.12.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.12.0) | [release-2.12](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.12) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.12.0 | v1.13 | -
28 | [livenessprobe v2.11.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.11.0) | [release-2.11](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.11) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.11.0 | v1.13 | -
29 | [livenessprobe v2.10.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.10.0) | [release-2.10](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.10) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.10.0 | v1.13 | -
30 | [livenessprobe v2.9.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.9.0) | [release-2.9](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.9) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.9.0 | v1.13 | -
31 | [livenessprobe v2.8.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.8.0) | [release-2.8](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.8) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.8.0 | v1.13 | -
32 | [livenessprobe v2.7.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.7.0) | [release-2.7](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.7) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.7.0 | v1.13 | -
33 | [livenessprobe v2.6.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.6.0) | [release-2.6](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.6) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.6.0 | v1.13 | -
34 | [livenessprobe v2.5.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.5.0) | [release-2.5](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.5) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.5.0 | v1.13 | -
35 | [livenessprobe v2.4.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.4.0) | [release-2.4](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.4) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.4.0 | v1.13 | -
36 | [livenessprobe v2.3.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.3.0) | [release-2.3](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.3) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.3.0 | v1.13 | -
37 | [livenessprobe v2.2.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.2.0) | [release-2.2](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.2) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.2.0 | v1.13 | -
38 | [livenessprobe v2.1.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.1.0) | [release-2.1](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.1) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| registry.k8s.io/sig-storage/livenessprobe:v2.1.0 | v1.13 | -
39 | [livenessprobe v2.0.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v2.0.0) | [release-2.0](https://github.com/kubernetes-csi/livenessprobe/tree/release-2.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) |-| quay.io/k8scsi/livenessprobe:v2.0.0 | v1.13 | -
40 | [livenessprobe v1.1.0](https://github.com/kubernetes-csi/livenessprobe/releases/tag/v1.1.0) | [release-1.1](https://github.com/kubernetes-csi/livenessprobe/tree/release-1.1) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | -|quay.io/k8scsi/livenessprobe:v1.1.0 | v1.13 | -
41 | Unsupported. | No 0.x branch. | [v0.3.0](https://github.com/container-storage-interface/spec/releases/tag/v0.3.0) |[v0.3.0](https://github.com/container-storage-interface/spec/releases/tag/v0.3.0)| quay.io/k8scsi/livenessprobe:v0.4.1 | v1.10 | v1.16
42 |
43 | List of previous versions
22 |
23 | Latest stable release | Branch | Min CSI Version | Max CSI Version | Container Image | [Min K8s Version](project-policies.md#minimum-version) | [Max K8s Version](project-policies.md#maximum-version) | [Recommended K8s Version](project-policies.md#recommended-version) |
24 | --|--|--|--|--|--|--|--
25 | [node-driver-registrar v2.9.0](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v2.9.0) | [release-2.8](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-2.9) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.9.0 | v1.13 | - | 1.25
26 | [node-driver-registrar v2.8.0](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v2.8.0) | [release-2.8](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-2.8) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.8.0 | v1.13 | -
27 | [node-driver-registrar v2.7.0](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v2.7.0) | [release-2.7](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-2.7) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.7.0 | v1.13 | -
28 | [node-driver-registrar v2.6.3](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v2.6.3) | [release-2.6](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-2.6) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.6.3 | v1.13 | -
29 | [node-driver-registrar v2.5.1](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v2.5.1) | [release-2.5](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-2.5) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.5.1 | v1.13 | -
30 | [node-driver-registrar v2.4.0](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v2.4.0) | [release-2.4](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-2.4) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.4.0 | v1.13 | -
31 | [node-driver-registrar v2.3.0](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v2.3.0) | [release-2.3](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-2.3) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.3.0 | v1.13 | -
32 | [node-driver-registrar v2.2.0](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v2.2.0) | [release-2.2](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-2.2) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.2.0 | v1.13 | -
33 | [node-driver-registrar v2.1.0](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v2.1.0) | [release-2.1](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-2.1) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.1.0 | v1.13 | -
34 | [node-driver-registrar v2.0.0](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v2.0.0) | [release-2.0](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-2.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.0.0 | v1.13 | -
35 | [node-driver-registrar v1.2.0](https://github.com/kubernetes-csi/node-driver-registrar/releases/tag/v1.2.0) | [release-1.2](https://github.com/kubernetes-csi/node-driver-registrar/tree/release-1.2) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | quay.io/k8scsi/csi-node-driver-registrar:v1.2.0 | v1.13 | -
36 | [driver-registrar v0.4.2](https://github.com/kubernetes-csi/driver-registrar/releases/tag/v0.4.2) | [release-0.4](https://github.com/kubernetes-csi/driver-registrar/tree/release-0.4) | [v0.3.0](https://github.com/container-storage-interface/spec/releases/tag/v0.3.0) | [v0.3.0](https://github.com/container-storage-interface/spec/releases/tag/v0.3.0) | quay.io/k8scsi/driver-registrar:v0.4.2 | v1.10 | v1.16
37 |
38 | List of previous versions
23 |
24 | Latest stable release | Branch | Min CSI Version | Max CSI Version | Container Image | [Min K8s Version](project-policies.md#minimum-version) | [Max K8s Version](project-policies.md#maximum-version) | [Recommended K8s Version](project-policies.md#recommended-version)
25 | --|--|--|--|--|--|--|--
26 | [external-snapshotter v6.3.0](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v6.3.0) | [release-6.2](https://github.com/kubernetes-csi/external-snapshotter/tree/release-6.3) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-controller:v6.2.1 | v1.20 | - | v1.24
27 | [external-snapshotter v6.2.2](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v6.2.2) | [release-6.2](https://github.com/kubernetes-csi/external-snapshotter/tree/release-6.2) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-controller:v6.2.1 | v1.20 | - | v1.24
28 | [external-snapshotter v6.1.0](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v6.1.0) | [release-6.1](https://github.com/kubernetes-csi/external-snapshotter/tree/release-6.1) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-controller:v6.1.0 | v1.20 | - | v1.24
29 | [external-snapshotter v6.0.1](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v6.0.1) | [release-6.0](https://github.com/kubernetes-csi/external-snapshotter/tree/release-6.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-controller:v6.0.1 | v1.20 | - | v1.24
30 | [external-snapshotter v5.0.1](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v5.0.1) | [release-5.0](https://github.com/kubernetes-csi/external-snapshotter/tree/release-5.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-controller:v5.0.1 | v1.20 | - | v1.22
31 | [external-snapshotter v4.2.1](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v4.2.1) | [release-4.2](https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.2) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-controller:v4.2.1 | v1.20 | - | v1.22
32 | [external-snapshotter v4.1.1](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v4.1.1) | [release-4.1](https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.1) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-controller:v4.1.1 | v1.20 | - | v1.20
33 | [external-snapshotter v4.0.1](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v4.0.1) | [release-4.0](https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-controller:v4.0.1 | v1.20 | - | v1.20
34 | [external-snapshotter v3.0.3 (beta)](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v3.0.3) | [release-3.0](https://github.com/kubernetes-csi/external-snapshotter/tree/release-3.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-controller:v3.0.3 | v1.17 | - | v1.17
35 | [external-snapshotter v2.1.4 (beta)](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v2.1.4) | [release-2.1](https://github.com/kubernetes-csi/external-snapshotter/tree/release-2.1) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-controller:v2.1.4 | v1.17 | - | v1.17
36 |
37 | List of previous versions
25 |
26 | Latest stable release | Branch | Min CSI Version | Max CSI Version | Container Image | [Min K8s Version](project-policies.md#minimum-version) | [Max K8s Version](project-policies.md#maximum-version) | [Recommended K8s Version](project-policies.md#recommended-version)
27 | --|--|--|--|--|--|--|--
28 | [external-snapshotter v6.3.0](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v6.3.0) | [release-6.2](https://github.com/kubernetes-csi/external-snapshotter/tree/release-6.3) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/napshot-validation-webhook:v6.2.1 | v1.20 | - | v1.24
29 | [external-snapshotter v6.2.2](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v6.2.2) | [release-6.2](https://github.com/kubernetes-csi/external-snapshotter/tree/release-6.2) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/napshot-validation-webhook:v6.2.1 | v1.20 | - | v1.24
30 | [external-snapshotter v6.1.0](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v6.1.0) | [release-6.1](https://github.com/kubernetes-csi/external-snapshotter/tree/release-6.1) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/napshot-validation-webhookr:v6.1.0 | v1.20 | - | v1.24
31 | [snapshot-validation-webhook v6.0.1](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v6.0.1) | [release-6.0](https://github.com/kubernetes-csi/external-snapshotter/tree/release-6.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-validation-webhook:v6.0.1 | v1.20 | - | v1.24
32 | [snapshot-validation-webhook v5.0.1](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v5.0.1) | [release-5.0](https://github.com/kubernetes-csi/external-snapshotter/tree/release-5.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-validation-webhook:v5.0.1 | v1.20 | - | v1.22
33 | [snapshot-validation-webhook v4.2.1](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v4.2.1) | [release-4.2](https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.2) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-validation-webhook:v4.2.1 | v1.20 | - | v1.22
34 | [snapshot-validation-webhook v4.1.1](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v4.1.1) | [release-4.1](https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.1) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-validation-webhook:v4.1.0 | v1.20 | - | v1.20
35 | [snapshot-validation-webhook v4.0.1](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v4.0.1) | [release-4.0](https://github.com/kubernetes-csi/external-snapshotter/tree/release-4.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-validation-webhook:v4.0.1 | v1.20 | - | v1.20
36 | [snapshot-validation-webhook v3.0.3](https://github.com/kubernetes-csi/external-snapshotter/releases/tag/v3.0.3) | [release-3.0](https://github.com/kubernetes-csi/external-snapshotter/tree/release-3.0) | [v1.0.0](https://github.com/container-storage-interface/spec/releases/tag/v1.0.0) | - | registry.k8s.io/sig-storage/snapshot-validation-webhook:v3.0.3 | v1.17 | - | v1.17
37 |
38 |