{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/85864819","pull_request_review_id":6554483,"id":85864819,"diff_hunk":"@@ -0,0 +1,278 @@\n+<!-- BEGIN MUNGE: UNVERSIONED_WARNING -->\n+\n+<!-- BEGIN STRIP_FOR_RELEASE -->\n+\n+<img src=\"http://kubernetes.io/kubernetes/img/warning.png\" alt=\"WARNING\"\n+     width=\"25\" height=\"25\">\n+<img src=\"http://kubernetes.io/kubernetes/img/warning.png\" alt=\"WARNING\"\n+     width=\"25\" height=\"25\">\n+<img src=\"http://kubernetes.io/kubernetes/img/warning.png\" alt=\"WARNING\"\n+     width=\"25\" height=\"25\">\n+<img src=\"http://kubernetes.io/kubernetes/img/warning.png\" alt=\"WARNING\"\n+     width=\"25\" height=\"25\">\n+<img src=\"http://kubernetes.io/kubernetes/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+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+# Image Exec\n+\n+This proposal seeks to create a mechanism to execute a shell or other\n+troubleshooting tools inside a running Kubernetes pod, without requiring that\n+the associated container images include such tools.\n+\n+## Motivation\n+\n+Many developers of native Kubernetes applications wish to treat Kubernetes as an\n+execution platform for custom binaries produced by a build system. These users\n+can forgo the scripted OS install of traditional Dockerfiles and instead `COPY`\n+the output of their build system into a container image built `FROM scratch`.\n+This confers several advantages:\n+\n+  1. **Minimal images** lower operational burden and reduce attack vectors.\n+  2. **Immutable images** improve correctness and reliability.\n+  3. **Smaller image size** reduces resource usage and speeds deployments.\n+\n+The disadvantage of using containers built `FROM scratch` is the lack of system\n+binaries provided a base Operation System image makes it difficult to\n+troubleshoot running containers. Kubernetes should enable troubleshooting pods\n+regardless of the contents of the container image.\n+\n+## Goals and Non-Goals\n+\n+Goals include:\n+  - Enable troubleshooting of minimal container images\n+  - Improve supportability of native Kubernetes applications\n+  - Enable novel uses of `exec` by providing a pod-level abstraction\n+\n+Non-goals include:\n+  - Introducing new abstractions to Kubernetes\n+\n+## Requirements\n+\n+A solution to troubleshoot minimal container images MUST:\n+\n+  - troubleshoot arbitrary running containers with minimal prior configuration\n+  - allow access to all pod namespaces and mount namespaces of individual\n+    containers when supported by container storage driver\n+  - fetch troubleshooting utilities at debug time rather than at the time of pod\n+    initialization\n+  - have no inherent side effects to the running container image\n+  - respect admission restrictions\n+\n+A good solution SHOULD:\n+\n+  - have an excellent user experience (i.e. should be a feature of the platform\n+    rather than a config-time solution)\n+  - not require direct access to the node\n+  - re-use existing container image distribution channels\n+  - enable detection of pods that have been modified by an exec (\"tainted\" pods)\n+\n+## User Stories\n+\n+### Debugging\n+\n+Samantha has a service that consists of a statically compiled Go binary running\n+in a minimal container that is suddenly having trouble connecting to an internal\n+service. Her troubleshooting session might resemble:\n+\n+```\n+% kubectl get pods\n+NAME          READY     STATUS    RESTARTS   AGE\n+neato-5thn0   1/1       Running   0          1d\n+% kubectl exec -it -m gcr.io/neato/debug-image neato-5thn0 bash\n+root@debug-image-neato-5thn0:/# cat /etc/resolv.conf\n+search default.svc.cluster.local svc.cluster.local cluster.local\n+nameserver 10.155.240.10\n+options ndots:5\n+root@debug-image-neato-5thn0:/# dig @10.155.240.10 neato.svc.cluster.local.\n+\n+; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> @10.155.240.10 neato.svc.cluster.local.\n+; (1 server found)\n+;; global options: +cmd\n+;; connection timed out; no servers could be reached\n+```\n+\n+Which leads Samantha to discover that the cluster's DNS service isn't\n+responding.\n+\n+### Automation\n+\n+Abe is a security engineer tasked with running security audits across all of his\n+company's running containers. Even though his company has no standard base\n+image, he's able to audit all containers using:\n+\n+```\n+% for pod in $(kubectl get -o name pod); do\n+    kubectl exec -m gcr.io/neato/security-audit $pod /security-audit.sh\n+  done\n+```\n+\n+## Image Exec\n+\n+To troubleshoot a single container, one executes an ephemeral process inside the\n+container namespaces using `kubectl exec`. Since a pod is a collection of\n+containers, it follows that to debug a pod we could execute an ephemeral\n+container inside the pod namespaces. This is a logical extension of `kubectl\n+exec` enabled by adding a new flag to specify the name of the container image to\n+run inside the pod namespace.\n+\n+The user will specify a debug image of her choice (e.g. `kubectl exec -it -m\n+gcr.io/myproj/debugimage podname`) and be connected to a process running inside\n+the pod. The processes of all other containers would be visible through the\n+shared PID namespace (if enabled). Network connections are visible through the\n+shared net namespace. The kubelet will bind mount the filesystems of other\n+containers in the pod into the debug container (e.g. in `/c/<container_name>/`),\n+potentially read-only.\n+\n+The lifecycle of the debug container will model that of the current `kubectl\n+exec`, with the container being cleaned up after it exits. Since docker doesn't\n+support exec in a container that hasn't started, this is implemented under the\n+covers as create, start, attach, and remove in immediate succession.\n+\n+## API Changes\n+\n+The Exec handler will gain a new parameter to specify a debug image.\n+\n+TODO: details of API changes\n+\n+## Changes to kubelet\n+\n+The kubelet will gain a new `ExecInPod` method to be called by `ServeExec`\n+instead of `ExecInContainer` when an container image name is provided. Image\n+exec could be accommodated by the current `ExecInContainer` with the addition of\n+a parameter for imageName, but it would the method name misleading.\n+\n+A corresponding `ExecInPod` will be added to the kubelet's container.Runtime\n+interface.\n+\n+### Container Runtime Interface\n+\n+The [Container Runtime Interface](container-runtime-interface-v1.md) implements\n+a standard, imperative container interface across all container runtimes\n+supported by Kubernetes. This interface makes it easy to implement Image Exec.\n+\n+The kubelet's Generic Runtime Manager can implement `ExecInPod` with almost no\n+changes to the CRI, which means we don't have to implement the logic in each of\n+the container runtimes.\n+\n+To bind mount filesystems of other containers, the kubelet must be able to query\n+the mount path of a particular container. This will be added to the `Container`\n+message returned by `ListContainers`. If the container's filesystem is no longer\n+mounted in the node's mount namespace then it will not be made visible to the\n+troubleshooting container.\n+\n+`ExecInPod` will build a map of container names to node filesystem mount points\n+for inclusion in the troubleshooting container's `ContainerConfig` with a\n+`container_path` of `/c/<container_name>`. This can only be accomplished when\n+the container is created.\n+\n+We could instead modify CRI's `CreateContainer` to include a list of containers\n+IDs to \"link\" to the newly created container, but then we'd have to repeat the\n+logic in each of the container backends.\n+\n+### Legacy Container Runtimes\n+\n+Implementation is slightly more difficult for the legacy docker and rkt\n+runtimes.  We could implement the same create/start/attach/remove logic in rkt\n+and docker_manager, or we could save effort by linking this feature to the CRI\n+and return \"Not Implemented\" for the legacy runtimes.\n+\n+## Open Questions\n+\n+* Will Kubernetes evict the troubleshooting image for using additional\n+  resources? What happens if SyncPod() is called?\n+* What's the timeline for switching to the CRI?\n+* Docker 1.12 leaves mounted the merged container filesystem with the aufs and\n+  overlay drivers, but the current Google Cloud Image (GCI) does not. This will\n+  be significantly less useful when container filesystems are inaccessible.\n+* Docker 1.12 introduced a shared PID namespace. When will this be supported by\n+  Kubernetes?\n+* Is this compatible with Admission control plugins that restrict what images\n+  can run on a cluster?\n+* Would it be possible to Image Exec into pods that are in a terminal state to\n+  determine why they've failed?\n+\n+## Alternatives Considered\n+\n+### Inactive container\n+\n+If Kubernetes supported the concept of an \"inactive\" container, we could\n+configure it as part of a pod and activate it at debug time. In order to avoid\n+coupling the debug tool versions with those of the running containers, we would\n+need to ensure the debug image was pulled at debug time. The container could\n+then be run with a TTY and attached using kubectl. We would need to figure out a\n+solution that allows access the filesystem of other containers.\n+\n+The downside of this approach is that it requires prior configuration. In\n+addition to requiring prior consideration, it would increase boilerplate config.\n+A requirement for prior configuration makes it feel like a workaround rather\n+than a feature of the platform.\n+\n+### Pod Mutation\n+\n+If Kubernetes supported pod mutations, we could update a pod at debug time (via\n+kubectl patch or equivalent) to either add a debug container or a volume\n+containing debug binaries. The former would then be available via kubectl attach\n+while the latter would provide binaries for kubectl exec.\n+\n+Adding a container to a running pod would be a large change to Kubernetes, and\n+there are several edge cases to consider such as resource limits and monitoring.","path":"docs/proposals/image-exec.md","position":232,"original_position":232,"commit_id":"b217b82a6b88e6360d2e77fe185eb7d4ea9d90c2","original_commit_id":"b217b82a6b88e6360d2e77fe185eb7d4ea9d90c2","user":{"login":"liggitt","id":980082,"avatar_url":"https://avatars.githubusercontent.com/u/980082?v=3","gravatar_id":"","url":"https://api.github.com/users/liggitt","html_url":"https://github.com/liggitt","followers_url":"https://api.github.com/users/liggitt/followers","following_url":"https://api.github.com/users/liggitt/following{/other_user}","gists_url":"https://api.github.com/users/liggitt/gists{/gist_id}","starred_url":"https://api.github.com/users/liggitt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/liggitt/subscriptions","organizations_url":"https://api.github.com/users/liggitt/orgs","repos_url":"https://api.github.com/users/liggitt/repos","events_url":"https://api.github.com/users/liggitt/events{/privacy}","received_events_url":"https://api.github.com/users/liggitt/received_events","type":"User","site_admin":false},"body":"and admission that locks security context at pod creation time","created_at":"2016-11-01T01:37:12Z","updated_at":"2016-11-01T01:37:12Z","html_url":"https://github.com/kubernetes/kubernetes/pull/35584#discussion_r85864819","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35584","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/85864819"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/35584#discussion_r85864819"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35584"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35584","id":90935745,"html_url":"https://github.com/kubernetes/kubernetes/pull/35584","diff_url":"https://github.com/kubernetes/kubernetes/pull/35584.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/35584.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/35584","number":35584,"state":"open","locked":false,"title":"Propose feature to execute ephemeral image in pod","user":{"login":"verb","id":458800,"avatar_url":"https://avatars.githubusercontent.com/u/458800?v=3","gravatar_id":"","url":"https://api.github.com/users/verb","html_url":"https://github.com/verb","followers_url":"https://api.github.com/users/verb/followers","following_url":"https://api.github.com/users/verb/following{/other_user}","gists_url":"https://api.github.com/users/verb/gists{/gist_id}","starred_url":"https://api.github.com/users/verb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/verb/subscriptions","organizations_url":"https://api.github.com/users/verb/orgs","repos_url":"https://api.github.com/users/verb/repos","events_url":"https://api.github.com/users/verb/events{/privacy}","received_events_url":"https://api.github.com/users/verb/received_events","type":"User","site_admin":false},"body":"**What this PR does / why we need it**: Initially described in #27140, this PR proposes a feature to better support minimal container images (i.e. images built from scratch) by extending `kubectl exec` to support choosing an arbitrary container image to run in pod namespaces (e.g. `kubectl exec -it --image=busybox <pod_name>`). This is useful for developers writing native Kubernetes applications that prefer not to ship an entire OS image.\n\n**Special notes for your reviewer**: SIG Node asked me to send this PR to facilitate further discussion.\n\n**Release note**: None, this PR contains only a proposal.\n\n<!-- Reviewable:start -->\n---\n\nThis change is [<img src=\"https://reviewable.kubernetes.io/review_button.svg\" height=\"34\" align=\"absmiddle\" alt=\"Reviewable\"/>](https://reviewable.kubernetes.io/reviews/kubernetes/kubernetes/35584)\n\n<!-- Reviewable:end -->\n","created_at":"2016-10-26T04:44:01Z","updated_at":"2016-11-01T01:37:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"083f42cff4af349135a7b3f6306e7841cc8bb10d","assignee":{"login":"dchen1107","id":7740897,"avatar_url":"https://avatars.githubusercontent.com/u/7740897?v=3","gravatar_id":"","url":"https://api.github.com/users/dchen1107","html_url":"https://github.com/dchen1107","followers_url":"https://api.github.com/users/dchen1107/followers","following_url":"https://api.github.com/users/dchen1107/following{/other_user}","gists_url":"https://api.github.com/users/dchen1107/gists{/gist_id}","starred_url":"https://api.github.com/users/dchen1107/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dchen1107/subscriptions","organizations_url":"https://api.github.com/users/dchen1107/orgs","repos_url":"https://api.github.com/users/dchen1107/repos","events_url":"https://api.github.com/users/dchen1107/events{/privacy}","received_events_url":"https://api.github.com/users/dchen1107/received_events","type":"User","site_admin":false},"assignees":[{"login":"dchen1107","id":7740897,"avatar_url":"https://avatars.githubusercontent.com/u/7740897?v=3","gravatar_id":"","url":"https://api.github.com/users/dchen1107","html_url":"https://github.com/dchen1107","followers_url":"https://api.github.com/users/dchen1107/followers","following_url":"https://api.github.com/users/dchen1107/following{/other_user}","gists_url":"https://api.github.com/users/dchen1107/gists{/gist_id}","starred_url":"https://api.github.com/users/dchen1107/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dchen1107/subscriptions","organizations_url":"https://api.github.com/users/dchen1107/orgs","repos_url":"https://api.github.com/users/dchen1107/repos","events_url":"https://api.github.com/users/dchen1107/events{/privacy}","received_events_url":"https://api.github.com/users/dchen1107/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35584/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35584/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/35584/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/b217b82a6b88e6360d2e77fe185eb7d4ea9d90c2","head":{"label":"verb:imageexec-proposal","ref":"imageexec-proposal","sha":"b217b82a6b88e6360d2e77fe185eb7d4ea9d90c2","user":{"login":"verb","id":458800,"avatar_url":"https://avatars.githubusercontent.com/u/458800?v=3","gravatar_id":"","url":"https://api.github.com/users/verb","html_url":"https://github.com/verb","followers_url":"https://api.github.com/users/verb/followers","following_url":"https://api.github.com/users/verb/following{/other_user}","gists_url":"https://api.github.com/users/verb/gists{/gist_id}","starred_url":"https://api.github.com/users/verb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/verb/subscriptions","organizations_url":"https://api.github.com/users/verb/orgs","repos_url":"https://api.github.com/users/verb/repos","events_url":"https://api.github.com/users/verb/events{/privacy}","received_events_url":"https://api.github.com/users/verb/received_events","type":"User","site_admin":false},"repo":{"id":43977755,"name":"kubernetes","full_name":"verb/kubernetes","owner":{"login":"verb","id":458800,"avatar_url":"https://avatars.githubusercontent.com/u/458800?v=3","gravatar_id":"","url":"https://api.github.com/users/verb","html_url":"https://github.com/verb","followers_url":"https://api.github.com/users/verb/followers","following_url":"https://api.github.com/users/verb/following{/other_user}","gists_url":"https://api.github.com/users/verb/gists{/gist_id}","starred_url":"https://api.github.com/users/verb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/verb/subscriptions","organizations_url":"https://api.github.com/users/verb/orgs","repos_url":"https://api.github.com/users/verb/repos","events_url":"https://api.github.com/users/verb/events{/privacy}","received_events_url":"https://api.github.com/users/verb/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/verb/kubernetes","description":"Container Cluster Manager from Google","fork":true,"url":"https://api.github.com/repos/verb/kubernetes","forks_url":"https://api.github.com/repos/verb/kubernetes/forks","keys_url":"https://api.github.com/repos/verb/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/verb/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/verb/kubernetes/teams","hooks_url":"https://api.github.com/repos/verb/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/verb/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/verb/kubernetes/events","assignees_url":"https://api.github.com/repos/verb/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/verb/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/verb/kubernetes/tags","blobs_url":"https://api.github.com/repos/verb/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/verb/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/verb/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/verb/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/verb/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/verb/kubernetes/languages","stargazers_url":"https://api.github.com/repos/verb/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/verb/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/verb/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/verb/kubernetes/subscription","commits_url":"https://api.github.com/repos/verb/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/verb/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/verb/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/verb/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/verb/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/verb/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/verb/kubernetes/merges","archive_url":"https://api.github.com/repos/verb/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/verb/kubernetes/downloads","issues_url":"https://api.github.com/repos/verb/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/verb/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/verb/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/verb/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/verb/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/verb/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/verb/kubernetes/deployments","created_at":"2015-10-09T20:10:06Z","updated_at":"2016-07-14T22:46:51Z","pushed_at":"2016-10-26T04:27:35Z","git_url":"git://github.com/verb/kubernetes.git","ssh_url":"git@github.com:verb/kubernetes.git","clone_url":"https://github.com/verb/kubernetes.git","svn_url":"https://github.com/verb/kubernetes","homepage":"http://kubernetes.io","size":335353,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"fc7f64a99aed23ee174487c57a6a24b28412fe62","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":"Production-Grade Container Scheduling and Management","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}","deployments_url":"https://api.github.com/repos/kubernetes/kubernetes/deployments","created_at":"2014-06-06T22:56:04Z","updated_at":"2016-11-01T01:34:01Z","pushed_at":"2016-11-01T01:33:28Z","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":610021,"stargazers_count":18049,"watchers_count":18049,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":5895,"mirror_url":null,"open_issues_count":5176,"forks":5895,"open_issues":5176,"watchers":18049,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35584"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/35584"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/35584"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/35584/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35584/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/35584/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/b217b82a6b88e6360d2e77fe185eb7d4ea9d90c2"}}}}
{"actor":{"display_login":"liggitt"}}