{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments/24223096","id":24223096,"diff_hunk":"@@ -0,0 +1,235 @@\n+# Persistent Stores\n+\n+This document proposes a model for managing persistent, cluster-scoped storage for applications requiring long lived data.\n+\n+### tl;dr\n+\n+`PersistentStore` objects contain a VolumeSource with a lifecycle greater than the pods it is used by.  Many types of VolumeSources can be implemented as volume plugins, with each implementing an interface for use within a controller.  A pod with persistence requirements (specifically pod.spec.volumes.volume.persistenceRequirements) is bound to a matching VolumeSource from a pool of available stores.  PersistentStore objects give that VolumeSource longevity.\n+\n+A `PersistentStoreController` manages the creation, attachment, and reclamation of PersistentStore objects for one VolumeSource.  Implementations must be pluggable to support many types of controllers for many types of VolumeSources. The controller can advise the scheduler on host selection, keeping volume rules contained within the provider.  All cloud provider credentials are isolated to the store controller's host.  Every store in the cluster requires a controller to manage the pool (even a pool of 1).\n+\n+`PersistentStoreBinder` watches for pods with persistence requirements and matches the request with what is available in the pool.\n+\n+`PersistenceRequirements` expresses the capabilities and performance attributes of the underlying VolumeSource.  Allow discovery\n+of storage by its capabilities and use those capabilities as pod storage requirements.\n+\n+Kubernetes makes no guarantees at runtime that the underlying storage exists or is available.  High availability is left to the storage provider.\n+\n+## Goals\n+\n+* Allow administrators to describe available storage\n+* Allow pod authors to discover and request persistence for their volumes\n+* Enforce security through access control lists and securing storage to the same namespace as the pod volume\n+* Enforce quotas through admission control\n+* Ensure developers can rely on storage being available without being closely bound to a particular disk, server, network, or storage device.\n+\n+\n+#### Allow admins to describe and create available storage\n+\n+Admins can describe storage using a `PersistentStoreController` for each type of VolumeSource being managed or create storage directly by using the `PersistentStore` API.  Storage created manually still requires a PersistentStoreController and accompanying interface to allow management by the cluster.\n+\n+\n+```\n+\t\n+\tPersistentStore\n+\t\tTypeMeta\n+\t\tObjectMeta\n+\t\t\tName - internal name\n+\t\t\tLabels - labeled like Volume.PersistenceRequirements.Selector\n+\t\tSpec\n+\t\t\tVolumeSource -- will be backed by one of these:\n+\t\t\t\tHostPath (for a local disk implementation of storage)","path":"docs/design/persistent-storage.md","position":41,"original_position":41,"commit_id":"d6b2058846e66c9d5755a629682b7a8cb54e0e25","original_commit_id":"d6b2058846e66c9d5755a629682b7a8cb54e0e25","user":{"login":"thockin","id":5595220,"avatar_url":"https://avatars.githubusercontent.com/u/5595220?v=3","gravatar_id":"","url":"https://api.github.com/users/thockin","html_url":"https://github.com/thockin","followers_url":"https://api.github.com/users/thockin/followers","following_url":"https://api.github.com/users/thockin/following{/other_user}","gists_url":"https://api.github.com/users/thockin/gists{/gist_id}","starred_url":"https://api.github.com/users/thockin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thockin/subscriptions","organizations_url":"https://api.github.com/users/thockin/orgs","repos_url":"https://api.github.com/users/thockin/repos","events_url":"https://api.github.com/users/thockin/events{/privacy}","received_events_url":"https://api.github.com/users/thockin/received_events","type":"User","site_admin":false},"body":"I think you might get less debate if you omit any concrete local-storage plans from this. :)","created_at":"2015-02-06T05:16:14Z","updated_at":"2015-02-06T05:16:14Z","html_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/4055#discussion_r24223096","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/4055","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments/24223096"},"html":{"href":"https://github.com/GoogleCloudPlatform/kubernetes/pull/4055#discussion_r24223096"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/4055"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/4055","id":28556617,"html_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/4055","diff_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/4055.diff","patch_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/4055.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/4055","number":4055,"state":"open","locked":false,"title":"[Proposal] Persistent Storage","user":{"login":"markturansky","id":8001968,"avatar_url":"https://avatars.githubusercontent.com/u/8001968?v=3","gravatar_id":"","url":"https://api.github.com/users/markturansky","html_url":"https://github.com/markturansky","followers_url":"https://api.github.com/users/markturansky/followers","following_url":"https://api.github.com/users/markturansky/following{/other_user}","gists_url":"https://api.github.com/users/markturansky/gists{/gist_id}","starred_url":"https://api.github.com/users/markturansky/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markturansky/subscriptions","organizations_url":"https://api.github.com/users/markturansky/orgs","repos_url":"https://api.github.com/users/markturansky/repos","events_url":"https://api.github.com/users/markturansky/events{/privacy}","received_events_url":"https://api.github.com/users/markturansky/received_events","type":"User","site_admin":false},"body":"Continuing the conversation from #3318 ...\r\n\r\n@bgrant0607 Based on your feedback, I arrived at another design with just a single new top level object.  All of the concepts you addressed in your comments are to be found in the new design.  Quite a bit more is expressed in fewer moving parts.  \r\n\r\n@thockin I think several of your questions and concerns from #3318 are addressed by the redesign.\r\n\r\nOverall, fewer moving pieces in this design, a complete story of volume re-use from a pod to replController, a way to create and replenish available storage, and expansions of volumes in @thockin's new framework.\r\n\r\nYour feedback is appreciated!\r\n\r\n/cc @smarterclayton ","created_at":"2015-02-03T14:37:00Z","updated_at":"2015-02-06T05:16:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"554fe5d1571befcb5c869d7f246b76aa6ff98036","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/4055/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/4055/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments/{number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/4055/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/statuses/d6b2058846e66c9d5755a629682b7a8cb54e0e25","head":{"label":"markturansky:persistent_storage","ref":"persistent_storage","sha":"d6b2058846e66c9d5755a629682b7a8cb54e0e25","user":{"login":"markturansky","id":8001968,"avatar_url":"https://avatars.githubusercontent.com/u/8001968?v=3","gravatar_id":"","url":"https://api.github.com/users/markturansky","html_url":"https://github.com/markturansky","followers_url":"https://api.github.com/users/markturansky/followers","following_url":"https://api.github.com/users/markturansky/following{/other_user}","gists_url":"https://api.github.com/users/markturansky/gists{/gist_id}","starred_url":"https://api.github.com/users/markturansky/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markturansky/subscriptions","organizations_url":"https://api.github.com/users/markturansky/orgs","repos_url":"https://api.github.com/users/markturansky/repos","events_url":"https://api.github.com/users/markturansky/events{/privacy}","received_events_url":"https://api.github.com/users/markturansky/received_events","type":"User","site_admin":false},"repo":{"id":24423869,"name":"kubernetes","full_name":"markturansky/kubernetes","owner":{"login":"markturansky","id":8001968,"avatar_url":"https://avatars.githubusercontent.com/u/8001968?v=3","gravatar_id":"","url":"https://api.github.com/users/markturansky","html_url":"https://github.com/markturansky","followers_url":"https://api.github.com/users/markturansky/followers","following_url":"https://api.github.com/users/markturansky/following{/other_user}","gists_url":"https://api.github.com/users/markturansky/gists{/gist_id}","starred_url":"https://api.github.com/users/markturansky/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markturansky/subscriptions","organizations_url":"https://api.github.com/users/markturansky/orgs","repos_url":"https://api.github.com/users/markturansky/repos","events_url":"https://api.github.com/users/markturansky/events{/privacy}","received_events_url":"https://api.github.com/users/markturansky/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/markturansky/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/markturansky/kubernetes","forks_url":"https://api.github.com/repos/markturansky/kubernetes/forks","keys_url":"https://api.github.com/repos/markturansky/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/markturansky/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/markturansky/kubernetes/teams","hooks_url":"https://api.github.com/repos/markturansky/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/markturansky/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/markturansky/kubernetes/events","assignees_url":"https://api.github.com/repos/markturansky/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/markturansky/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/markturansky/kubernetes/tags","blobs_url":"https://api.github.com/repos/markturansky/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/markturansky/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/markturansky/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/markturansky/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/markturansky/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/markturansky/kubernetes/languages","stargazers_url":"https://api.github.com/repos/markturansky/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/markturansky/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/markturansky/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/markturansky/kubernetes/subscription","commits_url":"https://api.github.com/repos/markturansky/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/markturansky/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/markturansky/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/markturansky/kubernetes/issues/comments/{number}","contents_url":"https://api.github.com/repos/markturansky/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/markturansky/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/markturansky/kubernetes/merges","archive_url":"https://api.github.com/repos/markturansky/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/markturansky/kubernetes/downloads","issues_url":"https://api.github.com/repos/markturansky/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/markturansky/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/markturansky/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/markturansky/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/markturansky/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/markturansky/kubernetes/releases{/id}","created_at":"2014-09-24T16:55:04Z","updated_at":"2015-02-06T02:47:47Z","pushed_at":"2015-02-06T02:49:26Z","git_url":"git://github.com/markturansky/kubernetes.git","ssh_url":"git@github.com:markturansky/kubernetes.git","clone_url":"https://github.com/markturansky/kubernetes.git","svn_url":"https://github.com/markturansky/kubernetes","homepage":null,"size":30771,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2,"mirror_url":null,"open_issues_count":0,"forks":2,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"GoogleCloudPlatform:master","ref":"master","sha":"7f5ed541f794348ae6279414cf70523a4d5133cc","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":20580498,"name":"kubernetes","full_name":"GoogleCloudPlatform/kubernetes","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/kubernetes","description":"Container Cluster Manager","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/comments/{number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/releases{/id}","created_at":"2014-06-06T22:56:04Z","updated_at":"2015-02-06T02:43:33Z","pushed_at":"2015-02-06T02:43:32Z","git_url":"git://github.com/GoogleCloudPlatform/kubernetes.git","ssh_url":"git@github.com:GoogleCloudPlatform/kubernetes.git","clone_url":"https://github.com/GoogleCloudPlatform/kubernetes.git","svn_url":"https://github.com/GoogleCloudPlatform/kubernetes","homepage":"http://kubernetes.io","size":71242,"stargazers_count":6093,"watchers_count":6093,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1042,"mirror_url":null,"open_issues_count":664,"forks":1042,"open_issues":664,"watchers":6093,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/4055"},"html":{"href":"https://github.com/GoogleCloudPlatform/kubernetes/pull/4055"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/4055"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/4055/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/4055/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/4055/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/statuses/d6b2058846e66c9d5755a629682b7a8cb54e0e25"}}}}