{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/43197395","id":43197395,"diff_hunk":"@@ -0,0 +1,157 @@\n+<!-- BEGIN MUNGE: UNVERSIONED_WARNING -->\n+\n+<!-- BEGIN STRIP_FOR_RELEASE -->\n+\n+<img src=\"http://kubernetes.io/img/warning.png\" alt=\"WARNING\"\n+     width=\"25\" height=\"25\">\n+<img src=\"http://kubernetes.io/img/warning.png\" alt=\"WARNING\"\n+     width=\"25\" height=\"25\">\n+<img src=\"http://kubernetes.io/img/warning.png\" alt=\"WARNING\"\n+     width=\"25\" height=\"25\">\n+<img src=\"http://kubernetes.io/img/warning.png\" alt=\"WARNING\"\n+     width=\"25\" height=\"25\">\n+<img src=\"http://kubernetes.io/img/warning.png\" alt=\"WARNING\"\n+     width=\"25\" height=\"25\">\n+\n+<h2>PLEASE NOTE: This document applies to the HEAD of the source tree</h2>\n+\n+If you are using a released version of Kubernetes, you should\n+refer to the docs that go with that version.\n+\n+<strong>\n+The latest 1.0.x release of this document can be found\n+[here](http://releases.k8s.io/release-1.0/docs/proposals/nodesets.md).\n+\n+Documentation for other releases can be found at\n+[releases.k8s.io](http://releases.k8s.io).\n+</strong>\n+--\n+\n+<!-- END STRIP_FOR_RELEASE -->\n+\n+<!-- END MUNGE: UNVERSIONED_WARNING -->\n+\n+# NodeSets in Kubernetes\n+\n+**Author**: Justin Santa Barbara\n+\n+**Status**: Proposal.\n+\n+This document presents the design of the Kubernetes NodeSet, describes use cases, and gives an overview of the code.\n+\n+## Motivation\n+\n+The official bring-up procedure for a kubernetes cluster is to use kube-up.  This is a pretty complicated bash script\n+that is largely separate for each provider.  It offers limited functionality: you cannot change the number of nodes\n+directly, nor change the instance type used.  Many people resort to alternative methods of installation,\n+to varying degrees of success.\n+\n+NodeSets put node launching under the control of the master.  They allow the operator to create\n+and destroy NodeSets dynamically, or to change the number of instances in a NodeSet.  They\n+allow for easier upgrades by launching nodes with different OS/k8s versions.\n+\n+This simplifies the Kubernetes installation, because the primary requirement is simply to launch a master.  Then\n+the installation script can either automatically create a NodeSet, or leave this up to the operator post-creation.\n+\n+## Use Cases\n+\n+### Resize number of Nodes through the API\n+\n+By updating the count on a NodeSet, nodes can be launched or destroyed.  Users will no longer have\n+to go to the underlying cloud API.  Kubernetes can likely make better decisions about which instance to\n+terminate than a cloud-implemented auto-scaling group can, because it is more aware of the workloads.\n+\n+### Consistent auto-scaling across providers\n+\n+In future we can add auto-scaling functionality at the Kubernetes level (instead of at the cloud level), so\n+that it works consistently across clouds, and can be based on Kubernetes metrics instead of cloud-metrics\n+(i.e. it can take account of pods _not_ scheduled).\n+\n+### Support multiple NodeSets of different instance types\n+\n+Users may want to run instances of different types in the same cluster, permanently or transiently.","path":"docs/proposals/nodesets.md","position":72,"original_position":72,"commit_id":"3334b87b2b8695cc5c055ffa5be12ff22a63556b","original_commit_id":"3334b87b2b8695cc5c055ffa5be12ff22a63556b","user":{"login":"bgrant0607","id":7725777,"avatar_url":"https://avatars.githubusercontent.com/u/7725777?v=3","gravatar_id":"","url":"https://api.github.com/users/bgrant0607","html_url":"https://github.com/bgrant0607","followers_url":"https://api.github.com/users/bgrant0607/followers","following_url":"https://api.github.com/users/bgrant0607/following{/other_user}","gists_url":"https://api.github.com/users/bgrant0607/gists{/gist_id}","starred_url":"https://api.github.com/users/bgrant0607/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bgrant0607/subscriptions","organizations_url":"https://api.github.com/users/bgrant0607/orgs","repos_url":"https://api.github.com/users/bgrant0607/repos","events_url":"https://api.github.com/users/bgrant0607/events{/privacy}","received_events_url":"https://api.github.com/users/bgrant0607/received_events","type":"User","site_admin":false},"body":"Support for heterogeneous clusters is a requirement.","created_at":"2015-10-27T22:34:27Z","updated_at":"2015-10-27T22:34:27Z","html_url":"https://github.com/kubernetes/kubernetes/pull/16199#discussion_r43197395","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16199","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/43197395"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/16199#discussion_r43197395"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16199"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16199","id":48635927,"html_url":"https://github.com/kubernetes/kubernetes/pull/16199","diff_url":"https://github.com/kubernetes/kubernetes/pull/16199.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/16199.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/16199","number":16199,"state":"open","locked":false,"title":"Proposal: NodeSets for API-driven node management","user":{"login":"justinsb","id":100893,"avatar_url":"https://avatars.githubusercontent.com/u/100893?v=3","gravatar_id":"","url":"https://api.github.com/users/justinsb","html_url":"https://github.com/justinsb","followers_url":"https://api.github.com/users/justinsb/followers","following_url":"https://api.github.com/users/justinsb/following{/other_user}","gists_url":"https://api.github.com/users/justinsb/gists{/gist_id}","starred_url":"https://api.github.com/users/justinsb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justinsb/subscriptions","organizations_url":"https://api.github.com/users/justinsb/orgs","repos_url":"https://api.github.com/users/justinsb/repos","events_url":"https://api.github.com/users/justinsb/events{/privacy}","received_events_url":"https://api.github.com/users/justinsb/received_events","type":"User","site_admin":false},"body":"This proposal suggests implementing (as an experimental API extension)\r\nNodeSets, which will allow management of Nodes through the API.\r\n\r\nFor example, by creating a NodeSet with count=4, a MIG on GCE will be\r\ncreated with 4 instances, and these nodes will join the cluster.\r\n\r\nBy changing the size to count=5, the MIG will be resized to 5, and the\r\nnew node will join the cluster.  Similarly resizing down.\r\n\r\nWhen the NodeSet is deleted, the MIG will be deleted.\r\n\r\nThe initial implementation will likely be minimal, but in future we can\r\ncoordinate instance evacuation with instance termination, and we can\r\nchoose a 'victim' instance in a Kubernetes aware way rather than relying\r\non the cloud to choose appropriately.\r\n\r\nThis also allows for us (in future) to support auto-scaling in a way\r\nthat is not reliant on the underlying cloud's support for it.","created_at":"2015-10-23T22:11:00Z","updated_at":"2015-10-27T22:34:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"416d5006108487c5f4c586d25f61d8bb40672bcb","assignee":{"login":"bgrant0607","id":7725777,"avatar_url":"https://avatars.githubusercontent.com/u/7725777?v=3","gravatar_id":"","url":"https://api.github.com/users/bgrant0607","html_url":"https://github.com/bgrant0607","followers_url":"https://api.github.com/users/bgrant0607/followers","following_url":"https://api.github.com/users/bgrant0607/following{/other_user}","gists_url":"https://api.github.com/users/bgrant0607/gists{/gist_id}","starred_url":"https://api.github.com/users/bgrant0607/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bgrant0607/subscriptions","organizations_url":"https://api.github.com/users/bgrant0607/orgs","repos_url":"https://api.github.com/users/bgrant0607/repos","events_url":"https://api.github.com/users/bgrant0607/events{/privacy}","received_events_url":"https://api.github.com/users/bgrant0607/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16199/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16199/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/16199/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/3334b87b2b8695cc5c055ffa5be12ff22a63556b","head":{"label":"justinsb:nodesets","ref":"nodesets","sha":"3334b87b2b8695cc5c055ffa5be12ff22a63556b","user":{"login":"justinsb","id":100893,"avatar_url":"https://avatars.githubusercontent.com/u/100893?v=3","gravatar_id":"","url":"https://api.github.com/users/justinsb","html_url":"https://github.com/justinsb","followers_url":"https://api.github.com/users/justinsb/followers","following_url":"https://api.github.com/users/justinsb/following{/other_user}","gists_url":"https://api.github.com/users/justinsb/gists{/gist_id}","starred_url":"https://api.github.com/users/justinsb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justinsb/subscriptions","organizations_url":"https://api.github.com/users/justinsb/orgs","repos_url":"https://api.github.com/users/justinsb/repos","events_url":"https://api.github.com/users/justinsb/events{/privacy}","received_events_url":"https://api.github.com/users/justinsb/received_events","type":"User","site_admin":false},"repo":{"id":26103010,"name":"kubernetes","full_name":"justinsb/kubernetes","owner":{"login":"justinsb","id":100893,"avatar_url":"https://avatars.githubusercontent.com/u/100893?v=3","gravatar_id":"","url":"https://api.github.com/users/justinsb","html_url":"https://github.com/justinsb","followers_url":"https://api.github.com/users/justinsb/followers","following_url":"https://api.github.com/users/justinsb/following{/other_user}","gists_url":"https://api.github.com/users/justinsb/gists{/gist_id}","starred_url":"https://api.github.com/users/justinsb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justinsb/subscriptions","organizations_url":"https://api.github.com/users/justinsb/orgs","repos_url":"https://api.github.com/users/justinsb/repos","events_url":"https://api.github.com/users/justinsb/events{/privacy}","received_events_url":"https://api.github.com/users/justinsb/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/justinsb/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/justinsb/kubernetes","forks_url":"https://api.github.com/repos/justinsb/kubernetes/forks","keys_url":"https://api.github.com/repos/justinsb/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/justinsb/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/justinsb/kubernetes/teams","hooks_url":"https://api.github.com/repos/justinsb/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/justinsb/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/justinsb/kubernetes/events","assignees_url":"https://api.github.com/repos/justinsb/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/justinsb/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/justinsb/kubernetes/tags","blobs_url":"https://api.github.com/repos/justinsb/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/justinsb/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/justinsb/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/justinsb/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/justinsb/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/justinsb/kubernetes/languages","stargazers_url":"https://api.github.com/repos/justinsb/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/justinsb/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/justinsb/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/justinsb/kubernetes/subscription","commits_url":"https://api.github.com/repos/justinsb/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/justinsb/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/justinsb/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/justinsb/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/justinsb/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/justinsb/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/justinsb/kubernetes/merges","archive_url":"https://api.github.com/repos/justinsb/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/justinsb/kubernetes/downloads","issues_url":"https://api.github.com/repos/justinsb/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/justinsb/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/justinsb/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/justinsb/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/justinsb/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/justinsb/kubernetes/releases{/id}","created_at":"2014-11-03T03:53:05Z","updated_at":"2015-02-24T20:55:05Z","pushed_at":"2015-10-27T14:17:16Z","git_url":"git://github.com/justinsb/kubernetes.git","ssh_url":"git@github.com:justinsb/kubernetes.git","clone_url":"https://github.com/justinsb/kubernetes.git","svn_url":"https://github.com/justinsb/kubernetes","homepage":null,"size":131963,"stargazers_count":1,"watchers_count":1,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"f93f77766dd24bdffc4d046df0bc0360978e2f2a","user":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"repo":{"id":20580498,"name":"kubernetes","full_name":"kubernetes/kubernetes","owner":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kubernetes/kubernetes","description":"Container Cluster Manager from Google","fork":false,"url":"https://api.github.com/repos/kubernetes/kubernetes","forks_url":"https://api.github.com/repos/kubernetes/kubernetes/forks","keys_url":"https://api.github.com/repos/kubernetes/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/kubernetes/teams","hooks_url":"https://api.github.com/repos/kubernetes/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/kubernetes/events","assignees_url":"https://api.github.com/repos/kubernetes/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/kubernetes/tags","blobs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/kubernetes/languages","stargazers_url":"https://api.github.com/repos/kubernetes/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/kubernetes/subscription","commits_url":"https://api.github.com/repos/kubernetes/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/kubernetes/merges","archive_url":"https://api.github.com/repos/kubernetes/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/kubernetes/downloads","issues_url":"https://api.github.com/repos/kubernetes/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/kubernetes/releases{/id}","created_at":"2014-06-06T22:56:04Z","updated_at":"2015-10-27T22:27:35Z","pushed_at":"2015-10-27T22:33:32Z","git_url":"git://github.com/kubernetes/kubernetes.git","ssh_url":"git@github.com:kubernetes/kubernetes.git","clone_url":"https://github.com/kubernetes/kubernetes.git","svn_url":"https://github.com/kubernetes/kubernetes","homepage":"http://kubernetes.io","size":515313,"stargazers_count":10901,"watchers_count":10901,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2789,"mirror_url":null,"open_issues_count":2126,"forks":2789,"open_issues":2126,"watchers":10901,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16199"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/16199"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/16199"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/16199/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16199/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/16199/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/3334b87b2b8695cc5c055ffa5be12ff22a63556b"}}}}