SlideShare uma empresa Scribd logo
1 de 51
Baixar para ler offline
Kubernetes Deep Dive
O QUE É CLOUD
COMPUTING?
O que é Cloud afinal?
● Eu não sei onde meu recurso está
● Eu não sei o que roda por baixo para o meu
recurso estar lá
● Eu quero pagar por uso
● Alguém orquestrou aquele recurso
O que é Cloud afinal?
● Eu não sei onde meu recurso está
● Eu não sei o que roda por baixo para o meu
recurso estar lá
● Eu quero pagar por uso
● Alguém orquestrou aquele recurso
Cloud é uma fábrica de salsicha
E O QUE É O KUBERNETES?
Kubernetes is an
open-source system for
automating deployment,
scaling, and management of
containerized applications
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
Componentes e objetos do Kubernetes
API Server
Controller
Manager
Scheduler
Kubelet
POD
SVC
Deploy
CronJob
PVC
Kube Proxy
Objetos do Kubernetes
API Server
Controller
Manager
Scheduler
Kubelet
POD
SVC
Deploy
CronJob
PVC
Kube Proxy
ENTÃO KUBERNETES É
SÓ PARA
CONTAINERS?
DEMO KUBE PLAYER
VOLTANDO AO TEMA
ORIGINAL :P
Anatomia de um Container
Network Namespace X
Cgroup A
Container A
Isolamento
de rede
Isolamento de
Processo
Limite de CPU e
Memória
Anatomia de um POD
Network Namespace X
Cgroup A
Container A
Cgroup B
Container B
Anatomia de um POD
POD A
Init Container HAProxy Mod Security
PAUSE
eth0
192.168.111.222/24
Mundo
Anatomia de um Service
Host
SVC
POD
POD
POD2POD
SVC2POD
“NAT”
POD
Host A
Namespace X
Anatomia de um Deployment
POD
Host B
Namespace X
POD
Deploy
Componentes do Kubernetes
API Server
Controller
Manager
Scheduler
Kubelet
POD
SVC
Deploy
CronJob
PVC
Kube Proxy
COMO ENTENDER
PARA QUE SERVE
CADA UM? TIRANDO
ELES DO AR!!!
APIServer + ETCD
● ETCD: Store K/V -
Persistência de objetos do
Kubernetes
● APIServer - Apenas um
repositório de objetos!
○ Autenticação
○ RBAC
○ Watch
○ REST
○ Extensível
api-server
http/s
Chaves e
Valores
API
apiVersion: estaleiro.io/v1
kind: Music
metadata:
namespace: default
name: mario
spec:
music: cm-mario
$ curl http://API:8080/apis/estaleiro.io/v1/namespaces/default/musics/mario
{
"apiVersion":"estaleiro.io/v1",
"kind":"Music",
"metadata":{
"creationTimestamp":"2019-04-25T21:21:39Z",
"generation":2,
"name":"mario",
"namespace":"default",
"resourceVersion":"469",
"selfLink":"/apis/estaleiro.io/v1/namespaces/default/musics/mario",
"uid":"1d852d55-67a0-11e9-b82a-3c970ea1b665"},
"spec": {
"music":"cm-mario",
"status":"Tocando"
}
}
Kubelet
● Kubelet: “Existe
algum workload para
eu rodar?”
● Pega POD, obtém
parâmetros de rede
com o CNI, chama o
Container Runtime e
executa a carga
api-server
http/s
Chaves e
Valores
Kubelet
Tem algo pra
mim?
Rodar
container
Configurar
rede
API Watch
Scheduler
● Onde rodar esse Workload?
● Regras de afinidade /
anti-afinidade
● Nó com disco local SSD
● Nó com GPU
● Labels, requisitos
api-server
http/s
Scheduler
Kubelet
Kubelet
Watch PODs
(existe alguém
sem node?)
Então
execute
nesse node
Controllers
● Controllers controlam as coisas
api-server
http/s
Controller
Existe
recurso do
tipo A?
Faça tal
coisa
DNS
LB
Disco
PODs
Ora Ora, temos um
Xeroqui Homes aqui
Controllers
● Controllers controlam as coisas
● 1 Deploy, N PODs
● 1 Service com Type
LoadBalancer, 1 novo ELB na
Amazon
● 1 PVC, 1 novo volume no Cloud
Provider
api-server
http/s
Controller
Existe
recurso do
tipo A?
Faça tal
coisa
DNS
LB
Disco
PODs
https://visualpharm.com/free-icons/sad%20cloud-595b40b85ba036ed117dc41c
There is no cloud
It’s just someone else’s computer
Sem Controller
● Auto provisionamento do kubeadm não
funciona
● Deployments não tem PODs
● Cronjobs não rodam
● E outros problemas a mais :D
Kube Proxy
● KubeProxy - Services e
NodePort
○ Regras de iptables para
NAT e NodePort
○ Entradas no IPVS para
Service IP
api-server
http/s
kube-proxy
Objeto
Service?
Criar
recursos
Host
COMUNICAÇÃO
POD2POD
Comunicação POD2POD
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
echoserver-75685667dd-g9q8h 1/1 Running 0 9d 192.168.166.142 node1
echoserver-75685667dd-nbzwb 1/1 Running 0 9d 192.168.104.3 node2
echoserver-75685667dd-w2922 1/1 Running 0 9d 192.168.104.4 node2
echoserver-75685667dd-w4hzc 1/1 Running 0 9d 192.168.166.141 node1
================================================================================================
$ kubectl exec echoserver-75685667dd-g9q8h curl 192.168.104.3:8080
CLIENT VALUES:
client_address=192.168.166.142
request_uri=http://192.168.104.3:8080/
================================================================================================
$ kubectl exec echoserver-75685667dd-g9q8h curl 192.168.166.141:8080
CLIENT VALUES:
client_address=192.168.166.142
request_uri=http://192.168.166.141:8080/
O QUE ACONTECEU?
POD2POD
POD A POD B POD C
Puro
roteamento
:D
Comunicação POD2POD
node1 (172.16.224.51) $ ip route
default via 172.16.224.2 dev ens192 proto static
192.168.104.0/26 via 172.16.224.52 dev tunl0 proto bird onlink
blackhole 192.168.166.128/26 proto bird
192.168.166.141 dev cali91e73b6782f scope link
192.168.166.142 dev cali55f17d7b353 scope link
node2 (172.16.224.52) $ ip route
default via 172.16.224.2 dev ens192 proto static
192.168.166.128/26 via 172.16.224.51 dev tunl0 proto bird onlink
blackhole 192.168.104.0/26 proto bird
192.168.104.3 dev calif16747aea13 scope link
192.168.104.4 dev calia8f2ba1d023 scope link
COMUNICAÇÃO
SVC2POD
Comunicação SVC2POD
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
echoserver-75685667dd-g9q8h 1/1 Running 0 9d 192.168.166.142 node1
echoserver-75685667dd-nbzwb 1/1 Running 0 9d 192.168.104.3 node2
echoserver-75685667dd-w2922 1/1 Running 0 9d 192.168.104.4 node2
echoserver-75685667dd-w4hzc 1/1 Running 0 9d 192.168.166.141 node1
================================================================================================
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echoserver ClusterIP 10.99.153.85 <none> 8080/TCP 6s
================================================================================================
$ kubectl exec -it echoserver-75685667dd-g9q8h curl -v echoserver:8080
* Connected to echoserver (10.99.153.85) port 8080 (#0)
[...]
CLIENT VALUES:
client_address=192.168.166.142
request_uri=http://echoserver:8080/
Comunicação SVC2POD
node2 (172.16.224.52) $ ipvsadm -L -n
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.99.153.85:8080 rr
-> 192.168.104.5:8080 Masq 1 0 0
-> 192.168.104.6:8080 Masq 1 0 0
-> 192.168.166.141:8080 Masq 1 0 0
-> 192.168.166.142:8080 Masq 1 0 0
EU VIM AQUI SÓ PELO
INGRESS!!!
Controllers
● Ingress CONTROLLER
● Entra objeto de Ingress, sai
configuração de servidor
Web
○ HAProxy
○ NGINX
○ Contour
○ Istio
○ Gloo
○ Etc etc etc
● Assim como meu
Controller de musica :)
api-server
http/s
Controller
Existe
objeto
ingress?
Criar um
novo vhost
HAProxy
Ingress
$ kubectl describe ingress echoserver
Name: echoserver
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
echoserver.test
/ echoserver:8080 (192.168.104.5:8080,192.168.104.6:8080,192.168.166.141:8080 + 1 more...)
====================================================================================================
$ curl -H "Host: echoserver.test" http://172.16.224.51 ⇐ O ingress aqui está exposto com um NodePort na porta 80 do “node1”
CLIENT VALUES:
client_address=192.168.166.128
request_uri=http://echoserver.test:8080/
O QUE ACONTECEU?
Enquanto isso, dentro do Container do HAProxy
$ kubectl exec -n ingress-controller -it haproxy-ingress-7cphn cat /etc/haproxy/haproxy.cfg
backend default-echoserver-8080
mode http
balance roundrobin
server 192.168.104.5:8080 192.168.104.5:8080 weight 1 check inter 2s
server 192.168.166.141:8080 192.168.166.141:8080 weight 1 check inter 2s
[...]
frontend httpfront-shared-frontend
bind *:80
mode http
acl host-echoserver.test var(txn.hdr_host) -i echoserver.test echoserver.test:80 echoserver.test:443
use_backend default-echoserver-8080 if host-echoserver.test
====================================================================================================
$ kubectl exec -n ingress-controller -it haproxy-ingress-7cphn ps
7 /haproxy-ingress-controller --default-backend-service=ingr
32 haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pi
Ingress Controller
HAProxy
Kubernetes
Service (1)
POD
Service
POD
Service
POD
Service (2)
POD
echoserver.test (1)
blog.com.br (2)
CoreDNS
● Resolve nome para os PODs
dentro do Cluster
● “svc.cluster.local” -> Qual o IP
do Service para esse nome?
● Menos IPs, mais nomes
(desacoplar aplicações)
● O sufixo “cluster.local” pode ser
alterado
● CoreDNS não serve apenas
para Kubernetes :)
● CoreDNS não precisa rodar
dentro do cluster (mas é bom
os PODs conseguirem chegar
nele!)
CoreDNS
api-server
Resolve algum
objeto do
Kubernetes? (1)
DNS Externo
Forward
CoreDNS
$ kubectl get svc -n default |grep echoserver
echoserver ClusterIP 10.99.153.85 <none> 8080/TCP 5h23m
=============================================================================
$ dig +noall +answer @127.0.0.1 echoserver.default.svc.cluster.local
echoserver.default.svc.cluster.local. 5 IN A 10.99.153.85
=============================================================================
$ cat Corefile
.:53 {
kubernetes cluster.local {
upstream
}
forward . 8.8.8.8 # Para quem é feito o Forward em caso de esse DNS não ser autoridade
cache 30
}
Referências
● https://github.com/jamiehannaford/what-happens-when-k8s
● https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/#additional-controllers
● https://jvns.ca/blog/2016/10/10/what-even-is-a-container/
● https://github.com/jcmoraisjr/haproxy-ingress
Obrigado!
Ricardo Pchevuzinske Katz
SERPRO
Emails:
ricardo.katz@serpro.gov.br
ricardo.katz@gmail.com
Twitter: @rpkatz
Telegram: t.me/kubernetesbr

