{"action":"created","comment":{"url":"https://api.github.com/repos/elo7/tech-blog/pulls/comments/199586381","pull_request_review_id":133723830,"id":199586381,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5OTU4NjM4MQ==","diff_hunk":"@@ -0,0 +1,152 @@\n+---\n+title: Boas práticas na utilização do Kubernetes em produção\n+date: 2018-04-16\n+category: devops\n+layout: post\n+description: Nesse post discutiremos alguns dos vários pontos de atenção que precisamos ter ao implementar o Kubernetes em ambientes de produção\n+authors: [marcusrios]\n+tags:\n+  - devops\n+  - kubernetes\n+  - containers\n+  - AWS\n+---\n+\n+O Kubernetes é uma ferramenta para orquestração de containers extremamente consolidada no mercado e com muitos recursos que facilitam a administração e diminuem o _overhead_ operacional de se manter ambientes com containers, contudo quando falamos de ambientes de produção alguns pontos como segurança, disponibilidade, escalabilidade e outros precisam ser tratados com muito afinco para que tenhamos uma plataforma resiliente e preparada para receber cargas de trabalho em produção. A ideia desse _post_ é apresentar alguns dos vários pontos de atenção que precisamos ter na hora de implementar/utilizar nosso cluster.\n+\n+## Autenticação e autorização\n+\n+Existem várias estrátegias de [autenticação](https://kubernetes.io/docs/admin/authentication/#authentication-strategies) no Kubernetes, aqui no Elo7 usamos certificados x509 que são gerados pelo [vault](https://www.vaultproject.io/), no nosso caso a autorização é feita pelo vault com base no usuário do GitHub. Independentemente da estratégia adotada a ideia aqui é não deixar o cluster acessível sem autenticação e preferencialmente que esja adotado um mecanismo de autorização com base nas permissões que cada usuário precise.\n+\n+\n+## Liveness e Readiness probes\n+\n+Por padrão para o Kubenetes o seu container estará apto a receber requisições a partir do momento em que o pod estiver com o status de _Ready_, mas não necessariamente ele está de fato pronto para receber as requisições. Um bom exemplo disso seria de uma aplicação Java com spring que pode levar alguns segundos até carregar todas as suas dependências e iniciar a app, nesse meio tempo as requisições que forem encaminhadas para esse pod retornaram erro 500 para o [Service](https://kubernetes.io/docs/concepts/services-networking/service/) e consequentemente para o usuário. Pensando nisso existe uma técnica para garantir que o pod só receberá requisições quando a app estiver pronta, podemos fazer isso usando [readiness probe](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-readiness-probes). Vejamos abaixo um exemplo:\n+\n+```yaml\n+readinessProbe:\n+  httpGet:\n+    path: \"/health\"\n+    port: 8080\n+  initialDelaySeconds: 10\n+  periodSeconds: 5\n+  successThreshold: 3\n+```\n+\n+**initialDelaySeconds** = Números de segundos após o container ser iniciado que o kubernetes espera antes de realizar uma operação de _readiness_ ou _liveness_\n+\n+**periodSeconds** = De quanto em quanto segundos o kubernetes deve realizar uma operação de _readiness_ ou _liveness_\n+\n+**successThreshold** = Quantas vezes consecutivas o probe precisa responder com OK para ser considerado pronto para receber tráfego.\n+\n+No nosso exemplo estamos realizando um GET em `POD_IP:8080/health`\n+\n+Assim como temos o `readinessProbe` para avaliar se o pod está pronto, também temos o `livenessProbe` para dizer se o pod está vivo, ou seja, para dizer se a app está de pé ou não. O funcionamento é basicamente o mesmo do `readinessProbe`. É importante descatar que essas checagens podem ser feitas com comandos também. Vejamos um exemplo:\n+\n+```yaml\n+readinessProbe:\n+  exec:\n+    command:\n+    - test\n+    - -e\n+    - /tmp/endpoints.json\n+  initialDelaySeconds: 15\n+  periodSeconds: 30\n+```\n+\n+Nesse caso o que vai considerar esse container como saudável é a existencia do arquivo `/tmp/endpoints.json`\n+\n+## Quanto de recurso eu defino aqui?\n+\n+Por padrão se não informado nada o kubernetes irá subir seus containers sem limites para uso de CPU e memória por exemplo. Quando estamos definindo alguns objetos como [deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) temos a possibilidade de configurar valores de requests e limits na sessão de [`resources`](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/). Vejamos abaixo o que cada um significa e um exemplo de implementação:\n+\n+**requests** = Qual o valor de CPU e memória que o Kubernetes precisa reservar para o meu container ser iniciado\n+**limits** = Qual o valor máximo de CPU e memória que meu container pode consumir no Kubenetes\n+\n+\n+```yaml\n+resources:\n+  requests:\n+    memory: \"128Mi\"\n+    cpu: \"1000m\"\n+  limits:\n+    memory: \"512Mi\"\n+    cpu: \"2000m\"\n+```\n+\n+Neste caso estamos definindo 512MB de memória/2000 millicores para limits e 128 MB de memória/1000 millicores para requests. Lembrando que 1m representa 1/1000 = 0,001 de um core de CPU, assim como 500m = 500/1000 = 0,5 core de uma CPU ou 50% de uma CPU. Voltando ao nosso exemplo estamos falando para o Kubernetes reservar 1 core de uma CPU para nosso container, mas a grande pergunta é: Precisamos realmente reservar 1 core de CPU para esse container? Provavelmente a resposta vai ser não, mas a única forma de termos certeza é acompanharmos o consumo de recursos no container (podemos utilizar ferramentas como o [cAdivisor](https://github.com/google/cadvisor) e o [Prometheus](https://github.com/prometheus/prometheus) para nos ajudar nessa tarefa). O grande problema de usar valores \"altos\" na configuração das `requests` é que podemos estar superdimensionando nosso cluster, logo precisaremos de mais nodes e consequentemente teremos um desperdício de recursos, visto que o Kubernetes está pré-alocando 1 Core de CPU, mas na verdade estamos usando apenas 30% disso por exemplo. Isso pode parecer pouco, mas se pensarmos em um cenário com centenas de containers com esse mesmo perfil de configuração, ao final do mês estaremos rodando alguns nodes sem necessidade.\n+\n+## Definindo limits padrão\n+\n+Como dito anteriormente, em configurações padrões e se não for informado nada na criação do _deployment_, o kubernetes ira criar o mesmo com recursos \"ilimitados\". Para contornar essa situação o Kubernetes disponibiliza de um recurso que defini valores de `requests` e `limits` _defaults_ caso não seja informado. Isso pode ser feito utilizando o objeto [`LimitRange`](https://kubernetes.io/docs/tasks/administer-cluster/memory-default-namespace/)","path":"src/posts/boas-praticas-na-utilizacao-k8s.html.md","position":81,"original_position":81,"commit_id":"20578d4bb76713f543797f21bf4099de54b96ebb","original_commit_id":"20578d4bb76713f543797f21bf4099de54b96ebb","user":{"login":"FernandaBernardo","id":3588700,"node_id":"MDQ6VXNlcjM1ODg3MDA=","avatar_url":"https://avatars1.githubusercontent.com/u/3588700?v=4","gravatar_id":"","url":"https://api.github.com/users/FernandaBernardo","html_url":"https://github.com/FernandaBernardo","followers_url":"https://api.github.com/users/FernandaBernardo/followers","following_url":"https://api.github.com/users/FernandaBernardo/following{/other_user}","gists_url":"https://api.github.com/users/FernandaBernardo/gists{/gist_id}","starred_url":"https://api.github.com/users/FernandaBernardo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FernandaBernardo/subscriptions","organizations_url":"https://api.github.com/users/FernandaBernardo/orgs","repos_url":"https://api.github.com/users/FernandaBernardo/repos","events_url":"https://api.github.com/users/FernandaBernardo/events{/privacy}","received_events_url":"https://api.github.com/users/FernandaBernardo/received_events","type":"User","site_admin":false},"body":"> recurso que defini valores \r\n\r\n\\* define","created_at":"2018-07-02T18:39:25Z","updated_at":"2018-07-02T19:04:00Z","html_url":"https://github.com/elo7/tech-blog/pull/205#discussion_r199586381","pull_request_url":"https://api.github.com/repos/elo7/tech-blog/pulls/205","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/comments/199586381"},"html":{"href":"https://github.com/elo7/tech-blog/pull/205#discussion_r199586381"},"pull_request":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/205"}}},"pull_request":{"url":"https://api.github.com/repos/elo7/tech-blog/pulls/205","id":195519866,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk1NTE5ODY2","html_url":"https://github.com/elo7/tech-blog/pull/205","diff_url":"https://github.com/elo7/tech-blog/pull/205.diff","patch_url":"https://github.com/elo7/tech-blog/pull/205.patch","issue_url":"https://api.github.com/repos/elo7/tech-blog/issues/205","number":205,"state":"open","locked":false,"title":"[POST] Good practices k8s","user":{"login":"marcusrios","id":17992217,"node_id":"MDQ6VXNlcjE3OTkyMjE3","avatar_url":"https://avatars0.githubusercontent.com/u/17992217?v=4","gravatar_id":"","url":"https://api.github.com/users/marcusrios","html_url":"https://github.com/marcusrios","followers_url":"https://api.github.com/users/marcusrios/followers","following_url":"https://api.github.com/users/marcusrios/following{/other_user}","gists_url":"https://api.github.com/users/marcusrios/gists{/gist_id}","starred_url":"https://api.github.com/users/marcusrios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/marcusrios/subscriptions","organizations_url":"https://api.github.com/users/marcusrios/orgs","repos_url":"https://api.github.com/users/marcusrios/repos","events_url":"https://api.github.com/users/marcusrios/events{/privacy}","received_events_url":"https://api.github.com/users/marcusrios/received_events","type":"User","site_admin":false},"body":"Boas práticas na utilização do Kubernetes em produção","created_at":"2018-06-18T13:10:22Z","updated_at":"2018-07-02T19:04:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d43ef7a1dc001a9d0f05277d668d3f047a1ee204","assignee":{"login":"marcusrios","id":17992217,"node_id":"MDQ6VXNlcjE3OTkyMjE3","avatar_url":"https://avatars0.githubusercontent.com/u/17992217?v=4","gravatar_id":"","url":"https://api.github.com/users/marcusrios","html_url":"https://github.com/marcusrios","followers_url":"https://api.github.com/users/marcusrios/followers","following_url":"https://api.github.com/users/marcusrios/following{/other_user}","gists_url":"https://api.github.com/users/marcusrios/gists{/gist_id}","starred_url":"https://api.github.com/users/marcusrios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/marcusrios/subscriptions","organizations_url":"https://api.github.com/users/marcusrios/orgs","repos_url":"https://api.github.com/users/marcusrios/repos","events_url":"https://api.github.com/users/marcusrios/events{/privacy}","received_events_url":"https://api.github.com/users/marcusrios/received_events","type":"User","site_admin":false},"assignees":[{"login":"marcusrios","id":17992217,"node_id":"MDQ6VXNlcjE3OTkyMjE3","avatar_url":"https://avatars0.githubusercontent.com/u/17992217?v=4","gravatar_id":"","url":"https://api.github.com/users/marcusrios","html_url":"https://github.com/marcusrios","followers_url":"https://api.github.com/users/marcusrios/followers","following_url":"https://api.github.com/users/marcusrios/following{/other_user}","gists_url":"https://api.github.com/users/marcusrios/gists{/gist_id}","starred_url":"https://api.github.com/users/marcusrios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/marcusrios/subscriptions","organizations_url":"https://api.github.com/users/marcusrios/orgs","repos_url":"https://api.github.com/users/marcusrios/repos","events_url":"https://api.github.com/users/marcusrios/events{/privacy}","received_events_url":"https://api.github.com/users/marcusrios/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":458657623,"node_id":"MDU6TGFiZWw0NTg2NTc2MjM=","url":"https://api.github.com/repos/elo7/tech-blog/labels/-%20HackDay","name":"- HackDay","color":"009800","default":false},{"id":458656238,"node_id":"MDU6TGFiZWw0NTg2NTYyMzg=","url":"https://api.github.com/repos/elo7/tech-blog/labels/BeyondTheWall","name":"BeyondTheWall","color":"c7def8","default":false},{"id":411280531,"node_id":"MDU6TGFiZWw0MTEyODA1MzE=","url":"https://api.github.com/repos/elo7/tech-blog/labels/POST%20(%E2%8C%90%E2%96%A0_%E2%96%A0)","name":"POST (⌐■_■)","color":"5319e7","default":false},{"id":476888486,"node_id":"MDU6TGFiZWw0NzY4ODg0ODY=","url":"https://api.github.com/repos/elo7/tech-blog/labels/REVIEWING","name":"REVIEWING","color":"fef2c0","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/elo7/tech-blog/pulls/205/commits","review_comments_url":"https://api.github.com/repos/elo7/tech-blog/pulls/205/comments","review_comment_url":"https://api.github.com/repos/elo7/tech-blog/pulls/comments{/number}","comments_url":"https://api.github.com/repos/elo7/tech-blog/issues/205/comments","statuses_url":"https://api.github.com/repos/elo7/tech-blog/statuses/20578d4bb76713f543797f21bf4099de54b96ebb","head":{"label":"elo7:good-practices-k8s","ref":"good-practices-k8s","sha":"20578d4bb76713f543797f21bf4099de54b96ebb","user":{"login":"elo7","id":1469534,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0Njk1MzQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1469534?v=4","gravatar_id":"","url":"https://api.github.com/users/elo7","html_url":"https://github.com/elo7","followers_url":"https://api.github.com/users/elo7/followers","following_url":"https://api.github.com/users/elo7/following{/other_user}","gists_url":"https://api.github.com/users/elo7/gists{/gist_id}","starred_url":"https://api.github.com/users/elo7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elo7/subscriptions","organizations_url":"https://api.github.com/users/elo7/orgs","repos_url":"https://api.github.com/users/elo7/repos","events_url":"https://api.github.com/users/elo7/events{/privacy}","received_events_url":"https://api.github.com/users/elo7/received_events","type":"Organization","site_admin":false},"repo":{"id":61552932,"node_id":"MDEwOlJlcG9zaXRvcnk2MTU1MjkzMg==","name":"tech-blog","full_name":"elo7/tech-blog","owner":{"login":"elo7","id":1469534,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0Njk1MzQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1469534?v=4","gravatar_id":"","url":"https://api.github.com/users/elo7","html_url":"https://github.com/elo7","followers_url":"https://api.github.com/users/elo7/followers","following_url":"https://api.github.com/users/elo7/following{/other_user}","gists_url":"https://api.github.com/users/elo7/gists{/gist_id}","starred_url":"https://api.github.com/users/elo7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elo7/subscriptions","organizations_url":"https://api.github.com/users/elo7/orgs","repos_url":"https://api.github.com/users/elo7/repos","events_url":"https://api.github.com/users/elo7/events{/privacy}","received_events_url":"https://api.github.com/users/elo7/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/elo7/tech-blog","description":"Blog técnico do Elo7","fork":false,"url":"https://api.github.com/repos/elo7/tech-blog","forks_url":"https://api.github.com/repos/elo7/tech-blog/forks","keys_url":"https://api.github.com/repos/elo7/tech-blog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/elo7/tech-blog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/elo7/tech-blog/teams","hooks_url":"https://api.github.com/repos/elo7/tech-blog/hooks","issue_events_url":"https://api.github.com/repos/elo7/tech-blog/issues/events{/number}","events_url":"https://api.github.com/repos/elo7/tech-blog/events","assignees_url":"https://api.github.com/repos/elo7/tech-blog/assignees{/user}","branches_url":"https://api.github.com/repos/elo7/tech-blog/branches{/branch}","tags_url":"https://api.github.com/repos/elo7/tech-blog/tags","blobs_url":"https://api.github.com/repos/elo7/tech-blog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/elo7/tech-blog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/elo7/tech-blog/git/refs{/sha}","trees_url":"https://api.github.com/repos/elo7/tech-blog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/elo7/tech-blog/statuses/{sha}","languages_url":"https://api.github.com/repos/elo7/tech-blog/languages","stargazers_url":"https://api.github.com/repos/elo7/tech-blog/stargazers","contributors_url":"https://api.github.com/repos/elo7/tech-blog/contributors","subscribers_url":"https://api.github.com/repos/elo7/tech-blog/subscribers","subscription_url":"https://api.github.com/repos/elo7/tech-blog/subscription","commits_url":"https://api.github.com/repos/elo7/tech-blog/commits{/sha}","git_commits_url":"https://api.github.com/repos/elo7/tech-blog/git/commits{/sha}","comments_url":"https://api.github.com/repos/elo7/tech-blog/comments{/number}","issue_comment_url":"https://api.github.com/repos/elo7/tech-blog/issues/comments{/number}","contents_url":"https://api.github.com/repos/elo7/tech-blog/contents/{+path}","compare_url":"https://api.github.com/repos/elo7/tech-blog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/elo7/tech-blog/merges","archive_url":"https://api.github.com/repos/elo7/tech-blog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/elo7/tech-blog/downloads","issues_url":"https://api.github.com/repos/elo7/tech-blog/issues{/number}","pulls_url":"https://api.github.com/repos/elo7/tech-blog/pulls{/number}","milestones_url":"https://api.github.com/repos/elo7/tech-blog/milestones{/number}","notifications_url":"https://api.github.com/repos/elo7/tech-blog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/elo7/tech-blog/labels{/name}","releases_url":"https://api.github.com/repos/elo7/tech-blog/releases{/id}","deployments_url":"https://api.github.com/repos/elo7/tech-blog/deployments","created_at":"2016-06-20T14:14:12Z","updated_at":"2018-06-06T07:34:47Z","pushed_at":"2018-07-02T18:51:34Z","git_url":"git://github.com/elo7/tech-blog.git","ssh_url":"git@github.com:elo7/tech-blog.git","clone_url":"https://github.com/elo7/tech-blog.git","svn_url":"https://github.com/elo7/tech-blog","homepage":null,"size":37555,"stargazers_count":7,"watchers_count":7,"language":"Harbour","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":21,"license":null,"forks":0,"open_issues":21,"watchers":7,"default_branch":"master"}},"base":{"label":"elo7:master","ref":"master","sha":"cc9be83b3c707209a7d0589d42ec172205709254","user":{"login":"elo7","id":1469534,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0Njk1MzQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1469534?v=4","gravatar_id":"","url":"https://api.github.com/users/elo7","html_url":"https://github.com/elo7","followers_url":"https://api.github.com/users/elo7/followers","following_url":"https://api.github.com/users/elo7/following{/other_user}","gists_url":"https://api.github.com/users/elo7/gists{/gist_id}","starred_url":"https://api.github.com/users/elo7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elo7/subscriptions","organizations_url":"https://api.github.com/users/elo7/orgs","repos_url":"https://api.github.com/users/elo7/repos","events_url":"https://api.github.com/users/elo7/events{/privacy}","received_events_url":"https://api.github.com/users/elo7/received_events","type":"Organization","site_admin":false},"repo":{"id":61552932,"node_id":"MDEwOlJlcG9zaXRvcnk2MTU1MjkzMg==","name":"tech-blog","full_name":"elo7/tech-blog","owner":{"login":"elo7","id":1469534,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0Njk1MzQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1469534?v=4","gravatar_id":"","url":"https://api.github.com/users/elo7","html_url":"https://github.com/elo7","followers_url":"https://api.github.com/users/elo7/followers","following_url":"https://api.github.com/users/elo7/following{/other_user}","gists_url":"https://api.github.com/users/elo7/gists{/gist_id}","starred_url":"https://api.github.com/users/elo7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elo7/subscriptions","organizations_url":"https://api.github.com/users/elo7/orgs","repos_url":"https://api.github.com/users/elo7/repos","events_url":"https://api.github.com/users/elo7/events{/privacy}","received_events_url":"https://api.github.com/users/elo7/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/elo7/tech-blog","description":"Blog técnico do Elo7","fork":false,"url":"https://api.github.com/repos/elo7/tech-blog","forks_url":"https://api.github.com/repos/elo7/tech-blog/forks","keys_url":"https://api.github.com/repos/elo7/tech-blog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/elo7/tech-blog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/elo7/tech-blog/teams","hooks_url":"https://api.github.com/repos/elo7/tech-blog/hooks","issue_events_url":"https://api.github.com/repos/elo7/tech-blog/issues/events{/number}","events_url":"https://api.github.com/repos/elo7/tech-blog/events","assignees_url":"https://api.github.com/repos/elo7/tech-blog/assignees{/user}","branches_url":"https://api.github.com/repos/elo7/tech-blog/branches{/branch}","tags_url":"https://api.github.com/repos/elo7/tech-blog/tags","blobs_url":"https://api.github.com/repos/elo7/tech-blog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/elo7/tech-blog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/elo7/tech-blog/git/refs{/sha}","trees_url":"https://api.github.com/repos/elo7/tech-blog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/elo7/tech-blog/statuses/{sha}","languages_url":"https://api.github.com/repos/elo7/tech-blog/languages","stargazers_url":"https://api.github.com/repos/elo7/tech-blog/stargazers","contributors_url":"https://api.github.com/repos/elo7/tech-blog/contributors","subscribers_url":"https://api.github.com/repos/elo7/tech-blog/subscribers","subscription_url":"https://api.github.com/repos/elo7/tech-blog/subscription","commits_url":"https://api.github.com/repos/elo7/tech-blog/commits{/sha}","git_commits_url":"https://api.github.com/repos/elo7/tech-blog/git/commits{/sha}","comments_url":"https://api.github.com/repos/elo7/tech-blog/comments{/number}","issue_comment_url":"https://api.github.com/repos/elo7/tech-blog/issues/comments{/number}","contents_url":"https://api.github.com/repos/elo7/tech-blog/contents/{+path}","compare_url":"https://api.github.com/repos/elo7/tech-blog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/elo7/tech-blog/merges","archive_url":"https://api.github.com/repos/elo7/tech-blog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/elo7/tech-blog/downloads","issues_url":"https://api.github.com/repos/elo7/tech-blog/issues{/number}","pulls_url":"https://api.github.com/repos/elo7/tech-blog/pulls{/number}","milestones_url":"https://api.github.com/repos/elo7/tech-blog/milestones{/number}","notifications_url":"https://api.github.com/repos/elo7/tech-blog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/elo7/tech-blog/labels{/name}","releases_url":"https://api.github.com/repos/elo7/tech-blog/releases{/id}","deployments_url":"https://api.github.com/repos/elo7/tech-blog/deployments","created_at":"2016-06-20T14:14:12Z","updated_at":"2018-06-06T07:34:47Z","pushed_at":"2018-07-02T18:51:34Z","git_url":"git://github.com/elo7/tech-blog.git","ssh_url":"git@github.com:elo7/tech-blog.git","clone_url":"https://github.com/elo7/tech-blog.git","svn_url":"https://github.com/elo7/tech-blog","homepage":null,"size":37555,"stargazers_count":7,"watchers_count":7,"language":"Harbour","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":21,"license":null,"forks":0,"open_issues":21,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/205"},"html":{"href":"https://github.com/elo7/tech-blog/pull/205"},"issue":{"href":"https://api.github.com/repos/elo7/tech-blog/issues/205"},"comments":{"href":"https://api.github.com/repos/elo7/tech-blog/issues/205/comments"},"review_comments":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/205/comments"},"review_comment":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/elo7/tech-blog/pulls/205/commits"},"statuses":{"href":"https://api.github.com/repos/elo7/tech-blog/statuses/20578d4bb76713f543797f21bf4099de54b96ebb"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"FernandaBernardo"}}