{"action":"created","comment":{"url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/comments/86777492","pull_request_review_id":7416744,"id":86777492,"diff_hunk":"@@ -0,0 +1,465 @@\n+---\n+layout: post\n+title: \"How to set up a HA Kubernetes cluster: worker components and SkyDNS\"\n+date: \"2016-11-08 07:16:17\"\n+image: blog-header/kubernetes-worker-logo.jpg\n+categories: tech-stories\n+authors: [\"Karsten P.\"]\n+---\n+\n+The fourth part of this blog post series deals with the worker nodes.\n+Due to their role it is easier to install worker nodes than master nodes.\n+They also need client certificates to connect to the API server.\n+\n+## Certificates\n+\n+Worker certificates are also created per node.\n+They are structured as easy as _Etcd_ client certificates.\n+\n+{% highlight bash %}\n+root@worker:~$ mkdir -p /etc/kubernetes/ssl\n+root@worker:~$ cd /etc/kubernetes/ssl\n+root@worker:/etc/kubernetes/ssl$ cat > openssl.cnf << \"EOF\"\n+[req]\n+req_extensions = v3_req\n+distinguished_name = req_distinguished_name\n+[req_distinguished_name]\n+[ v3_req ]\n+basicConstraints = CA:FALSE\n+keyUsage = nonRepudiation, digitalSignature, keyEncipherment\n+subjectAltName = @alt_names\n+[alt_names]\n+IP.1 = $ENV::WORKER_IP\n+EOF\n+root@worker:/etc/kubernetes/ssl$ openssl genrsa -out worker.key 2048\n+root@worker:/etc/kubernetes/ssl$ chmod 600 worker.key\n+root@worker:/etc/kubernetes/ssl$ export WORKER_IP=192.168.2.[1|2|3]\n+root@worker:/etc/kubernetes/ssl$ openssl \\\n+  req -new \\\n+  -key worker.key \\\n+  -out worker.csr \\\n+  -subj \"/CN=$(hostname -s)\" \\\n+  -extensions v3_req \\\n+  -config openssl.cnf \\\n+  -sha256\n+root@worker:/etc/kubernetes/ssl$ scp openssl.cnf worker.csr root@root-ca-host:\n+{% endhighlight %}\n+\n+The creation is done by analogy with the certificates of the _Etcd_ clients.\n+\n+{% highlight bash %}\n+root@root-ca-host:~$ export WORKER_IP=192.168.2.[1|2|3]\n+root@root-ca-host:~$ openssl x509 \\\n+  -req \\\n+  -CA ca.crt \\\n+  -CAkey ca.key \\\n+  -CAcreateserial \\\n+  -in worker.csr \\\n+  -out worker.crt \\\n+  -days 365 \\\n+  -extensions v3_req \\\n+  -extfile openssl.cnf \\\n+  -sha256\n+root@root-ca-host:~$ scp worker.crt root@worker:/etc/kubernetes/ssl\n+{% endhighlight %}\n+\n+Since the worker nodes already got the root CA certificate (for _flanneld_) they should have the following certificates at this stage:\n+\n+{% highlight bash %}\n+root@worker:/etc/kubernetes/ssl$ ls -la\n+-rw-r--r-- 1 root root 1179 Jun  1 20:54 worker.crt\n+-rw------- 1 root root 1675 Jun  1 20:54 worker.key\n+root@worker:/etc/ssl/etcd/$ ls -la\n+-rw-r--r--  1 root root 1418 Jun  1 16:13 ca.crt\n+-rw-r--r--  1 root root 1203 Jun  1 16:13 etcd-client.crt\n+-rw-------  1 root root 1679 Jun  1 16:12 etcd-client.key\n+{% endhighlight %}\n+\n+## kubeconfig\n+\n+Now the _YAML_ file is created which will be used by _kubelet_ and _kube-proxy_.\n+It determines where the previously created certificates are located.\n+\n+{% highlight bash %}\n+root@worker:~$ cat > /etc/kubernetes/worker-kubeconfig.yaml << EOF\n+apiVersion: v1\n+kind: Config\n+clusters:\n+- name: local\n+  cluster:\n+    certificate-authority: /etc/ssl/etcd/ca.crt\n+users:\n+- name: kubelet\n+  user:\n+    client-certificate: /etc/kubernetes/ssl/worker.crt\n+    client-key: /etc/kubernetes/ssl/worker.key\n+contexts:\n+- context:\n+    cluster: local\n+    user: kubelet\n+  name: kubelet-context\n+current-context: kubelet-context\n+EOF\n+{% endhighlight %}\n+\n+## Kubelet\n+\n+_kubelet_ is running on the worker nodes too.\n+The configuration is different to the one of the master nodes.\n+Yet, the installation is done in the same way as described in [the second part of this blog post series](https://developer.epages.com/blog/2016/09/08/kubernetes-preparing-nodes.html).\n+\n+{% highlight bash %}\n+root@worker:~$ cat > /etc/systemd/system/kubelet.service << EOF\n+[Unit]\n+Description=The primary agent to run pods\n+Documentation=http://kubernetes.io/docs/admin/kubelet/\n+Requires=networking.service\n+After=docker.service\n+\n+[Service]\n+ExecStart=/usr/local/bin/kubelet \\\\\n+  --api-servers=https://loadbalancer.example.com \\\\\n+  --register-node=true \\\\\n+  --register-schedulable=true \\\\\n+  --allow-privileged=true \\\\\n+  --config=/etc/kubernetes/manifests \\\\\n+  --cluster-dns=10.3.0.2 \\\\\n+  --cluster-domain=cluster.local \\\\\n+  --kubeconfig=/etc/kubernetes/worker-kubeconfig.yaml \\\\\n+  --tls-cert-file=/etc/kubernetes/ssl/worker.crt \\\\\n+  --tls-private-key-file=/etc/kubernetes/ssl/worker.key \\\\\n+  --housekeeping-interval=60s\n+Restart=always\n+RestartSec=10\n+[Install]\n+WantedBy=multi-user.target\n+EOF\n+root@worker:~$ systemctl enable kubelet\n+{% endhighlight %}\n+\n+As described in [the setup of the master components](https://developer.epages.com/blog/2016/10/18/kubernetes-master-components.html) _kubelet_ and _kube-proxy_ are affected by [an error](https://github.com/kubernetes/kubernetes/issues/18174).\n+Therefore we do not insert a comma separated list of API servers but only the load balancer's URL in the parameter _api-servers_.\n+Unlike the master nodes on the worker nodes shall run the real application pods.\n+As a consequence _kubelet_ registers its own node within the API as \"schedulable\".\n+\n+## Kube-proxy\n+\n+The load balancer's URL is also registered in the pod definition of the service _kube-proxy_ of the worker nodes.\n+\n+{% highlight bash %}\n+root@worker:~$ cat > /etc/kubernetes/manifests/kube-proxy << EOF\n+apiVersion: v1\n+kind: Pod\n+metadata:\n+  name: kube-proxy\n+  namespace: kube-system\n+spec:\n+  hostNetwork: true\n+  containers:\n+  - name: kube-proxy\n+    image: quay.io/coreos/hyperkube:v1.2.2_coreos.0\n+    command:\n+    - /hyperkube\n+    - proxy\n+    - --master=https://loadbalancer.example.com\n+    - --kubeconfig=/etc/kubernetes/worker-kubeconfig.yaml\n+    - --proxy-mode=iptables\n+    securityContext:\n+      privileged: true\n+    volumeMounts:\n+      - mountPath: /etc/ssl/certs\n+        name: \"ssl-certs\"\n+      - mountPath: /etc/kubernetes/worker-kubeconfig.yaml\n+        name: \"kubeconfig\"\n+        readOnly: true\n+      - mountPath: /etc/kubernetes/ssl\n+        name: \"etc-kube-ssl\"\n+        readOnly: true\n+      - mountPath: /etc/ssl/etcd\n+        name: \"etcd-kube-ca\"\n+        readOnly: true\n+  volumes:\n+    - name: \"ssl-certs\"\n+      hostPath:\n+        path: \"/usr/share/ca-certificates\"\n+    - name: \"kubeconfig\"\n+      hostPath:\n+        path: \"/etc/kubernetes/worker-kubeconfig.yaml\"\n+    - name: \"etc-kube-ssl\"\n+      hostPath:\n+        path: \"/etc/kubernetes/ssl\"\n+    - name: \"etcd-kube-ca\"\n+      hostPath:\n+        path: \"/etc/ssl/etcd\"\n+EOF\n+{% endhighlight %}\n+\n+At this place a vulnerability of the HA cluster can be found.\n+Normally, the load balancer has to be failure-resistant too, because it is the only connection from the worker to the master nodes.\n+But since this would go beyond the constraints of this article, we simply refer to [this older documentation](https://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-keepalived-on-debian-lenny).\n+Now, that the _kube-proxy_ pod is created, the worker nodes are ready for operation.\n+Based on _flanneld_ and the _docker engine_, _kubelet_ is started with the following command:\n+\n+{% highlight bash %}\n+root@worker:~$ systemctl start kubelet\n+{% endhighlight %}\n+\n+Analogous to the master nodes, _kubelet_ now starts transferring the pod definitions from _/etc/kubernetes/manifests_ into containers.\n+\n+{% highlight bash %}\n+root@worker:~$ docker ps\n+ID  IMAGE             COMMAND                  CREATED              STATUS              NAMES\n+b9  v1.2.2_coreos.0   \"/hyperkube proxy --m\"   About a minute ago   Up About a minute   kube-proxy\n+16  pause:2.0         \"/pause\"                 2 minutes ago        Up About a minute   POD\n+{% endhighlight %}\n+\n+## kubectl\n+\n+[kubectl](http://kubernetes.io/docs/user-guide/kubectl-overview/) is the administration tool for the cluster.\n+It is running on your local computer and interacts via Kubernetes API with the cluster.\n+Among others, it enables you to create new pods using YAML files on your local machine.\n+Please note that YAML files on the Kubernetes nodes (so called \"static pods\") cannot be administrated via _kebectl_.","path":"_posts/2016/2016-11-08-kubernetes-worker-components-and-skydns.md","position":221,"original_position":221,"commit_id":"ee0a900ab2508b8e7cfb5f2dcb6d170b578c72f7","original_commit_id":"ee0a900ab2508b8e7cfb5f2dcb6d170b578c72f7","user":{"login":"BirgitBader","id":10460958,"avatar_url":"https://avatars.githubusercontent.com/u/10460958?v=3","gravatar_id":"","url":"https://api.github.com/users/BirgitBader","html_url":"https://github.com/BirgitBader","followers_url":"https://api.github.com/users/BirgitBader/followers","following_url":"https://api.github.com/users/BirgitBader/following{/other_user}","gists_url":"https://api.github.com/users/BirgitBader/gists{/gist_id}","starred_url":"https://api.github.com/users/BirgitBader/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BirgitBader/subscriptions","organizations_url":"https://api.github.com/users/BirgitBader/orgs","repos_url":"https://api.github.com/users/BirgitBader/repos","events_url":"https://api.github.com/users/BirgitBader/events{/privacy}","received_events_url":"https://api.github.com/users/BirgitBader/received_events","type":"User","site_admin":false},"body":"Note that...","created_at":"2016-11-07T13:47:01Z","updated_at":"2016-11-07T13:47:01Z","html_url":"https://github.com/ePages-de/epages-docs/pull/664#discussion_r86777492","pull_request_url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/664","_links":{"self":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/comments/86777492"},"html":{"href":"https://github.com/ePages-de/epages-docs/pull/664#discussion_r86777492"},"pull_request":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/664"}}},"pull_request":{"url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/664","id":92577753,"html_url":"https://github.com/ePages-de/epages-docs/pull/664","diff_url":"https://github.com/ePages-de/epages-docs/pull/664.diff","patch_url":"https://github.com/ePages-de/epages-docs/pull/664.patch","issue_url":"https://api.github.com/repos/ePages-de/epages-docs/issues/664","number":664,"state":"open","locked":false,"title":"Add blog post on Kubernetes ","user":{"login":"roseritter","id":22371455,"avatar_url":"https://avatars.githubusercontent.com/u/22371455?v=3","gravatar_id":"","url":"https://api.github.com/users/roseritter","html_url":"https://github.com/roseritter","followers_url":"https://api.github.com/users/roseritter/followers","following_url":"https://api.github.com/users/roseritter/following{/other_user}","gists_url":"https://api.github.com/users/roseritter/gists{/gist_id}","starred_url":"https://api.github.com/users/roseritter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/roseritter/subscriptions","organizations_url":"https://api.github.com/users/roseritter/orgs","repos_url":"https://api.github.com/users/roseritter/repos","events_url":"https://api.github.com/users/roseritter/events{/privacy}","received_events_url":"https://api.github.com/users/roseritter/received_events","type":"User","site_admin":false},"body":"@BirgitBader please check & merge","created_at":"2016-11-07T12:52:13Z","updated_at":"2016-11-07T13:47:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"40dcf9a5f32d18224640fa504dee1f62a8286623","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/664/commits","review_comments_url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/664/comments","review_comment_url":"https://api.github.com/repos/ePages-de/epages-docs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ePages-de/epages-docs/issues/664/comments","statuses_url":"https://api.github.com/repos/ePages-de/epages-docs/statuses/ee0a900ab2508b8e7cfb5f2dcb6d170b578c72f7","head":{"label":"roseritter:TW-462","ref":"TW-462","sha":"ee0a900ab2508b8e7cfb5f2dcb6d170b578c72f7","user":{"login":"roseritter","id":22371455,"avatar_url":"https://avatars.githubusercontent.com/u/22371455?v=3","gravatar_id":"","url":"https://api.github.com/users/roseritter","html_url":"https://github.com/roseritter","followers_url":"https://api.github.com/users/roseritter/followers","following_url":"https://api.github.com/users/roseritter/following{/other_user}","gists_url":"https://api.github.com/users/roseritter/gists{/gist_id}","starred_url":"https://api.github.com/users/roseritter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/roseritter/subscriptions","organizations_url":"https://api.github.com/users/roseritter/orgs","repos_url":"https://api.github.com/users/roseritter/repos","events_url":"https://api.github.com/users/roseritter/events{/privacy}","received_events_url":"https://api.github.com/users/roseritter/received_events","type":"User","site_admin":false},"repo":{"id":70069801,"name":"epages-docs","full_name":"roseritter/epages-docs","owner":{"login":"roseritter","id":22371455,"avatar_url":"https://avatars.githubusercontent.com/u/22371455?v=3","gravatar_id":"","url":"https://api.github.com/users/roseritter","html_url":"https://github.com/roseritter","followers_url":"https://api.github.com/users/roseritter/followers","following_url":"https://api.github.com/users/roseritter/following{/other_user}","gists_url":"https://api.github.com/users/roseritter/gists{/gist_id}","starred_url":"https://api.github.com/users/roseritter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/roseritter/subscriptions","organizations_url":"https://api.github.com/users/roseritter/orgs","repos_url":"https://api.github.com/users/roseritter/repos","events_url":"https://api.github.com/users/roseritter/events{/privacy}","received_events_url":"https://api.github.com/users/roseritter/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/roseritter/epages-docs","description":"Source of ePages Developer Portal","fork":true,"url":"https://api.github.com/repos/roseritter/epages-docs","forks_url":"https://api.github.com/repos/roseritter/epages-docs/forks","keys_url":"https://api.github.com/repos/roseritter/epages-docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/roseritter/epages-docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/roseritter/epages-docs/teams","hooks_url":"https://api.github.com/repos/roseritter/epages-docs/hooks","issue_events_url":"https://api.github.com/repos/roseritter/epages-docs/issues/events{/number}","events_url":"https://api.github.com/repos/roseritter/epages-docs/events","assignees_url":"https://api.github.com/repos/roseritter/epages-docs/assignees{/user}","branches_url":"https://api.github.com/repos/roseritter/epages-docs/branches{/branch}","tags_url":"https://api.github.com/repos/roseritter/epages-docs/tags","blobs_url":"https://api.github.com/repos/roseritter/epages-docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/roseritter/epages-docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/roseritter/epages-docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/roseritter/epages-docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/roseritter/epages-docs/statuses/{sha}","languages_url":"https://api.github.com/repos/roseritter/epages-docs/languages","stargazers_url":"https://api.github.com/repos/roseritter/epages-docs/stargazers","contributors_url":"https://api.github.com/repos/roseritter/epages-docs/contributors","subscribers_url":"https://api.github.com/repos/roseritter/epages-docs/subscribers","subscription_url":"https://api.github.com/repos/roseritter/epages-docs/subscription","commits_url":"https://api.github.com/repos/roseritter/epages-docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/roseritter/epages-docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/roseritter/epages-docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/roseritter/epages-docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/roseritter/epages-docs/contents/{+path}","compare_url":"https://api.github.com/repos/roseritter/epages-docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/roseritter/epages-docs/merges","archive_url":"https://api.github.com/repos/roseritter/epages-docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/roseritter/epages-docs/downloads","issues_url":"https://api.github.com/repos/roseritter/epages-docs/issues{/number}","pulls_url":"https://api.github.com/repos/roseritter/epages-docs/pulls{/number}","milestones_url":"https://api.github.com/repos/roseritter/epages-docs/milestones{/number}","notifications_url":"https://api.github.com/repos/roseritter/epages-docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/roseritter/epages-docs/labels{/name}","releases_url":"https://api.github.com/repos/roseritter/epages-docs/releases{/id}","deployments_url":"https://api.github.com/repos/roseritter/epages-docs/deployments","created_at":"2016-10-05T14:46:38Z","updated_at":"2016-10-05T14:46:41Z","pushed_at":"2016-11-07T12:51:18Z","git_url":"git://github.com/roseritter/epages-docs.git","ssh_url":"git@github.com:roseritter/epages-docs.git","clone_url":"https://github.com/roseritter/epages-docs.git","svn_url":"https://github.com/roseritter/epages-docs","homepage":"https://developer.epages.com/","size":191485,"stargazers_count":0,"watchers_count":0,"language":"RAML","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"ePages-de:master","ref":"master","sha":"aa5ec2dc9bb7154c03b3836b91cfe947be0cfbf3","user":{"login":"ePages-de","id":1125854,"avatar_url":"https://avatars.githubusercontent.com/u/1125854?v=3","gravatar_id":"","url":"https://api.github.com/users/ePages-de","html_url":"https://github.com/ePages-de","followers_url":"https://api.github.com/users/ePages-de/followers","following_url":"https://api.github.com/users/ePages-de/following{/other_user}","gists_url":"https://api.github.com/users/ePages-de/gists{/gist_id}","starred_url":"https://api.github.com/users/ePages-de/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ePages-de/subscriptions","organizations_url":"https://api.github.com/users/ePages-de/orgs","repos_url":"https://api.github.com/users/ePages-de/repos","events_url":"https://api.github.com/users/ePages-de/events{/privacy}","received_events_url":"https://api.github.com/users/ePages-de/received_events","type":"Organization","site_admin":false},"repo":{"id":30595510,"name":"epages-docs","full_name":"ePages-de/epages-docs","owner":{"login":"ePages-de","id":1125854,"avatar_url":"https://avatars.githubusercontent.com/u/1125854?v=3","gravatar_id":"","url":"https://api.github.com/users/ePages-de","html_url":"https://github.com/ePages-de","followers_url":"https://api.github.com/users/ePages-de/followers","following_url":"https://api.github.com/users/ePages-de/following{/other_user}","gists_url":"https://api.github.com/users/ePages-de/gists{/gist_id}","starred_url":"https://api.github.com/users/ePages-de/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ePages-de/subscriptions","organizations_url":"https://api.github.com/users/ePages-de/orgs","repos_url":"https://api.github.com/users/ePages-de/repos","events_url":"https://api.github.com/users/ePages-de/events{/privacy}","received_events_url":"https://api.github.com/users/ePages-de/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ePages-de/epages-docs","description":"Source of ePages Developer Portal","fork":false,"url":"https://api.github.com/repos/ePages-de/epages-docs","forks_url":"https://api.github.com/repos/ePages-de/epages-docs/forks","keys_url":"https://api.github.com/repos/ePages-de/epages-docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ePages-de/epages-docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ePages-de/epages-docs/teams","hooks_url":"https://api.github.com/repos/ePages-de/epages-docs/hooks","issue_events_url":"https://api.github.com/repos/ePages-de/epages-docs/issues/events{/number}","events_url":"https://api.github.com/repos/ePages-de/epages-docs/events","assignees_url":"https://api.github.com/repos/ePages-de/epages-docs/assignees{/user}","branches_url":"https://api.github.com/repos/ePages-de/epages-docs/branches{/branch}","tags_url":"https://api.github.com/repos/ePages-de/epages-docs/tags","blobs_url":"https://api.github.com/repos/ePages-de/epages-docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ePages-de/epages-docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ePages-de/epages-docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/ePages-de/epages-docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ePages-de/epages-docs/statuses/{sha}","languages_url":"https://api.github.com/repos/ePages-de/epages-docs/languages","stargazers_url":"https://api.github.com/repos/ePages-de/epages-docs/stargazers","contributors_url":"https://api.github.com/repos/ePages-de/epages-docs/contributors","subscribers_url":"https://api.github.com/repos/ePages-de/epages-docs/subscribers","subscription_url":"https://api.github.com/repos/ePages-de/epages-docs/subscription","commits_url":"https://api.github.com/repos/ePages-de/epages-docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/ePages-de/epages-docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/ePages-de/epages-docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/ePages-de/epages-docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/ePages-de/epages-docs/contents/{+path}","compare_url":"https://api.github.com/repos/ePages-de/epages-docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ePages-de/epages-docs/merges","archive_url":"https://api.github.com/repos/ePages-de/epages-docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ePages-de/epages-docs/downloads","issues_url":"https://api.github.com/repos/ePages-de/epages-docs/issues{/number}","pulls_url":"https://api.github.com/repos/ePages-de/epages-docs/pulls{/number}","milestones_url":"https://api.github.com/repos/ePages-de/epages-docs/milestones{/number}","notifications_url":"https://api.github.com/repos/ePages-de/epages-docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ePages-de/epages-docs/labels{/name}","releases_url":"https://api.github.com/repos/ePages-de/epages-docs/releases{/id}","deployments_url":"https://api.github.com/repos/ePages-de/epages-docs/deployments","created_at":"2015-02-10T14:20:56Z","updated_at":"2016-11-03T13:20:46Z","pushed_at":"2016-11-07T12:52:13Z","git_url":"git://github.com/ePages-de/epages-docs.git","ssh_url":"git@github.com:ePages-de/epages-docs.git","clone_url":"https://github.com/ePages-de/epages-docs.git","svn_url":"https://github.com/ePages-de/epages-docs","homepage":"https://developer.epages.com/","size":231876,"stargazers_count":8,"watchers_count":8,"language":"RAML","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":44,"mirror_url":null,"open_issues_count":3,"forks":44,"open_issues":3,"watchers":8,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/664"},"html":{"href":"https://github.com/ePages-de/epages-docs/pull/664"},"issue":{"href":"https://api.github.com/repos/ePages-de/epages-docs/issues/664"},"comments":{"href":"https://api.github.com/repos/ePages-de/epages-docs/issues/664/comments"},"review_comments":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/664/comments"},"review_comment":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ePages-de/epages-docs/pulls/664/commits"},"statuses":{"href":"https://api.github.com/repos/ePages-de/epages-docs/statuses/ee0a900ab2508b8e7cfb5f2dcb6d170b578c72f7"}}}}
{"actor":{"display_login":"BirgitBader"}}