Mais conteúdo relacionado

Mais procurados

AWS January 2016 Webinar Series - Introduction to Deploying Applications on AWS
AWS January 2016 Webinar Series - Introduction to Deploying Applications on AWSAWS January 2016 Webinar Series - Introduction to Deploying Applications on AWS
AWS January 2016 Webinar Series - Introduction to Deploying Applications on AWSAmazon Web Services
 
Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호용호 최
 
Atlassian Bamboo Feature Overview
Atlassian Bamboo Feature OverviewAtlassian Bamboo Feature Overview
Atlassian Bamboo Feature OverviewJim Bethancourt
 
Kubernetes a comprehensive overview
Kubernetes   a comprehensive overviewKubernetes   a comprehensive overview
Kubernetes a comprehensive overviewGabriel Carro
 
DevOps, por onde começar
DevOps, por onde começarDevOps, por onde começar
DevOps, por onde começarAdriano Tavares
 
(DVO312) Sony: Building At-Scale Services with AWS Elastic Beanstalk
(DVO312) Sony: Building At-Scale Services with AWS Elastic Beanstalk(DVO312) Sony: Building At-Scale Services with AWS Elastic Beanstalk
(DVO312) Sony: Building At-Scale Services with AWS Elastic BeanstalkAmazon Web Services
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentationSuresh Kumar
 
