{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/49409124","id":49409124,"diff_hunk":"@@ -0,0 +1,189 @@\n+# Kubernetes/Ubernetes Control Plane Resilience\n+##  Long Term Design and Current Status\n+###by Quinton Hoole, Mike Danese and Justin Santa-Barbara  \n+###December 14, 2015\n+\n+## Summary\n+\n+Some amount of confusion exists around how we currently, and in future\n+want to ensure resilience of the Kubernetes (and by implication\n+Ubernetes) control plane.  This document is an attempt to capture that\n+definitively. It covers areas including self-healing, high\n+availability, bootstrapping and recovery.  Most of the information in\n+this document already exists in the form of github comments,\n+PR's/proposals, scattered documents, and corridor conversations, so\n+document is primarily a consolidation and clarification of existing\n+ideas.\n+\n+## Terms\n+\n+* **Self-healing:** automatically restarting or replacing failed\n+  processes and machines without human intervention\n+* **High availability:** continuing to be available and work correctly\n+  even if some components are down or uncontactable\n+* **Bootstrapping**: creating an empty cluster from nothing\n+* **Recovery**: recreating a non-empty cluster after perhaps\n+  catastrophic failure/unavailability/data corruption\n+\n+## Overall Goals\n+\n+1. **Resilience to single failures:** Kubernetes clusters constrained\n+   to single availability zones should be resilient to individual\n+   machine and process failures by being both self-healing and highly\n+   available (within the context of such individual failures).\n+1. **Ubiquitous resilience by default:** The default cluster creation\n+   scripts for (at least) GCE, AWS and basic bare metal should adhere\n+   to the above (self-healing and high availability) by default (with\n+   options available to disable these features to reduce control plane\n+   resource requirements if so required).  It is hoped that other\n+   cloud providers will also follow the above guidelines, but the\n+   above 3 are the primary canonical use cases.\n+1. **Resilience to some correlated failures:** Kubernetes clusters\n+   which span multiple availability zones in a region should by\n+   default be resilient to complete failure of one entire availability\n+   zone (by similarly providing self-healing and high availability in\n+   the default cluster creation scripts as above).\n+1. **Default implementation shared across cloud providers:** The\n+   differences between the default implementations of the above for\n+   GCE, AWS and basic bare metal should be minimized.  This implies\n+   using shared libraries across these providers in the default\n+   scripts in preference to highly customized implementations per\n+   cloud provider.  This is not to say that highly differentiated,\n+   customized per-cloud cluster creation processes (e.g. for GKE on\n+   GCE, or some hosted Kubernetes provider on AWS) are discouraged.\n+   But those fall squarely outside the basic cross-platform OSS\n+   Kubernetes distro.\n+1. **Self-hosting:** Where possible, Kubernetes existing mechanisms\n+   for achieving system resilience (replication controllers, health\n+   checking, service load balancing etc) should be used in preference\n+   to building a separate set of mechanisms to achieve the same thing.\n+   This implies that self hosting (the kubernetes control plan on\n+   kubernetes) is strongly preferred, with the caveat below.\n+1. **Recovery from catastrophic failure:** The ability to quickly and\n+   reliably recover a cluster from catastrophic failure is critical,\n+   and should not be compromised by the above goal to self-host\n+   (i.e. it goes without saying that the cluster should be quickly and\n+   reliably recoverable, even if the cluster control plane is\n+   broken). This implies that such catastrophic failure scenarios\n+   should be carefully thought out, and the subject of regular\n+   continuous integration testing, and disaster recovery exercises.\n+\n+## Relative Priorities\n+\n+1. **Recovery from catastrophic failures:** having a Kubernetes cluster, and all \n+   applications running inside it, disappear forever is the worst failure mode.  \n+    1. In theory a cluster can be recovered by replaying all API calls\n+       that have ever been executed against it, in order, but most\n+       often that state has been lost, and/or is scattered across\n+       multiple client applications or groups. So in general it is\n+       probably infeasible.\n+    1. In theory a cluster can also be recovered to some relatively\n+       recent non-corrupt backup/snapshot of the disk(s) backing the\n+       etcd cluster state.  But we have no default consistent\n+       backup/snapshot, verification or restoration process.  And we\n+       don't routinely test restoration, so even if we did routinely\n+       perform and verify backups, we have no hard evidence that we\n+       can in practise effectively recover from catastrophic cluster\n+       failure or data corruption by restoring from these backups.  So\n+       there's more work to be done here.\n+1. **Self-healing:** Most major cloud providers provide the ability to\n+   easily and automatically replace failed virtual machines within a\n+   small number of minutes (e.g. GCE\n+   [Auto-restart](https://cloud.google.com/compute/docs/instances/setting-instance-scheduling-options#autorestart)\n+   and Managed Instance Groups,\n+   AWS[ Auto-recovery](https://aws.amazon.com/blogs/aws/new-auto-recovery-for-amazon-ec2/)\n+   and [Auto scaling](https://aws.amazon.com/autoscaling/) etc). This\n+   can fairly trivially be used to reduce control-plane down-time due\n+   to machine failure to a small number minutes per failure\n+   (i.e. typically around \"3 nines\" availability), provided that:\n+    1. cluster persistent state (i.e. etcd disks) is either:\n+        1. truely persistent (i.e. remote persistent disks), or \n+        1. reconstructible (e.g. using etcd [dynamic member \n+           addition](https://github.com/coreos/etcd/blob/master/Documentation/runtime-configuration.md#add-a-new-member) \n+           or [backup and \n+           recovery](https://github.com/coreos/etcd/blob/master/Documentation/admin_guide.md#disaster-recovery)). \n+            \n+    1. and boot disks are either:\n+        1. truely persistent (i.e. remote persistent disks), or\n+        1. reconstructible (e.g. using boot-from-snapshot,\n+           boot-from-pre-configured-image or\n+           boot-from-auto-initializing image).\n+1. **High Availability:** This has the potential to increase\n+   availability above the approximately \"3 nines\" level provided by\n+   automated self-healing, but it's somewhat more complex, and\n+   requires additional resources (e.g. redundant API servers and etcd\n+   quorum members).  In environments where cloud-assisted automatic\n+   self-healing might be infeasible (e.g. on-premise bare-metal\n+   deployments), it also gives cluster administrators more time to\n+   respond (e.g.  replace/repair failed machines) without incurring\n+   system downtime.\n+\n+## Design and Status (as of December 2015)\n+\n+<table>\n+<tr>\n+<td>**Control Plane Component**</td>\n+<td>**Resilience Plan**</td>\n+<td>**Current Status**</td>\n+</tr>\n+<tr>\n+<td>**API Server** </td>\n+<td>\n+\n+Multiple stateless, self-hosted, self-healing API servers behind a HA\n+load balancer, built out by the default \"kube-up\" automation on GCE,\n+AWS and basic bare metal (BBM).  Detailed design of self-hosting and\n+related bootstrapping and catastrophic failure recovery will be\n+detailed in a separate design doc.\n+\n+</td>\n+<td>\n+\n+No scripted self-healing or HA on GCE, AWS or basic bare metal\n+currently exists in the OSS distro.  Self-healing and HA can be set up\n+manually by following documented instructions, but this is not\n+currently an automated process, and it is not tested as part of\n+continuous integration.  So it's probably safest to assume that it\n+doesn't actually work in practise.\n+\n+</td>\n+</tr>\n+<tr>\n+<td>**Controller manager**</td>\n+<td>\n+\n+Multiple self-hosted, self healing warm standby stateless controller\n+managers with leader election and automatic failover of API server\n+clients, built out by default \"kube-up\" automation.\n+\n+</td>\n+<td>As above.</td>\n+</tr>\n+<tr>\n+<td>**etcd**</td>\n+<td>\n+\n+Multiple (3-5) etcd quorum members behind a load balancer with session\n+affinity (to prevent clients from being bounced from one to another).\n+Self-healing provided by remotely mounted persistent disks in","path":"docs/design/control-plane-resilience.md","position":168,"original_position":168,"commit_id":"8223c8cc483a6c030bb88178ad8d67cbcab13aee","original_commit_id":"8223c8cc483a6c030bb88178ad8d67cbcab13aee","user":{"login":"quinton-hoole","id":10390785,"avatar_url":"https://avatars.githubusercontent.com/u/10390785?v=3","gravatar_id":"","url":"https://api.github.com/users/quinton-hoole","html_url":"https://github.com/quinton-hoole","followers_url":"https://api.github.com/users/quinton-hoole/followers","following_url":"https://api.github.com/users/quinton-hoole/following{/other_user}","gists_url":"https://api.github.com/users/quinton-hoole/gists{/gist_id}","starred_url":"https://api.github.com/users/quinton-hoole/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quinton-hoole/subscriptions","organizations_url":"https://api.github.com/users/quinton-hoole/orgs","repos_url":"https://api.github.com/users/quinton-hoole/repos","events_url":"https://api.github.com/users/quinton-hoole/events{/privacy}","received_events_url":"https://api.github.com/users/quinton-hoole/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2016-01-12T02:28:34Z","updated_at":"2016-01-12T02:28:34Z","html_url":"https://github.com/kubernetes/kubernetes/pull/19313#discussion_r49409124","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19313","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/49409124"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/19313#discussion_r49409124"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19313"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19313","id":55168904,"html_url":"https://github.com/kubernetes/kubernetes/pull/19313","diff_url":"https://github.com/kubernetes/kubernetes/pull/19313.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/19313.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/19313","number":19313,"state":"open","locked":false,"title":"RFC design docs for Cluster Federation/Ubernetes.","user":{"login":"quinton-hoole","id":10390785,"avatar_url":"https://avatars.githubusercontent.com/u/10390785?v=3","gravatar_id":"","url":"https://api.github.com/users/quinton-hoole","html_url":"https://github.com/quinton-hoole","followers_url":"https://api.github.com/users/quinton-hoole/followers","following_url":"https://api.github.com/users/quinton-hoole/following{/other_user}","gists_url":"https://api.github.com/users/quinton-hoole/gists{/gist_id}","starred_url":"https://api.github.com/users/quinton-hoole/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quinton-hoole/subscriptions","organizations_url":"https://api.github.com/users/quinton-hoole/orgs","repos_url":"https://api.github.com/users/quinton-hoole/repos","events_url":"https://api.github.com/users/quinton-hoole/events{/privacy}","received_events_url":"https://api.github.com/users/quinton-hoole/received_events","type":"User","site_admin":false},"body":"A first round of comments and feedback was solicited from a subset of the Federation SIG via Google Docs.  Moving this here now for wider review.\r\n\r\nStill needs some improved aesthetics (weave the diagrams in, and improve some formatting) but that can be done while addressing other review feedback.\r\n\r\n@justinsb @mikedanese @davidopp @lavalamp @thockin @bprashanth ","created_at":"2016-01-06T02:04:10Z","updated_at":"2016-01-12T02:28:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"891c9ec47c2b5fa73f547ec2ce5a2d891bc2f777","assignee":{"login":"davidopp","id":8264113,"avatar_url":"https://avatars.githubusercontent.com/u/8264113?v=3","gravatar_id":"","url":"https://api.github.com/users/davidopp","html_url":"https://github.com/davidopp","followers_url":"https://api.github.com/users/davidopp/followers","following_url":"https://api.github.com/users/davidopp/following{/other_user}","gists_url":"https://api.github.com/users/davidopp/gists{/gist_id}","starred_url":"https://api.github.com/users/davidopp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidopp/subscriptions","organizations_url":"https://api.github.com/users/davidopp/orgs","repos_url":"https://api.github.com/users/davidopp/repos","events_url":"https://api.github.com/users/davidopp/events{/privacy}","received_events_url":"https://api.github.com/users/davidopp/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19313/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19313/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/19313/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/8223c8cc483a6c030bb88178ad8d67cbcab13aee","head":{"label":"quinton-hoole:2015-01-05-ube-design-docs","ref":"2015-01-05-ube-design-docs","sha":"8223c8cc483a6c030bb88178ad8d67cbcab13aee","user":{"login":"quinton-hoole","id":10390785,"avatar_url":"https://avatars.githubusercontent.com/u/10390785?v=3","gravatar_id":"","url":"https://api.github.com/users/quinton-hoole","html_url":"https://github.com/quinton-hoole","followers_url":"https://api.github.com/users/quinton-hoole/followers","following_url":"https://api.github.com/users/quinton-hoole/following{/other_user}","gists_url":"https://api.github.com/users/quinton-hoole/gists{/gist_id}","starred_url":"https://api.github.com/users/quinton-hoole/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quinton-hoole/subscriptions","organizations_url":"https://api.github.com/users/quinton-hoole/orgs","repos_url":"https://api.github.com/users/quinton-hoole/repos","events_url":"https://api.github.com/users/quinton-hoole/events{/privacy}","received_events_url":"https://api.github.com/users/quinton-hoole/received_events","type":"User","site_admin":false},"repo":{"id":29155350,"name":"kubernetes","full_name":"quinton-hoole/kubernetes","owner":{"login":"quinton-hoole","id":10390785,"avatar_url":"https://avatars.githubusercontent.com/u/10390785?v=3","gravatar_id":"","url":"https://api.github.com/users/quinton-hoole","html_url":"https://github.com/quinton-hoole","followers_url":"https://api.github.com/users/quinton-hoole/followers","following_url":"https://api.github.com/users/quinton-hoole/following{/other_user}","gists_url":"https://api.github.com/users/quinton-hoole/gists{/gist_id}","starred_url":"https://api.github.com/users/quinton-hoole/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quinton-hoole/subscriptions","organizations_url":"https://api.github.com/users/quinton-hoole/orgs","repos_url":"https://api.github.com/users/quinton-hoole/repos","events_url":"https://api.github.com/users/quinton-hoole/events{/privacy}","received_events_url":"https://api.github.com/users/quinton-hoole/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/quinton-hoole/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/quinton-hoole/kubernetes","forks_url":"https://api.github.com/repos/quinton-hoole/kubernetes/forks","keys_url":"https://api.github.com/repos/quinton-hoole/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quinton-hoole/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quinton-hoole/kubernetes/teams","hooks_url":"https://api.github.com/repos/quinton-hoole/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/quinton-hoole/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/quinton-hoole/kubernetes/events","assignees_url":"https://api.github.com/repos/quinton-hoole/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/quinton-hoole/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/quinton-hoole/kubernetes/tags","blobs_url":"https://api.github.com/repos/quinton-hoole/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quinton-hoole/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quinton-hoole/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/quinton-hoole/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quinton-hoole/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/quinton-hoole/kubernetes/languages","stargazers_url":"https://api.github.com/repos/quinton-hoole/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/quinton-hoole/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/quinton-hoole/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/quinton-hoole/kubernetes/subscription","commits_url":"https://api.github.com/repos/quinton-hoole/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/quinton-hoole/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/quinton-hoole/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/quinton-hoole/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/quinton-hoole/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/quinton-hoole/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quinton-hoole/kubernetes/merges","archive_url":"https://api.github.com/repos/quinton-hoole/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quinton-hoole/kubernetes/downloads","issues_url":"https://api.github.com/repos/quinton-hoole/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/quinton-hoole/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/quinton-hoole/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/quinton-hoole/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quinton-hoole/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/quinton-hoole/kubernetes/releases{/id}","created_at":"2015-01-12T20:28:39Z","updated_at":"2015-04-15T01:58:44Z","pushed_at":"2016-01-08T00:42:02Z","git_url":"git://github.com/quinton-hoole/kubernetes.git","ssh_url":"git@github.com:quinton-hoole/kubernetes.git","clone_url":"https://github.com/quinton-hoole/kubernetes.git","svn_url":"https://github.com/quinton-hoole/kubernetes","homepage":null,"size":142576,"stargazers_count":1,"watchers_count":1,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"66d3cbf8898ed5c077be6a8df79b18d458d40c11","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":"2016-01-12T02:12:44Z","pushed_at":"2016-01-12T02:26:45Z","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":301737,"stargazers_count":12070,"watchers_count":12070,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3373,"mirror_url":null,"open_issues_count":2745,"forks":3373,"open_issues":2745,"watchers":12070,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19313"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/19313"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/19313"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/19313/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19313/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/19313/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/8223c8cc483a6c030bb88178ad8d67cbcab13aee"}}}}