{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/website/pulls/comments/184330644","pull_request_review_id":115502119,"id":184330644,"diff_hunk":"@@ -0,0 +1,366 @@\n+---\n+layout: blog\n+title: Developing on Kubernetes\n+date: Wednesday, May 2, 2018\n+---\n+\n+How do you develop a Kubernetes app? That is, how do you write and test an app that is supposed to run on Kubernetes? This article focuses on the challenges, tools and methods you might want to be aware of to successfully write Kubernetes apps alone or in a team setting.\n+\n+We’re assuming you are a developer, you have a favorite programming language, editor/IDE, and a testing framework available. The overarching goal is to introduce minimal changes to your current workflow when developing the app for Kubernetes. For example, if you’re a Node.js developer and are used to a hot-reload setup—that is, on save in your editor the running app gets automagically updated—then dealing with containers and container images, with container registries, Kubernetes deployments, triggers, and more can not only be overwhelming but really take all the fun out if it.\n+\n+In the following, we’ll first discuss the overall development setup, then review tools of the trade, and last but not least do a hands-on walkthrough of three exemplary tools that allow for iterative, local app development against Kubernetes.\n+\n+## Where to run your cluster?\n+\n+As a developer you want to think about where the Kubernetes cluster you’re developing against runs as well as where the development environment sits. Conceptually there are four development modes:\n+\n+![Dev Modes](/images/blog-logging/2018-04-25-developing-on-kubernetes/dok-devmodes_preview.png)\n+\n+A number of tools support pure offline development including Minikube, Docker for Mac/Windows, Minishift, and the ones we discuss in detail below. Sometimes, for example, in a microservices setup where certain microservices already run in the cluster, a proxied setup (forwarding traffic into and from the cluster) is preferable and Telepresence is an example tool in this category. The live mode essentially means you’re building and/or deploying against a remote cluster and, finally, the pure online mode means both your development environment and the cluster are remote, as this is the case with, for example, [Eclipse Che](https://www.eclipse.org/che/docs/kubernetes-single-user.html) or [Cloud 9](https://github.com/errordeveloper/k9c). Let’s now have a closer look at the basics of offline development: running Kubernetes locally.\n+\n+[Minikube](https://kubernetes.io/docs/getting-started-guides/minikube/) is a popular choice for those who prefer to run Kubernetes in a local VM. More recently Docker for [Mac](https://docs.docker.com/docker-for-mac/kubernetes/) and [Windows](https://docs.docker.com/docker-for-windows/kubernetes/) started shipping Kubernetes as an experimental package (in the “edge” channel). Some reasons why you may want to prefer using Minikube over the Docker desktop option are:\n+\n+* You already have Minikube installed and running\n+* You prefer to wait until Docker ships a stable package\n+* You’re a Linux desktop user\n+* You are a Windows users who doesn’t have Windows 10 Pro with Hyper-V\n+\n+Running a local cluster allows folks to work offline and that you don’t have to pay for using cloud resources. Cloud provider costs are often rather affordable and free tiers exists, however some folks prefer to avoid having to approve those costs with their manager as well as potentially incur unexpected costs, for example, when leaving cluster running over the weekend.\n+\n+Some developers prefer to use a remote Kubernetes cluster, and this is usually to allow for larger compute and storage capacity and also enable collaborative workflows more easily. This means it’s easier for you to pull in a colleague to help with debugging or share access to an app in the team. Additionally, for some developers it can be critical to mirror production environment as closely as possible, especially when it comes down to external cloud services, say,  proprietary databases, object stores, message queues, external load balancer, or mail delivery systems.\n+\n+In summary, there are good reasons for you to develop against a local cluster as well as a remote one. It very much depends on in which phase you are: from early prototyping and/or developing alone to integrating a set of more stable microservices.\n+\n+Now that you have a basic idea of the options around the runtime environment, let’s move on to how to iteratively develop and deploy your app.\n+\n+## The tools of the trade\n+\n+We are now going to review tooling allowing you to develop apps on Kubernetes with the focus on having minimal impact on your existing workflow. We strive to provide an unbiased description including implications of using each of the tools in general terms.\n+\n+Note that this is a tricky area since even for established technologies such as, for example, JSON vs YAML vs XML or REST vs gRPC vs SOAP a lot depends on your background, your preferences and organizational settings. It’s even harder to compare tooling in the Kubernetes ecosystem as things evolve very rapidly and new tools are announced almost on a weekly basis; during the preparation of this post alone, for example, [Gitkube](https://gitkube.sh/) and [Watchpod](https://github.com/MinikubeAddon/watchpod) came out. To cover these new tools as well as related, existing tooling such as Weave Flux and OpenShift’s [S2I](https://docs.openshift.com/container-platform/3.9/creating_images/s2i.html) we are planning a follow-up blog post to the one you’re reading.\n+\n+### Draft\n+\n+[Draft](https://github.com/Azure/draft) aims to help you get started deploying any app to Kubernetes. It is capable of applying heuristics as to what programming language your app is written in and generates a Dockerfile along with a Helm chart. It then runs the build for you and deploys resulting image to the target cluster via the Helm chart. It also allows user to setup port forwarding to localhost very easily.\n+\n+Implications:\n+* User can provide customise the chart and Dockerfile templates however they like, or even provide custom templates for future use\n+* It’s not very simple to guess how just any app is supposed to be built, in some cases user may need to tweak Dockerfile and the Helm chart that Draft generates\n+* With [Draft version 0.11.0](https://github.com/Azure/draft/releases/tag/v0.12.0) or older, every time user wants to test a change, they need to wait for Draft to copy the code to the cluster, then run the build, push the image and release updated chart; this can timely, but it results in an image being for every single change made by the user (whether it was committed to git or not)\n+* As of Draft version 0.12.0, builds are executed locally\n+* User doesn’t have an option to choose something other than Helm for deployment\n+* It can watch local changes and trigger deployments, but this is feature is not enabled by default\n+* It allows developer to use either local or remote Kubernetes cluster\n+* Deploying to production is up to the user, Draft authors recommend their other project – Brigade\n+* Can be used instead of Skaffold, and along the side of Squash\n+\n+More info:\n+[Draft: Kubernetes container development made easy](http://blog.kubernetes.io/2017/05/draft-kubernetes-container-development.html)\n+[Getting Started Guide](https://github.com/Azure/draft/blob/master/docs/getting-started.md)\n+\n+### Skaffold\n+\n+[Skaffold](https://github.com/GoogleCloudPlatform/skaffold) is a tool that aims to provide portability for CI integrations with different build system, image registry and deployment tools. It is different from Draft, yet somewhat comparable. It has a basic capability for generating manifests, but it’s not a prominent feature. Skaffold is extendible and lets user pick tools for use in each of the steps in building and deploying their app.\n+\n+Implications:\n+* Modular and design\n+* Works independently of CI vendor, user doesn’t need Docker or Kubernetes plugin\n+* Works without CI as such, i.e. from the developer’s laptop\n+* It can watch local changes and trigger deployments\n+* It allows developer to use either local or remote Kubernetes cluster\n+* It can be used to deploy to production, user can configure how exactly they prefer to do it and provide different kind of pipeline for each target environment\n+* Can be used instead of Draft, and along the side with most other tools\n+\n+More info:\n+* [Introducing Skaffold: Easy and repeatable Kubernetes development](https://cloudplatform.googleblog.com/2018/03/introducing-Skaffold-Easy-and-repeatable-Kubernetes-development.html)\n+* [Getting Started Guide](https://github.com/GoogleCloudPlatform/skaffold#getting-started-with-local-tooling)\n+\n+### Squash\n+[Squash](https://github.com/solo-io/squash) consists of a debug server that is fully integrated with Kubernetes, and a IDE plugin. It allows you to insert breakpoints and do all the fun stuff you are used to doing when debugging an application using an IDE. It bridges IDE debugging experience with your Kubernetes cluster by allowing you to attach the debugger to a pod running in your Kubernetes cluster.\n+\n+Implications:\n+* Can be use independently of other tools you chose\n+* Requires a privileged DaemonSet\n+* Integrates with popular IDEs\n+* Supports Go, Python, Node.js, Java and gdb\n+* User must ensure application binaries inside the container image are compiled with debug symbols\n+* Can be used in combination with any other tools described here\n+* It can be used with either local or remote Kubernetes cluster\n+\n+More info:\n+* Squash: A Debugger for Kubernetes Apps\n+* Getting Started Guide\n+\n+### Telepresence\n+\n+[Telepresence](https://www.telepresence.io/) connects containers running on developer’s workstation with a remote Kubernetes cluster using a two-way proxy and emulates in-cluster environment as well as provides access to config maps and secrets. It aims to improve iteration time for container app development by eliminating the need for deploying app to the cluster and leverages local container to abstract network and filesystem interface in order to make it appear as if the app was running in the cluster.\n+\n+Implications:\n+* It can be used independently of other tools you chose\n+* Using together with Squash is possible, although Squash would have to be used for pods in the cluster, while conventional/local debugger would need to be used for debugging local container that’s connected to the cluster via Telepresence\n+* Telepresence imposes some network latency\n+* It provides connectivity via a side-car process - sshuttle, which is based on SSH\n+* More intrusive dependency injection mode with LD_PRELOAD/DYLD_INSERT_LIBRARIES is also available\n+* It is most commonly used with a remote Kubernetes cluster, but can be used with a local one also\n+\n+More info:\n+* [Telepresence: fast, realistic local development for Kubernetes microservices](https://www.telepresence.io/)\n+* [Getting Started Guide](https://www.telepresence.io/tutorials/docker)\n+* [How It Works](https://www.telepresence.io/discussion/how-it-works)\n+\n+### Ksync\n+\n+[Ksync](https://github.com/vapor-ware/ksync) synchronizes application code (and configuration) between your local machine and the container running in Kubernetes, akin to what [oc rsync](https://docs.openshift.com/container-platform/3.9/dev_guide/copy_files_to_container.html) does in OpenShift. It aims to improve iteration time for app development by eliminating build and deployment steps.\n+\n+Implications:\n+* It bypasses container image build and revision control\n+* Compiled language users have to run builds inside the pod (TBC)\n+* Two-way sync – remote files are copied to local directory\n+* Container is restarted each time remote filesystem is updated\n+* No security features – development only\n+* Utilizes [Syncthing](https://github.com/syncthing/syncthing), a Go library for peer-to-peer sync\n+* Requires a privileged DaemonSet running in the cluster\n+* Node has to use Docker with overlayfs2 – no other CRI implementations are supported at the time of writing\n+\n+More info:\n+* [Getting Started Guide](https://github.com/vapor-ware/ksync#getting-started)\n+* [How It Works](https://github.com/vapor-ware/ksync/blob/master/docs/architecture.md)\n+* [Katacoda scenario to try out ksync in your browser](https://www.katacoda.com/vaporio/scenarios/ksync)\n+* [Syncthing Specification](https://docs.syncthing.net/specs/)\n+\n+## Hands-on walkthroughs\n+\n+The app we will be using for the hands-on walkthroughs of the tools in the following is a simple [stock market simulator](https://github.com/kubernauts/dok-example-us), consisting of two microservices:\n+\n+* The `stock-gen` microservice is written in Go and generates stock data randomly and exposes it via HTTP endpoint `/stockdata`.\n+‎* A second microservice, `stock-con` is a Node.js app that consumes the stream of stock data from `stock-gen` and provides an aggregation in form of a moving average via the HTTP endpoint `/average/$SYMBOL` as well as a health-check endpoint at `/healthz`.\n+\n+Overall, the default setup of the app looks as follows:\n+\n+![Default Setup](/images/blog-logging/2018-04-25-developing-on-kubernetes/dok-architecture_preview.png)\n+\n+In the following we’ll do a hands-on walkthrough for a representative selection of tools discussed above: ksync, Minikube with local build, as well as Skaffold. For each of the tools we do the following:\n+\n+* Set up the respective tool incl. preparations for the deployment and local consumption of the `stock-con` microservice.\n+* Perform a code update, that is, change the source code of the `/healthz` endpoint in the `stock-con` microservice and observe the updates.\n+\n+Note that for the target Kubernetes cluster we’ve been using Minikube locally, but you can also a remote cluster for ksync and Skaffold if you want to follow along.\n+\n+## Walkthrough: ksync\n+\n+As a preparation, install [ksync](https://vapor-ware.github.io/ksync/#installation) and then carry out the following steps to prepare the development setup:\n+\n+```\n+$ mkdir -p $(pwd)/ksync\n+$ kubectl create namespace dok\n+$ ksync init -n dok\n+```\n+With the basic setup completed we're ready to tell ksync’s local client to watch a certain Kubernetes namespace and then we create a spec to define what we want to sync (the directory `$(pwd)/ksync` locally with `/app` in the container). Note that target pod is specified via the selector parameter:\n+\n+```\n+$ ksync watch -n dok\n+$ ksync create -n dok --selector=app=stock-con $(pwd)/ksync /app\n+$ ksync get -n dok\n+```\n+\n+Now we deploy the stock generator and the stock consumer microservice:\n+\n+```\n+$ kubectl -n=dok apply \\\n+      -f https://raw.githubusercontent.com/kubernauts/dok-example-us/master/stock-gen/app.yaml\n+$ kubectl -n=dok apply \\\n+      -f https://raw.githubusercontent.com/kubernauts/dok-example-us/master/stock-con/app.yaml\n+```\n+\n+Once both deployments are created and the pods are running, we forward the `stock-con` service for local consumption (in a separate terminal session):\n+\n+```\n+$ kubectl get -n dok po --selector=app=stock-con  \\\n+                     -o=custom-columns=:metadata.name --no-headers |  \\\n+                     xargs -IPOD kubectl -n dok port-forward POD 9898:9898\n+```\n+\n+With that we should be able to consume the `stock-con` service from our local machine; we do this by regularly checking the response of the `healthz` endpoint like so (in a separate terminal session):\n+\n+```\n+$ watch curl localhost:9898/healthz\n+```\n+\n+Now change the code in the `ksync/stock-con`directory, for example update the [/healthz endpoint code in service.js](https://github.com/kubernauts/dok-example-us/blob/2334ee8fb11f8813370122bd46285cf45bdd4c48/stock-con/service.js#L52) by adding a field to the JSON response and observe how the pod gets updated and the response of the `curl localhost:9898/healthz` command changes. Overall you should have something like the following in the end:\n+\n+![Preview](/images/blog-logging/2018-04-25-developing-on-kubernetes/dok-ksync_preview.png)\n+\n+### Walkthrough: Minikube with local build\n+\n+For the following you will need to have Minikube up and running and we will leverage the Minikube-internal Docker daemon for building images, locally. As a preparation, do the following\n+\n+```\n+$ git clone https://github.com/kubernauts/dok-example-us.git && cd dok-example-us\n+$ eval $(minikube docker-env)\n+$ kubectl create namespace dok\n+```\n+\n+Now we deploy the stock generator and the stock consumer microservice:\n+\n+```\n+$ kubectl -n=dok apply -f stock-gen/app.yaml\n+$ kubectl -n=dok apply -f stock-con/app.yaml\n+```\n+Once both deployments are created and the pods are running, we forward the `stock-con` service for local consumption (in a separate terminal session) and check the response of the `healthz` endpoint:\n+\n+```\n+$ kubectl get -n dok po --selector=app=stock-con  \\\n+                     -o=custom-columns=:metadata.name --no-headers |  \\\n+                     xargs -IPOD kubectl -n dok port-forward POD 9898:9898 &\n+$ watch curl localhost:9898/healthz\n+```\n+\n+Now change the code in the `stock-con`directory, for example, update the []/healthz endpoint code in service.js](https://github.com/kubernauts/dok-example-us/blob/2334ee8fb11f8813370122bd46285cf45bdd4c48/stock-con/service.js#L52) by adding a field to the JSON response. Once you’re done with your code update, the last step is to build a new container image and kick off a new deployment like shown below:","path":"blog/_posts/2018-05-02-developing-on-kubernetes.md","position":218,"original_position":218,"commit_id":"56937c97da7dccc20c231c532ab987b788f4eb91","original_commit_id":"56937c97da7dccc20c231c532ab987b788f4eb91","user":{"login":"errordeveloper","id":251467,"avatar_url":"https://avatars1.githubusercontent.com/u/251467?v=4","gravatar_id":"","url":"https://api.github.com/users/errordeveloper","html_url":"https://github.com/errordeveloper","followers_url":"https://api.github.com/users/errordeveloper/followers","following_url":"https://api.github.com/users/errordeveloper/following{/other_user}","gists_url":"https://api.github.com/users/errordeveloper/gists{/gist_id}","starred_url":"https://api.github.com/users/errordeveloper/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/errordeveloper/subscriptions","organizations_url":"https://api.github.com/users/errordeveloper/orgs","repos_url":"https://api.github.com/users/errordeveloper/repos","events_url":"https://api.github.com/users/errordeveloper/events{/privacy}","received_events_url":"https://api.github.com/users/errordeveloper/received_events","type":"User","site_admin":false},"body":"Why? it works for me, and it pins to a commit, so it won't change under normal circumstances.","created_at":"2018-04-26T09:45:14Z","updated_at":"2018-04-26T09:45:14Z","html_url":"https://github.com/kubernetes/website/pull/8193#discussion_r184330644","pull_request_url":"https://api.github.com/repos/kubernetes/website/pulls/8193","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/website/pulls/comments/184330644"},"html":{"href":"https://github.com/kubernetes/website/pull/8193#discussion_r184330644"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/website/pulls/8193"}},"in_reply_to_id":184262288},"pull_request":{"url":"https://api.github.com/repos/kubernetes/website/pulls/8193","id":184193525,"html_url":"https://github.com/kubernetes/website/pull/8193","diff_url":"https://github.com/kubernetes/website/pull/8193.diff","patch_url":"https://github.com/kubernetes/website/pull/8193.patch","issue_url":"https://api.github.com/repos/kubernetes/website/issues/8193","number":8193,"state":"open","locked":false,"title":"Adding Blog Post: Developing on Kubernetes","user":{"login":"kbarnard10","id":12855623,"avatar_url":"https://avatars0.githubusercontent.com/u/12855623?v=4","gravatar_id":"","url":"https://api.github.com/users/kbarnard10","html_url":"https://github.com/kbarnard10","followers_url":"https://api.github.com/users/kbarnard10/followers","following_url":"https://api.github.com/users/kbarnard10/following{/other_user}","gists_url":"https://api.github.com/users/kbarnard10/gists{/gist_id}","starred_url":"https://api.github.com/users/kbarnard10/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kbarnard10/subscriptions","organizations_url":"https://api.github.com/users/kbarnard10/orgs","repos_url":"https://api.github.com/users/kbarnard10/repos","events_url":"https://api.github.com/users/kbarnard10/events{/privacy}","received_events_url":"https://api.github.com/users/kbarnard10/received_events","type":"User","site_admin":false},"body":"cc // @errordeveloper @mhausenblas","created_at":"2018-04-25T23:58:16Z","updated_at":"2018-04-26T09:45:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e9d3e1d95e27535aac8192176a8e26e27a63ffe9","assignee":{"login":"natekartchner","id":30243888,"avatar_url":"https://avatars1.githubusercontent.com/u/30243888?v=4","gravatar_id":"","url":"https://api.github.com/users/natekartchner","html_url":"https://github.com/natekartchner","followers_url":"https://api.github.com/users/natekartchner/followers","following_url":"https://api.github.com/users/natekartchner/following{/other_user}","gists_url":"https://api.github.com/users/natekartchner/gists{/gist_id}","starred_url":"https://api.github.com/users/natekartchner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/natekartchner/subscriptions","organizations_url":"https://api.github.com/users/natekartchner/orgs","repos_url":"https://api.github.com/users/natekartchner/repos","events_url":"https://api.github.com/users/natekartchner/events{/privacy}","received_events_url":"https://api.github.com/users/natekartchner/received_events","type":"User","site_admin":false},"assignees":[{"login":"zacharysarah","id":3210446,"avatar_url":"https://avatars1.githubusercontent.com/u/3210446?v=4","gravatar_id":"","url":"https://api.github.com/users/zacharysarah","html_url":"https://github.com/zacharysarah","followers_url":"https://api.github.com/users/zacharysarah/followers","following_url":"https://api.github.com/users/zacharysarah/following{/other_user}","gists_url":"https://api.github.com/users/zacharysarah/gists{/gist_id}","starred_url":"https://api.github.com/users/zacharysarah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zacharysarah/subscriptions","organizations_url":"https://api.github.com/users/zacharysarah/orgs","repos_url":"https://api.github.com/users/zacharysarah/repos","events_url":"https://api.github.com/users/zacharysarah/events{/privacy}","received_events_url":"https://api.github.com/users/zacharysarah/received_events","type":"User","site_admin":false},{"login":"SarahKConway","id":8697216,"avatar_url":"https://avatars3.githubusercontent.com/u/8697216?v=4","gravatar_id":"","url":"https://api.github.com/users/SarahKConway","html_url":"https://github.com/SarahKConway","followers_url":"https://api.github.com/users/SarahKConway/followers","following_url":"https://api.github.com/users/SarahKConway/following{/other_user}","gists_url":"https://api.github.com/users/SarahKConway/gists{/gist_id}","starred_url":"https://api.github.com/users/SarahKConway/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SarahKConway/subscriptions","organizations_url":"https://api.github.com/users/SarahKConway/orgs","repos_url":"https://api.github.com/users/SarahKConway/repos","events_url":"https://api.github.com/users/SarahKConway/events{/privacy}","received_events_url":"https://api.github.com/users/SarahKConway/received_events","type":"User","site_admin":false},{"login":"natekartchner","id":30243888,"avatar_url":"https://avatars1.githubusercontent.com/u/30243888?v=4","gravatar_id":"","url":"https://api.github.com/users/natekartchner","html_url":"https://github.com/natekartchner","followers_url":"https://api.github.com/users/natekartchner/followers","following_url":"https://api.github.com/users/natekartchner/following{/other_user}","gists_url":"https://api.github.com/users/natekartchner/gists{/gist_id}","starred_url":"https://api.github.com/users/natekartchner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/natekartchner/subscriptions","organizations_url":"https://api.github.com/users/natekartchner/orgs","repos_url":"https://api.github.com/users/natekartchner/repos","events_url":"https://api.github.com/users/natekartchner/events{/privacy}","received_events_url":"https://api.github.com/users/natekartchner/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"idvoretskyi","id":118459,"avatar_url":"https://avatars2.githubusercontent.com/u/118459?v=4","gravatar_id":"","url":"https://api.github.com/users/idvoretskyi","html_url":"https://github.com/idvoretskyi","followers_url":"https://api.github.com/users/idvoretskyi/followers","following_url":"https://api.github.com/users/idvoretskyi/following{/other_user}","gists_url":"https://api.github.com/users/idvoretskyi/gists{/gist_id}","starred_url":"https://api.github.com/users/idvoretskyi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/idvoretskyi/subscriptions","organizations_url":"https://api.github.com/users/idvoretskyi/orgs","repos_url":"https://api.github.com/users/idvoretskyi/repos","events_url":"https://api.github.com/users/idvoretskyi/events{/privacy}","received_events_url":"https://api.github.com/users/idvoretskyi/received_events","type":"User","site_admin":false},{"login":"bradtopol","id":6720670,"avatar_url":"https://avatars1.githubusercontent.com/u/6720670?v=4","gravatar_id":"","url":"https://api.github.com/users/bradtopol","html_url":"https://github.com/bradtopol","followers_url":"https://api.github.com/users/bradtopol/followers","following_url":"https://api.github.com/users/bradtopol/following{/other_user}","gists_url":"https://api.github.com/users/bradtopol/gists{/gist_id}","starred_url":"https://api.github.com/users/bradtopol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bradtopol/subscriptions","organizations_url":"https://api.github.com/users/bradtopol/orgs","repos_url":"https://api.github.com/users/bradtopol/repos","events_url":"https://api.github.com/users/bradtopol/events{/privacy}","received_events_url":"https://api.github.com/users/bradtopol/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":764237957,"url":"https://api.github.com/repos/kubernetes/website/labels/do-not-merge/hold","name":"do-not-merge/hold","color":"e11d21","default":false},{"id":679457866,"url":"https://api.github.com/repos/kubernetes/website/labels/size/L","name":"size/L","color":"ee9900","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/website/pulls/8193/commits","review_comments_url":"https://api.github.com/repos/kubernetes/website/pulls/8193/comments","review_comment_url":"https://api.github.com/repos/kubernetes/website/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/website/issues/8193/comments","statuses_url":"https://api.github.com/repos/kubernetes/website/statuses/56937c97da7dccc20c231c532ab987b788f4eb91","head":{"label":"kbarnard10:developing-on-k8s","ref":"developing-on-k8s","sha":"56937c97da7dccc20c231c532ab987b788f4eb91","user":{"login":"kbarnard10","id":12855623,"avatar_url":"https://avatars0.githubusercontent.com/u/12855623?v=4","gravatar_id":"","url":"https://api.github.com/users/kbarnard10","html_url":"https://github.com/kbarnard10","followers_url":"https://api.github.com/users/kbarnard10/followers","following_url":"https://api.github.com/users/kbarnard10/following{/other_user}","gists_url":"https://api.github.com/users/kbarnard10/gists{/gist_id}","starred_url":"https://api.github.com/users/kbarnard10/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kbarnard10/subscriptions","organizations_url":"https://api.github.com/users/kbarnard10/orgs","repos_url":"https://api.github.com/users/kbarnard10/repos","events_url":"https://api.github.com/users/kbarnard10/events{/privacy}","received_events_url":"https://api.github.com/users/kbarnard10/received_events","type":"User","site_admin":false},"repo":{"id":131075494,"name":"website","full_name":"kbarnard10/website","owner":{"login":"kbarnard10","id":12855623,"avatar_url":"https://avatars0.githubusercontent.com/u/12855623?v=4","gravatar_id":"","url":"https://api.github.com/users/kbarnard10","html_url":"https://github.com/kbarnard10","followers_url":"https://api.github.com/users/kbarnard10/followers","following_url":"https://api.github.com/users/kbarnard10/following{/other_user}","gists_url":"https://api.github.com/users/kbarnard10/gists{/gist_id}","starred_url":"https://api.github.com/users/kbarnard10/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kbarnard10/subscriptions","organizations_url":"https://api.github.com/users/kbarnard10/orgs","repos_url":"https://api.github.com/users/kbarnard10/repos","events_url":"https://api.github.com/users/kbarnard10/events{/privacy}","received_events_url":"https://api.github.com/users/kbarnard10/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kbarnard10/website","description":"Kubernetes website and documentation repo: ","fork":true,"url":"https://api.github.com/repos/kbarnard10/website","forks_url":"https://api.github.com/repos/kbarnard10/website/forks","keys_url":"https://api.github.com/repos/kbarnard10/website/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kbarnard10/website/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kbarnard10/website/teams","hooks_url":"https://api.github.com/repos/kbarnard10/website/hooks","issue_events_url":"https://api.github.com/repos/kbarnard10/website/issues/events{/number}","events_url":"https://api.github.com/repos/kbarnard10/website/events","assignees_url":"https://api.github.com/repos/kbarnard10/website/assignees{/user}","branches_url":"https://api.github.com/repos/kbarnard10/website/branches{/branch}","tags_url":"https://api.github.com/repos/kbarnard10/website/tags","blobs_url":"https://api.github.com/repos/kbarnard10/website/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kbarnard10/website/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kbarnard10/website/git/refs{/sha}","trees_url":"https://api.github.com/repos/kbarnard10/website/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kbarnard10/website/statuses/{sha}","languages_url":"https://api.github.com/repos/kbarnard10/website/languages","stargazers_url":"https://api.github.com/repos/kbarnard10/website/stargazers","contributors_url":"https://api.github.com/repos/kbarnard10/website/contributors","subscribers_url":"https://api.github.com/repos/kbarnard10/website/subscribers","subscription_url":"https://api.github.com/repos/kbarnard10/website/subscription","commits_url":"https://api.github.com/repos/kbarnard10/website/commits{/sha}","git_commits_url":"https://api.github.com/repos/kbarnard10/website/git/commits{/sha}","comments_url":"https://api.github.com/repos/kbarnard10/website/comments{/number}","issue_comment_url":"https://api.github.com/repos/kbarnard10/website/issues/comments{/number}","contents_url":"https://api.github.com/repos/kbarnard10/website/contents/{+path}","compare_url":"https://api.github.com/repos/kbarnard10/website/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kbarnard10/website/merges","archive_url":"https://api.github.com/repos/kbarnard10/website/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kbarnard10/website/downloads","issues_url":"https://api.github.com/repos/kbarnard10/website/issues{/number}","pulls_url":"https://api.github.com/repos/kbarnard10/website/pulls{/number}","milestones_url":"https://api.github.com/repos/kbarnard10/website/milestones{/number}","notifications_url":"https://api.github.com/repos/kbarnard10/website/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kbarnard10/website/labels{/name}","releases_url":"https://api.github.com/repos/kbarnard10/website/releases{/id}","deployments_url":"https://api.github.com/repos/kbarnard10/website/deployments","created_at":"2018-04-25T23:43:25Z","updated_at":"2018-04-25T23:43:30Z","pushed_at":"2018-04-25T23:56:55Z","git_url":"git://github.com/kbarnard10/website.git","ssh_url":"git@github.com:kbarnard10/website.git","clone_url":"https://github.com/kbarnard10/website.git","svn_url":"https://github.com/kbarnard10/website","homepage":"https://kubernetes.io","size":91140,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"cc-by-4.0","name":"Creative Commons Attribution 4.0","spdx_id":"CC-BY-4.0","url":"https://api.github.com/licenses/cc-by-4.0"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"945d81fdb6ce235b7af0af4d26007e7db59d1019","user":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars2.githubusercontent.com/u/13629408?v=4","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":51478266,"name":"website","full_name":"kubernetes/website","owner":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars2.githubusercontent.com/u/13629408?v=4","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/website","description":"Kubernetes website and documentation repo: ","fork":false,"url":"https://api.github.com/repos/kubernetes/website","forks_url":"https://api.github.com/repos/kubernetes/website/forks","keys_url":"https://api.github.com/repos/kubernetes/website/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/website/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/website/teams","hooks_url":"https://api.github.com/repos/kubernetes/website/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/website/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/website/events","assignees_url":"https://api.github.com/repos/kubernetes/website/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/website/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/website/tags","blobs_url":"https://api.github.com/repos/kubernetes/website/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/website/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/website/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/website/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/website/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/website/languages","stargazers_url":"https://api.github.com/repos/kubernetes/website/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/website/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/website/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/website/subscription","commits_url":"https://api.github.com/repos/kubernetes/website/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/website/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/website/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/website/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/website/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/website/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/website/merges","archive_url":"https://api.github.com/repos/kubernetes/website/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/website/downloads","issues_url":"https://api.github.com/repos/kubernetes/website/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/website/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/website/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/website/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/website/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/website/releases{/id}","deployments_url":"https://api.github.com/repos/kubernetes/website/deployments","created_at":"2016-02-10T22:46:48Z","updated_at":"2018-04-26T04:33:09Z","pushed_at":"2018-04-26T08:23:59Z","git_url":"git://github.com/kubernetes/website.git","ssh_url":"git@github.com:kubernetes/website.git","clone_url":"https://github.com/kubernetes/website.git","svn_url":"https://github.com/kubernetes/website","homepage":"https://kubernetes.io","size":120393,"stargazers_count":465,"watchers_count":465,"language":"HTML","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2435,"mirror_url":null,"archived":false,"open_issues_count":366,"license":{"key":"cc-by-4.0","name":"Creative Commons Attribution 4.0","spdx_id":"CC-BY-4.0","url":"https://api.github.com/licenses/cc-by-4.0"},"forks":2435,"open_issues":366,"watchers":465,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/website/pulls/8193"},"html":{"href":"https://github.com/kubernetes/website/pull/8193"},"issue":{"href":"https://api.github.com/repos/kubernetes/website/issues/8193"},"comments":{"href":"https://api.github.com/repos/kubernetes/website/issues/8193/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/website/pulls/8193/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/website/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/website/pulls/8193/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/website/statuses/56937c97da7dccc20c231c532ab987b788f4eb91"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"errordeveloper"}}