DevOps with Ansible
DevOps with AnsibleDevOps with Ansible
DevOps with AnsibleSwapnil Jain
 
AWS 클라우드 보안 및 규정 준수 소개 (박철수) - AWS 웨비나 시리즈
AWS 클라우드 보안 및  규정 준수 소개 (박철수) - AWS 웨비나 시리즈AWS 클라우드 보안 및  규정 준수 소개 (박철수) - AWS 웨비나 시리즈
AWS 클라우드 보안 및 규정 준수 소개 (박철수) - AWS 웨비나 시리즈Amazon Web Services Korea
 
[오픈테크넷서밋2022] 국내 PaaS(Kubernetes) Best Practice 및 DevOps 환경 구축 사례.pdf
[오픈테크넷서밋2022] 국내 PaaS(Kubernetes) Best Practice 및 DevOps 환경 구축 사례.pdf[오픈테크넷서밋2022] 국내 PaaS(Kubernetes) Best Practice 및 DevOps 환경 구축 사례.pdf
[오픈테크넷서밋2022] 국내 PaaS(Kubernetes) Best Practice 및 DevOps 환경 구축 사례.pdfOpen Source Consulting
 
The Real World with OpenShift - Red Hat DevOps & Microservices Conference 2017
The Real World with OpenShift - Red Hat DevOps & Microservices Conference 2017 The Real World with OpenShift - Red Hat DevOps & Microservices Conference 2017
The Real World with OpenShift - Red Hat DevOps & Microservices Conference 2017 Xpand IT
 
