{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments/25688526","id":25688526,"diff_hunk":"@@ -0,0 +1,245 @@\n+## Abstract\n+Auto-scaling is a data-driven feature that allows users to increase or decrease capacity as needed by controlling the \n+number of pods deployed within the system automatically.  \n+\n+## Motivation\n+\n+Applications experience peaks and valleys in usage.  In order to respond to increases and decreases in load, administrators \n+scale their applications by adding computing resources.  In the cloud computing environment this can be \n+done automatically based on statistical analysis and thresholds.\n+\n+### Goals\n+\n+* Provide a concrete proposal for implementing auto-scaling pods within Kubernetes\n+* Implementation proposal should be in line with current discussions in existing issues: \n+    * Resize verb - [1629](https://github.com/GoogleCloudPlatform/kubernetes/issues/1629)\n+    * Config conflicts - [Config](https://github.com/GoogleCloudPlatform/kubernetes/blob/c7cb991987193d4ca33544137a5cb7d0292cf7df/docs/config.md#automated-re-configuration-processes)\n+    * Rolling updates - [1353](https://github.com/GoogleCloudPlatform/kubernetes/issues/1353)\n+    * Multiple scalable types - [1624](https://github.com/GoogleCloudPlatform/kubernetes/issues/1624)  \n+\n+## Constraints and Assumptions\n+\n+* This proposal is for horizontal scaling only.  Vertical scaling will be handled in [issue 2072](https://github.com/GoogleCloudPlatform/kubernetes/issues/2072)\n+* `ReplicationControllers` will not know about the auto-scaler, they are the target of the auto-scaler.  The `ReplicationController` responsibilities are \n+constrained to only ensuring that the desired number of pods are operational per the [Replication Controller Design](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/replication-controller.md#responsibilities-of-the-replication-controller)\n+* Auto-scalers will be loosely coupled with data gathering components in order to allow a wide variety of input sources\n+* Auto-scalable resources will support a resize verb ([1629](https://github.com/GoogleCloudPlatform/kubernetes/issues/1629)) \n+such that the auto-scaler does not directly manipulate the underlying resource.\n+* Initially, most thresholds will be set by application administrators. It should be possible for an autoscaler to be \n+written later that sets thresholds automatically based on past behavior (CPU used vs incoming requests).\n+* The auto-scaler must be aware of user defined actions so it does not override them unintentionally (for instance someone \n+explicitly setting the replica count to 0 should mean that the auto-scaler does not try to scale the application up)\n+* It should be possible to write and deploy a custom auto-scaler without modifying existing auto-scalers\n+* Auto-scalers must be able to monitor multiple replication controllers while only targeting a single scalable object\n+\n+## Use Cases\n+\n+### Scaling based on traffic\n+\n+The current, most obvious, use case is scaling an application based on network traffic like requests per second.  Most \n+applications will expose one or more network endpoints for clients to connect to. Many of those endpoints will be load \n+balanced or situated behind a proxy - the data from those proxies and load balancers can be used to estimate client to \n+server traffic for applications. This is the primary, but not sole, source of data for making decisions.\n+\n+Within Kubernetes a [kube proxy](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/services.md#ips-and-portals) \n+running on each node directs service requests to the underlying implementation.  \n+\n+While the proxy provides internal inter-pod connections, there will be L3 and L7 proxies and load balancers that manage \n+traffic to backends. OpenShift, for instance, adds a \"route\" resource for defining external to internal traffic flow. \n+The \"routers\" are HAProxy or Apache load balancers that aggregate many different services and pods and can serve as a \n+data source for the number of backends.\n+\n+### Scaling based on predictive analysis\n+\n+Scaling may also occur based on predictions of system state like anticipated load, historical data, etc.  Hand in hand \n+with scaling based on traffic, predictive analysis may be used to determine anticipated system load and scale the application automatically.  \n+\n+### Scaling based on arbitrary data\n+\n+Administrators may wish to scale the application based on any number of arbitrary data points such as job execution time or\n+duration of active sessions.  There are any number of reasons an administrator may wish to increase or decrease capacity which \n+means the auto-scaler must be a configurable, extensible component.\n+\n+## Specification\n+\n+In order to facilitate talking about auto-scaling the following definitions are used:\n+\n+* `ReplicationController` - the first building block of auto scaling.  Pods are deployed and scaled by a `ReplicationController`.\n+* kube proxy - The proxy handles internal inter-pod traffic, an example of a data source to drive an auto-scaler\n+* L3/L7 proxies - A routing layer handling outside to inside traffic requests, an example of a data source to drive an auto-scaler\n+* auto-scaler - scales replicas up and down by using the `resize` endpoint provided by scalable resources (`ReplicationController`)\n+\n+\n+### Auto-Scaler\n+\n+The Auto-Scaler is a state reconciler responsible for checking data against configured scaling thresholds \n+and calling the `resize` endpoint to change the number of replicas.  The scaler will \n+use a client/cache implementation to receive watch data from the data aggregators and respond to them by \n+scaling the application.  Auto-scalers are created and defined like other resources via REST endpoints and belong to the \n+namespace just as a `ReplicationController` or `Service`.\n+\n+Since an auto-scaler is a durable object it is best represented as a resource.  \n+\n+```go\n+    //The auto scaler interface\n+    type AutoScalerInterface interface {        \n+        //ScaleApplication adjusts a resource's replica count.  Calls resize endpoint.  Args to this are based on what the endpoint\n+        //can support.  See https://github.com/GoogleCloudPlatform/kubernetes/issues/1629\n+        ScaleApplication(num int) error\n+    }\n+\n+    type AutoScaler struct {\n+        //common construct\n+        TypeMeta\n+        //common construct\n+        ObjectMeta\n+        \n+        //Spec defines the configuration options that drive the behavior for this auto-scaler \n+        Spec    AutoScalerSpec  \n+        \n+        //Status defines the current status of this auto-scaler.\n+        Status  AutoScalerStatus               \n+     }\n+     \n+    type AutoScalerSpec struct {\n+        //AutoScaleThresholds holds a collection of AutoScaleThresholds that drive the auto scaler\n+        AutoScaleThresholds []AutoScaleThreshold\n+        \n+        //Enabled turns auto scaling on or off\n+        Enabled boolean \n+        \n+        //MaxAutoScaleCount defines the max replicas that the auto scaler can use.  This value must be greater than \n+        //0 and >= MinAutoScaleCount\n+        MaxAutoScaleCount int\n+        \n+        //MinAutoScaleCount defines the minimum number replicas that the auto scaler can reduce to, \n+        //0 means that the application is allowed to idle \n+        MinAutoScaleCount int \n+                       \n+        //TargetSelector provides the resizeable target(s).  Right now this is a ReplicationController\n+        //in the future it could be a job or any resource that implements resize.  \n+        TargetSelector map[string]string\n+        \n+        //MonitorSelector defines a set of capacity that the auto-scaler is monitoring (replication controllers).  Generally, the auto-scaler is ","path":"docs/proposals/autoscaling.md","position":123,"original_position":123,"commit_id":"7c22821e7472b9ffdf9c13fdf8f356f609e4d7ba","original_commit_id":"7c22821e7472b9ffdf9c13fdf8f356f609e4d7ba","user":{"login":"pweil-","id":5230419,"avatar_url":"https://avatars.githubusercontent.com/u/5230419?v=3","gravatar_id":"","url":"https://api.github.com/users/pweil-","html_url":"https://github.com/pweil-","followers_url":"https://api.github.com/users/pweil-/followers","following_url":"https://api.github.com/users/pweil-/following{/other_user}","gists_url":"https://api.github.com/users/pweil-/gists{/gist_id}","starred_url":"https://api.github.com/users/pweil-/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pweil-/subscriptions","organizations_url":"https://api.github.com/users/pweil-/orgs","repos_url":"https://api.github.com/users/pweil-/repos","events_url":"https://api.github.com/users/pweil-/events{/privacy}","received_events_url":"https://api.github.com/users/pweil-/received_events","type":"User","site_admin":false},"body":"I believe this comment is a bit out of date, I will update it.  The storage and selection of statistics is still a bit fuzzy and I'd love some input from more statistics oriented folks.  The way the MonitorSelector and Threshold.Selector fields should work together is the MonitorSelector defines a set of resources you are going to monitor.  The Threshold.Selector would identify a specific statistic.  \r\n\r\nSo the way I saw that playing out was a threshold would request statistic X (Threshold.Selector) for monitored object Y (MonitorSelector).  \r\n","created_at":"2015-03-03T13:59:13Z","updated_at":"2015-03-03T13:59:13Z","html_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/2863#discussion_r25688526","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/2863","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments/25688526"},"html":{"href":"https://github.com/GoogleCloudPlatform/kubernetes/pull/2863#discussion_r25688526"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/2863"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/2863","id":25911872,"html_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/2863","diff_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/2863.diff","patch_url":"https://github.com/GoogleCloudPlatform/kubernetes/pull/2863.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/2863","number":2863,"state":"open","locked":false,"title":"WIP: auto-scaler proposal","user":{"login":"pweil-","id":5230419,"avatar_url":"https://avatars.githubusercontent.com/u/5230419?v=3","gravatar_id":"","url":"https://api.github.com/users/pweil-","html_url":"https://github.com/pweil-","followers_url":"https://api.github.com/users/pweil-/followers","following_url":"https://api.github.com/users/pweil-/following{/other_user}","gists_url":"https://api.github.com/users/pweil-/gists{/gist_id}","starred_url":"https://api.github.com/users/pweil-/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pweil-/subscriptions","organizations_url":"https://api.github.com/users/pweil-/orgs","repos_url":"https://api.github.com/users/pweil-/repos","events_url":"https://api.github.com/users/pweil-/events{/privacy}","received_events_url":"https://api.github.com/users/pweil-/received_events","type":"User","site_admin":false},"body":"## Abstract\r\nAuto-scaling is a data-driven feature that allows users to increase or decrease capacity as needed by controlling the \r\nnumber of pods deployed within the system automatically.  \r\n\r\n## Motivation\r\n\r\nApplications experience peaks and valleys in usage.  In order to respond to increases and decreases in load, administrators \r\nscale their applications by adding computing resources.  In the cloud computing environment this can be \r\ndone automatically based on statistical analysis and thresholds.\r\n\r\nEdit: removed link to old version, please see the committed file for the full proposal","created_at":"2014-12-11T16:20:24Z","updated_at":"2015-03-03T13:59:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"97f8bfa250450af52560f47187477632b75cb682","assignee":{"login":"smarterclayton","id":1163175,"avatar_url":"https://avatars.githubusercontent.com/u/1163175?v=3","gravatar_id":"","url":"https://api.github.com/users/smarterclayton","html_url":"https://github.com/smarterclayton","followers_url":"https://api.github.com/users/smarterclayton/followers","following_url":"https://api.github.com/users/smarterclayton/following{/other_user}","gists_url":"https://api.github.com/users/smarterclayton/gists{/gist_id}","starred_url":"https://api.github.com/users/smarterclayton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarterclayton/subscriptions","organizations_url":"https://api.github.com/users/smarterclayton/orgs","repos_url":"https://api.github.com/users/smarterclayton/repos","events_url":"https://api.github.com/users/smarterclayton/events{/privacy}","received_events_url":"https://api.github.com/users/smarterclayton/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/2863/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/2863/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/2863/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/statuses/7c22821e7472b9ffdf9c13fdf8f356f609e4d7ba","head":{"label":"pweil-:autoscaler-proposal","ref":"autoscaler-proposal","sha":"7c22821e7472b9ffdf9c13fdf8f356f609e4d7ba","user":{"login":"pweil-","id":5230419,"avatar_url":"https://avatars.githubusercontent.com/u/5230419?v=3","gravatar_id":"","url":"https://api.github.com/users/pweil-","html_url":"https://github.com/pweil-","followers_url":"https://api.github.com/users/pweil-/followers","following_url":"https://api.github.com/users/pweil-/following{/other_user}","gists_url":"https://api.github.com/users/pweil-/gists{/gist_id}","starred_url":"https://api.github.com/users/pweil-/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pweil-/subscriptions","organizations_url":"https://api.github.com/users/pweil-/orgs","repos_url":"https://api.github.com/users/pweil-/repos","events_url":"https://api.github.com/users/pweil-/events{/privacy}","received_events_url":"https://api.github.com/users/pweil-/received_events","type":"User","site_admin":false},"repo":{"id":24119325,"name":"kubernetes","full_name":"pweil-/kubernetes","owner":{"login":"pweil-","id":5230419,"avatar_url":"https://avatars.githubusercontent.com/u/5230419?v=3","gravatar_id":"","url":"https://api.github.com/users/pweil-","html_url":"https://github.com/pweil-","followers_url":"https://api.github.com/users/pweil-/followers","following_url":"https://api.github.com/users/pweil-/following{/other_user}","gists_url":"https://api.github.com/users/pweil-/gists{/gist_id}","starred_url":"https://api.github.com/users/pweil-/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pweil-/subscriptions","organizations_url":"https://api.github.com/users/pweil-/orgs","repos_url":"https://api.github.com/users/pweil-/repos","events_url":"https://api.github.com/users/pweil-/events{/privacy}","received_events_url":"https://api.github.com/users/pweil-/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pweil-/kubernetes","description":"Container Cluster Manager","fork":true,"url":"https://api.github.com/repos/pweil-/kubernetes","forks_url":"https://api.github.com/repos/pweil-/kubernetes/forks","keys_url":"https://api.github.com/repos/pweil-/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pweil-/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pweil-/kubernetes/teams","hooks_url":"https://api.github.com/repos/pweil-/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/pweil-/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/pweil-/kubernetes/events","assignees_url":"https://api.github.com/repos/pweil-/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/pweil-/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/pweil-/kubernetes/tags","blobs_url":"https://api.github.com/repos/pweil-/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pweil-/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pweil-/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/pweil-/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pweil-/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/pweil-/kubernetes/languages","stargazers_url":"https://api.github.com/repos/pweil-/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/pweil-/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/pweil-/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/pweil-/kubernetes/subscription","commits_url":"https://api.github.com/repos/pweil-/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/pweil-/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/pweil-/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/pweil-/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/pweil-/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/pweil-/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pweil-/kubernetes/merges","archive_url":"https://api.github.com/repos/pweil-/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pweil-/kubernetes/downloads","issues_url":"https://api.github.com/repos/pweil-/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/pweil-/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/pweil-/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/pweil-/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pweil-/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/pweil-/kubernetes/releases{/id}","created_at":"2014-09-16T21:53:37Z","updated_at":"2015-02-18T19:08:47Z","pushed_at":"2015-03-02T22:26:12Z","git_url":"git://github.com/pweil-/kubernetes.git","ssh_url":"git@github.com:pweil-/kubernetes.git","clone_url":"https://github.com/pweil-/kubernetes.git","svn_url":"https://github.com/pweil-/kubernetes","homepage":null,"size":29685,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"GoogleCloudPlatform:master","ref":"master","sha":"97d7e7e2c24a7300f9dfba0445e2d32fe89c7fac","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-03-03T13:28:30Z","pushed_at":"2015-03-03T05:50:39Z","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":90172,"stargazers_count":6407,"watchers_count":6407,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1142,"mirror_url":null,"open_issues_count":769,"forks":1142,"open_issues":769,"watchers":6407,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/2863"},"html":{"href":"https://github.com/GoogleCloudPlatform/kubernetes/pull/2863"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/2863"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/issues/2863/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/2863/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/pulls/2863/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/kubernetes/statuses/7c22821e7472b9ffdf9c13fdf8f356f609e4d7ba"}}}}