Introduce Docker
Introduce DockerIntroduce Docker
Introduce DockerYongbok Kim
 
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...Amazon Web Services Korea
 
Java Source Code Analysis using SonarQube
Java Source Code Analysis using SonarQubeJava Source Code Analysis using SonarQube
Java Source Code Analysis using SonarQubeAngelin R
 
Kubernetes Monitoring & Best Practices
Kubernetes Monitoring & Best PracticesKubernetes Monitoring & Best Practices
Kubernetes Monitoring & Best PracticesAjeet Singh Raina
 
Kubernetes architecture
Kubernetes architectureKubernetes architecture
Kubernetes architectureJanakiram MSV
 
Making the business case for DevOps
Making the business case for DevOpsMaking the business case for DevOps
Making the business case for DevOpsMartin Croker
 
Introduction to Docker Compose
Introduction to Docker ComposeIntroduction to Docker Compose
Introduction to Docker ComposeAjeet Singh Raina
 
마이크로서비스 아키텍처로 개발하기
마이크로서비스 아키텍처로 개발하기마이크로서비스 아키텍처로 개발하기
마이크로서비스 아키텍처로 개발하기Jaewoo Ahn
 

Mais procurados (20)

AWS January 2016 Webinar Series - Introduction to Deploying Applications on AWS
AWS January 2016 Webinar Series - Introduction to Deploying Applications on AWSAWS January 2016 Webinar Series - Introduction to Deploying Applications on AWS
AWS January 2016 Webinar Series - Introduction to Deploying Applications on AWS
 
Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호
 
Atlassian Bamboo Feature Overview
Atlassian Bamboo Feature OverviewAtlassian Bamboo Feature Overview
Atlassian Bamboo Feature Overview
 
Kubernetes a comprehensive overview
Kubernetes   a comprehensive overviewKubernetes   a comprehensive overview
Kubernetes a comprehensive overview
 
DevOps, por onde começar
DevOps, por onde começarDevOps, por onde começar
DevOps, por onde começar
 
(DVO312) Sony: Building At-Scale Services with AWS Elastic Beanstalk
(DVO312) Sony: Building At-Scale Services with AWS Elastic Beanstalk(DVO312) Sony: Building At-Scale Services with AWS Elastic Beanstalk
(DVO312) Sony: Building At-Scale Services with AWS Elastic Beanstalk
 
AWS CodeBuild Demo
AWS CodeBuild DemoAWS CodeBuild Demo
AWS CodeBuild Demo
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentation
 
DevOps with Ansible
DevOps with AnsibleDevOps with Ansible
DevOps with Ansible
 
AWS 클라우드 보안 및 규정 준수 소개 (박철수) - AWS 웨비나 시리즈
AWS 클라우드 보안 및  규정 준수 소개 (박철수) - AWS 웨비나 시리즈AWS 클라우드 보안 및  규정 준수 소개 (박철수) - AWS 웨비나 시리즈
AWS 클라우드 보안 및 규정 준수 소개 (박철수) - AWS 웨비나 시리즈
 
[오픈테크넷서밋2022] 국내 PaaS(Kubernetes) Best Practice 및 DevOps 환경 구축 사례.pdf
[오픈테크넷서밋2022] 국내 PaaS(Kubernetes) Best Practice 및 DevOps 환경 구축 사례.pdf[오픈테크넷서밋2022] 국내 PaaS(Kubernetes) Best Practice 및 DevOps 환경 구축 사례.pdf
[오픈테크넷서밋2022] 국내 PaaS(Kubernetes) Best Practice 및 DevOps 환경 구축 사례.pdf
 
The Real World with OpenShift - Red Hat DevOps & Microservices Conference 2017
The Real World with OpenShift - Red Hat DevOps & Microservices Conference 2017 The Real World with OpenShift - Red Hat DevOps & Microservices Conference 2017
The Real World with OpenShift - Red Hat DevOps & Microservices Conference 2017
 
Introduce Docker
Introduce DockerIntroduce Docker
Introduce Docker
 
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
 
Java Source Code Analysis using SonarQube
Java Source Code Analysis using SonarQubeJava Source Code Analysis using SonarQube
Java Source Code Analysis using SonarQube
 
Kubernetes Monitoring & Best Practices
Kubernetes Monitoring & Best PracticesKubernetes Monitoring & Best Practices
Kubernetes Monitoring & Best Practices
 
Kubernetes architecture
Kubernetes architectureKubernetes architecture
Kubernetes architecture
 
Making the business case for DevOps
Making the business case for DevOpsMaking the business case for DevOps
Making the business case for DevOps
 
Introduction to Docker Compose
Introduction to Docker ComposeIntroduction to Docker Compose
Introduction to Docker Compose
 
마이크로서비스 아키텍처로 개발하기
마이크로서비스 아키텍처로 개발하기마이크로서비스 아키텍처로 개발하기
마이크로서비스 아키텍처로 개발하기
 

Semelhante a Kubernetes Deep Dive: Cloud, Containers e Componentes

Estendendo o kubernetes
Estendendo o kubernetesEstendendo o kubernetes
Estendendo o kubernetesRicardo Katz
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo realEvandro Silvestre
 
Talk no Meetup LaravelSP #3
Talk no Meetup LaravelSP #3Talk no Meetup LaravelSP #3
Talk no Meetup LaravelSP #3Wellington Silva
 
Kubernetes no Governo Federal - Kubernetes Meetup #3
Kubernetes no Governo Federal - Kubernetes Meetup #3Kubernetes no Governo Federal - Kubernetes Meetup #3
Kubernetes no Governo Federal - Kubernetes Meetup #3Ricardo Katz
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Emerson Macedo
 
Datacenter na nuvem
Datacenter na nuvemDatacenter na nuvem
Datacenter na nuvemIgnacio Nin
 
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - Develop...
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - Develop...ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - Develop...
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - Develop...Renato Groff
 
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - .NET SP...
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - .NET SP...ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - .NET SP...
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - .NET SP...Renato Groff
 
Docker - minicurso utfpr 2017
Docker -  minicurso utfpr 2017Docker -  minicurso utfpr 2017
Docker - minicurso utfpr 2017Fabio Janiszevski
 
Docker em Produção com Kubernetes
Docker em Produção com Kubernetes Docker em Produção com Kubernetes
Docker em Produção com Kubernetes Fernando Ruaro
 
Docker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG CabreúvaDocker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG CabreúvaMatheus Fidelis
 
Tutorial instalacao-glpi-ocs
Tutorial instalacao-glpi-ocsTutorial instalacao-glpi-ocs
Tutorial instalacao-glpi-ocsJoao Muela
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerGiovanni Kenji Shiroma
 
Vagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolsoVagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolsoDiogo Lucas
 
Docker de containers a orquestração
Docker de containers a orquestraçãoDocker de containers a orquestração
Docker de containers a orquestraçãoItalo José
 
ASP.NET Core + Kubernetes + Azure - Community Bootcamp - Abril/2018
ASP.NET Core + Kubernetes + Azure - Community Bootcamp - Abril/2018ASP.NET Core + Kubernetes + Azure - Community Bootcamp - Abril/2018
ASP.NET Core + Kubernetes + Azure - Community Bootcamp - Abril/2018Renato Groff
 
Container revolucao
Container revolucaoContainer revolucao
Container revolucaoFernando Ike
 
k6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetes
k6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetesk6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetes
k6: Performance Engineering, Monitoramento e Teste de um HPA no KubernetesKelvin Silva
 

Semelhante a Kubernetes Deep Dive: Cloud, Containers e Componentes (20)

Estendendo o kubernetes
Estendendo o kubernetesEstendendo o kubernetes
Estendendo o kubernetes
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
 
Talk no Meetup LaravelSP #3
Talk no Meetup LaravelSP #3Talk no Meetup LaravelSP #3
Talk no Meetup LaravelSP #3
 
Kubernetes no Governo Federal - Kubernetes Meetup #3
Kubernetes no Governo Federal - Kubernetes Meetup #3Kubernetes no Governo Federal - Kubernetes Meetup #3
Kubernetes no Governo Federal - Kubernetes Meetup #3
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
 
Datacenter na nuvem
Datacenter na nuvemDatacenter na nuvem
Datacenter na nuvem
 
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - Develop...
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - Develop...ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - Develop...
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - Develop...
 
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - .NET SP...
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - .NET SP...ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - .NET SP...
ASP.NET Core + Kubernetes + Azure: Orquestrando containers na nuvem - .NET SP...
 
Docker - minicurso utfpr 2017
Docker -  minicurso utfpr 2017Docker -  minicurso utfpr 2017
Docker - minicurso utfpr 2017
 
Docker para maiores
Docker para maioresDocker para maiores
Docker para maiores
 
Docker em Produção com Kubernetes
Docker em Produção com Kubernetes Docker em Produção com Kubernetes
Docker em Produção com Kubernetes
 
Docker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG CabreúvaDocker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG Cabreúva
 
Tutorial instalacao-glpi-ocs
Tutorial instalacao-glpi-ocsTutorial instalacao-glpi-ocs
Tutorial instalacao-glpi-ocs
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & Docker
 
Vagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolsoVagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolso
 
Docker de containers a orquestração
Docker de containers a orquestraçãoDocker de containers a orquestração
Docker de containers a orquestração
 
ASP.NET Core + Kubernetes + Azure - Community Bootcamp - Abril/2018
ASP.NET Core + Kubernetes + Azure - Community Bootcamp - Abril/2018ASP.NET Core + Kubernetes + Azure - Community Bootcamp - Abril/2018
ASP.NET Core + Kubernetes + Azure - Community Bootcamp - Abril/2018
 
Container revolucao
Container revolucaoContainer revolucao
Container revolucao
 
k6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetes
k6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetesk6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetes
k6: Performance Engineering, Monitoramento e Teste de um HPA no Kubernetes
 
Iniciando com kubernetes
Iniciando com kubernetesIniciando com kubernetes
Iniciando com kubernetes
 

Kubernetes Deep Dive: Cloud, Containers e Componentes

  • 2. O QUE É CLOUD COMPUTING?
  • 3. O que é Cloud afinal? ● Eu não sei onde meu recurso está ● Eu não sei o que roda por baixo para o meu recurso estar lá ● Eu quero pagar por uso ● Alguém orquestrou aquele recurso
  • 4. O que é Cloud afinal? ● Eu não sei onde meu recurso está ● Eu não sei o que roda por baixo para o meu recurso estar lá ● Eu quero pagar por uso ● Alguém orquestrou aquele recurso
  • 5. Cloud é uma fábrica de salsicha
  • 6. E O QUE É O KUBERNETES?
  • 7. Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
  • 8.
  • 9.
  • 10. Componentes e objetos do Kubernetes API Server Controller Manager Scheduler Kubelet POD SVC Deploy CronJob PVC Kube Proxy
  • 11. Objetos do Kubernetes API Server Controller Manager Scheduler Kubelet POD SVC Deploy CronJob PVC Kube Proxy
  • 12. ENTÃO KUBERNETES É SÓ PARA CONTAINERS?
  • 15. Anatomia de um Container Network Namespace X Cgroup A Container A Isolamento de rede Isolamento de Processo Limite de CPU e Memória
  • 16. Anatomia de um POD Network Namespace X Cgroup A Container A Cgroup B Container B
  • 17. Anatomia de um POD POD A Init Container HAProxy Mod Security PAUSE eth0 192.168.111.222/24 Mundo
  • 18. Anatomia de um Service Host SVC POD POD POD2POD SVC2POD “NAT” POD
  • 19. Host A Namespace X Anatomia de um Deployment POD Host B Namespace X POD Deploy
  • 20. Componentes do Kubernetes API Server Controller Manager Scheduler Kubelet POD SVC Deploy CronJob PVC Kube Proxy
  • 21. COMO ENTENDER PARA QUE SERVE CADA UM? TIRANDO ELES DO AR!!!
  • 22. APIServer + ETCD ● ETCD: Store K/V - Persistência de objetos do Kubernetes ● APIServer - Apenas um repositório de objetos! ○ Autenticação ○ RBAC ○ Watch ○ REST ○ Extensível api-server http/s Chaves e Valores
  • 23. API apiVersion: estaleiro.io/v1 kind: Music metadata: namespace: default name: mario spec: music: cm-mario $ curl http://API:8080/apis/estaleiro.io/v1/namespaces/default/musics/mario { "apiVersion":"estaleiro.io/v1", "kind":"Music", "metadata":{ "creationTimestamp":"2019-04-25T21:21:39Z", "generation":2, "name":"mario", "namespace":"default", "resourceVersion":"469", "selfLink":"/apis/estaleiro.io/v1/namespaces/default/musics/mario", "uid":"1d852d55-67a0-11e9-b82a-3c970ea1b665"}, "spec": { "music":"cm-mario", "status":"Tocando" } }
  • 24. Kubelet ● Kubelet: “Existe algum workload para eu rodar?” ● Pega POD, obtém parâmetros de rede com o CNI, chama o Container Runtime e executa a carga api-server http/s Chaves e Valores Kubelet Tem algo pra mim? Rodar container Configurar rede API Watch
  • 25.
  • 26. Scheduler ● Onde rodar esse Workload? ● Regras de afinidade / anti-afinidade ● Nó com disco local SSD ● Nó com GPU ● Labels, requisitos api-server http/s Scheduler Kubelet Kubelet Watch PODs (existe alguém sem node?) Então execute nesse node
  • 27.
  • 28. Controllers ● Controllers controlam as coisas api-server http/s Controller Existe recurso do tipo A? Faça tal coisa DNS LB Disco PODs
  • 29. Ora Ora, temos um Xeroqui Homes aqui
  • 30. Controllers ● Controllers controlam as coisas ● 1 Deploy, N PODs ● 1 Service com Type LoadBalancer, 1 novo ELB na Amazon ● 1 PVC, 1 novo volume no Cloud Provider api-server http/s Controller Existe recurso do tipo A? Faça tal coisa DNS LB Disco PODs
  • 32. Sem Controller ● Auto provisionamento do kubeadm não funciona ● Deployments não tem PODs ● Cronjobs não rodam ● E outros problemas a mais :D
  • 33. Kube Proxy ● KubeProxy - Services e NodePort ○ Regras de iptables para NAT e NodePort ○ Entradas no IPVS para Service IP api-server http/s kube-proxy Objeto Service? Criar recursos Host
  • 35. Comunicação POD2POD $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE echoserver-75685667dd-g9q8h 1/1 Running 0 9d 192.168.166.142 node1 echoserver-75685667dd-nbzwb 1/1 Running 0 9d 192.168.104.3 node2 echoserver-75685667dd-w2922 1/1 Running 0 9d 192.168.104.4 node2 echoserver-75685667dd-w4hzc 1/1 Running 0 9d 192.168.166.141 node1 ================================================================================================ $ kubectl exec echoserver-75685667dd-g9q8h curl 192.168.104.3:8080 CLIENT VALUES: client_address=192.168.166.142 request_uri=http://192.168.104.3:8080/ ================================================================================================ $ kubectl exec echoserver-75685667dd-g9q8h curl 192.168.166.141:8080 CLIENT VALUES: client_address=192.168.166.142 request_uri=http://192.168.166.141:8080/
  • 37. POD2POD POD A POD B POD C Puro roteamento :D
  • 38. Comunicação POD2POD node1 (172.16.224.51) $ ip route default via 172.16.224.2 dev ens192 proto static 192.168.104.0/26 via 172.16.224.52 dev tunl0 proto bird onlink blackhole 192.168.166.128/26 proto bird 192.168.166.141 dev cali91e73b6782f scope link 192.168.166.142 dev cali55f17d7b353 scope link node2 (172.16.224.52) $ ip route default via 172.16.224.2 dev ens192 proto static 192.168.166.128/26 via 172.16.224.51 dev tunl0 proto bird onlink blackhole 192.168.104.0/26 proto bird 192.168.104.3 dev calif16747aea13 scope link 192.168.104.4 dev calia8f2ba1d023 scope link
  • 40. Comunicação SVC2POD $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE echoserver-75685667dd-g9q8h 1/1 Running 0 9d 192.168.166.142 node1 echoserver-75685667dd-nbzwb 1/1 Running 0 9d 192.168.104.3 node2 echoserver-75685667dd-w2922 1/1 Running 0 9d 192.168.104.4 node2 echoserver-75685667dd-w4hzc 1/1 Running 0 9d 192.168.166.141 node1 ================================================================================================ $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE echoserver ClusterIP 10.99.153.85 <none> 8080/TCP 6s ================================================================================================ $ kubectl exec -it echoserver-75685667dd-g9q8h curl -v echoserver:8080 * Connected to echoserver (10.99.153.85) port 8080 (#0) [...] CLIENT VALUES: client_address=192.168.166.142 request_uri=http://echoserver:8080/
  • 41. Comunicação SVC2POD node2 (172.16.224.52) $ ipvsadm -L -n Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.99.153.85:8080 rr -> 192.168.104.5:8080 Masq 1 0 0 -> 192.168.104.6:8080 Masq 1 0 0 -> 192.168.166.141:8080 Masq 1 0 0 -> 192.168.166.142:8080 Masq 1 0 0
  • 42. EU VIM AQUI SÓ PELO INGRESS!!!
  • 43. Controllers ● Ingress CONTROLLER ● Entra objeto de Ingress, sai configuração de servidor Web ○ HAProxy ○ NGINX ○ Contour ○ Istio ○ Gloo ○ Etc etc etc ● Assim como meu Controller de musica :) api-server http/s Controller Existe objeto ingress? Criar um novo vhost HAProxy
  • 44. Ingress $ kubectl describe ingress echoserver Name: echoserver Address: Default backend: default-http-backend:80 (<none>) Rules: Host Path Backends ---- ---- -------- echoserver.test / echoserver:8080 (192.168.104.5:8080,192.168.104.6:8080,192.168.166.141:8080 + 1 more...) ==================================================================================================== $ curl -H "Host: echoserver.test" http://172.16.224.51 ⇐ O ingress aqui está exposto com um NodePort na porta 80 do “node1” CLIENT VALUES: client_address=192.168.166.128 request_uri=http://echoserver.test:8080/
  • 46. Enquanto isso, dentro do Container do HAProxy $ kubectl exec -n ingress-controller -it haproxy-ingress-7cphn cat /etc/haproxy/haproxy.cfg backend default-echoserver-8080 mode http balance roundrobin server 192.168.104.5:8080 192.168.104.5:8080 weight 1 check inter 2s server 192.168.166.141:8080 192.168.166.141:8080 weight 1 check inter 2s [...] frontend httpfront-shared-frontend bind *:80 mode http acl host-echoserver.test var(txn.hdr_host) -i echoserver.test echoserver.test:80 echoserver.test:443 use_backend default-echoserver-8080 if host-echoserver.test ==================================================================================================== $ kubectl exec -n ingress-controller -it haproxy-ingress-7cphn ps 7 /haproxy-ingress-controller --default-backend-service=ingr 32 haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pi
  • 48. CoreDNS ● Resolve nome para os PODs dentro do Cluster ● “svc.cluster.local” -> Qual o IP do Service para esse nome? ● Menos IPs, mais nomes (desacoplar aplicações) ● O sufixo “cluster.local” pode ser alterado ● CoreDNS não serve apenas para Kubernetes :) ● CoreDNS não precisa rodar dentro do cluster (mas é bom os PODs conseguirem chegar nele!) CoreDNS api-server Resolve algum objeto do Kubernetes? (1) DNS Externo Forward
  • 49. CoreDNS $ kubectl get svc -n default |grep echoserver echoserver ClusterIP 10.99.153.85 <none> 8080/TCP 5h23m ============================================================================= $ dig +noall +answer @127.0.0.1 echoserver.default.svc.cluster.local echoserver.default.svc.cluster.local. 5 IN A 10.99.153.85 ============================================================================= $ cat Corefile .:53 { kubernetes cluster.local { upstream } forward . 8.8.8.8 # Para quem é feito o Forward em caso de esse DNS não ser autoridade cache 30 }