Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de...

41
Estendendo o Kubernetes Tornando o Kubernetes mais que um orquestrador de containeres

Transcript of Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de...

Page 1: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Estendendo o KubernetesTornando o Kubernetes mais que um orquestrador de containeres

Page 2: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Eu, rapidão :)

● CKA, CKAD, LPIC3 (essa venceu…)

● Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro

● Nesse mundo Linux desde 2004, no SERPRO desde 2009, mexendo com esses trecos desde 2014

● Aficionado por aviação

Essa palestra não representa a opinião da empresa em que trabalho e trata apenas de opniões pessoais :)

Page 3: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Kubernetes

“Production grade CONTAINER Orchestration”

Page 4: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Ecossistema Kubernetes

Page 5: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Como estender cada componente?

Page 6: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

API Server

Page 7: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

API Server

API Server

● Repositório de objetos○ POD○ NODE○ Service○ Deployment○ [........] (kubectl explain)○ Custom Resource Definition (CRD)

● Validador de “Regras”

Page 8: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

CRD

● Preciso que meu Cluster suporte um novo tipo de Objeto

○ É global ou por namespace?

○ Tem algum esquema pré definido ou posso escrever

qualquer coisa?

Page 9: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Quem usa?

● Calico - Kubernetes Datastore

● Diversos Operators - coreos.com/operators/

● Kong Ingress Controller

● Qualquer sistema integrado com o Kubernetes que

demande armazenamento de objetos :)

Page 10: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

CRD

apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata: name: crontabs.estaleiro.iospec: group: estaleiro.io version: v1 scope: Namespaced names: plural: crontabs singular: crontab kind: CronTab shortNames: - ct

Page 11: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Não confunda com CronJobs :)

Page 12: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

CRD

API: /apis/estaleiro.io/v1

apiVersion: "estaleiro.io/v1"kind: CronTabmetadata: name: meu-primeiro-cronspec: cronSpec: "* * * * */5" command: comando-a-ser-executado

kubectl get crontab / kubectl get ct / kubectl get crontabs

kind: CronTab

?

Page 13: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

CRD - Validação

apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata: name: crontabs.estaleiro.iospec: group: estaleiro.io

validation: openAPIV3Schema: properties: spec: properties: cronSpec: type: string pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'

REGEX :)

Page 14: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

DEMO - KARMAB GUITAR CENTER

Page 15: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Vantagens

● Uso do Kubernetes como um ‘Banco de Objetos’

● Abstração de acessos ao ETCD

● Chamadas, modificações, leituras podem ser feitas com

bibliotecas prontas do Kubernetes ou chamadas HTTP

(e usar toda a Alta Disponibilidade que o ambiente tem)

Guitar UI

K8S

Page 16: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

API Server Builder

● Build your own API

Server - Bibliotecas em

GO para a construção

de uma nova API

● Aggregation layer -

Você roteia um set de

objetos para outra API

Fonte: https://raw.githubusercontent.com/kubernetes-incubator/apiserver-builder/master/docs/concepts/extensionserver.jpg

Page 17: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Service Catalog

Fonte: https://kubernetes.io/docs/concepts/service-catalog/

Page 18: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Service Catalog

● Chamar uma outra API para determinados Workloads

● Padrão Open Service Broker

○ Azure, GCP, AWS, DIY

● Define Objetos que criam uma nova oferta de serviço,

com o Broker e suas credenciais, a Classe, os planos

disponíveis (gold, silver), e as instâncias

Page 19: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Demo - Service Catalog + GCP

Page 20: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Controllers

Page 21: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Apenas um para a mesma função deve existir

Page 22: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Controller / Cloud Controller Manager

Controller

● Controla o estado dos objetos no Cluster

● Provisiona novos recursos em caso do estado

estar NOK

○ Um ServiceAccount para um novo Namespace

○ Mais PODs para um ReplicaSet

○ Um novo Volume na GCE para ser

disponibilizado como PV

○ Um novo LoadBalancer para um serviço

Page 23: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Exemplos de Controllers externos

● MetalLB - github.com/google/metallb○ Verifica serviços do tipo ‘LoadBalancer’ e cria um balanceador

BareMetal

● NGINX Ingress Controller - github.com/kubernetes/ingress-nginx

● Qualquer programa que fique ‘controlando’ os objetos na API e alterando seu Status

Page 24: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

DEMO - METALLB e GUITAR CENTER (de novo!)

Page 25: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Topologia

Guitar UI

K8S

MetalLB Controller

Service LB

Guitar Review

Controller

Lê guitarras (1)

Dá reviews (2)

Lê Services do tipo LB (1)

Atribui IP físico(2)

Lê IP e anuncia

Page 26: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Schedulers

Page 27: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no
Page 28: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no
Page 29: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Scheduler

Scheduler

● Onde cabe cada workload?

● Taint / Affinity

○ Forçar um workload a rodar em um node

○ Forçar um workload a rodar junto ou separado

de outros nodes

● Status “Pending”

Page 30: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Scheduler

katz-scheduler

API

apiVersion: v1kind: Podmetadata: name: nginx labels: app: nginxspec: schedulerName: katz-scheduler nodeName: null containers: - name: nginx image: nginx:1.10

Lê PODs

Page 31: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Scheduler

katz-scheduler

API

apiVersion: v1kind: Podmetadata: name: nginx labels: app: nginxspec: schedulerName: katz-scheduler nodeName: node123 containers: - name: nginx image: nginx:1.10

Aloca PODs

Page 32: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

katz-scheduler

while true; do

for PODNAME in $(kubectl get pods -o json | jq '.items[] | select(.spec.schedulerName

== "katz-scheduler") | select(.spec.nodeName == null) | .metadata.name' | tr -d '"'); do

NODES=($(kubectl get nodes -o json | jq '.items[].metadata.name' | tr -d '"'))

NUMNODES=${#NODES[@]}

CHOSEN=${NODES[$[$RANDOM % $NUMNODES]]}

curl --header "Content-Type:application/json" --request POST --data

'{"apiVersion":"v1", "kind": "Binding", "metadata": {"name": "'$PODNAME'"}, "target":

{"apiVersion": "v1", "kind": "Node", "name": "'$CHOSEN'"}}'

http://SERVER/api/v1/namespaces/default/pods/$PODNAME/binding/

echo "Assigned $PODNAME to $CHOSEN"

done

sleep 1

done

Page 33: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Kubelet

Page 34: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Kubelet

Kubelet

● Para Kubelets que lidam com containers:

○ CNI para estender rede

○ CSI para estender storage

Page 35: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Kubelet

ETCD

calicoctl

K8s policy controller

configurações

kube-apiNetwork policies (*)

Obj

etos

de

regr

as C

alic

o

Calico Node

Calico Node

Calico Node

Configurações e

regras de firewall (*)

CNI

Requisita IP, aloca rotas

Network Policie

s

Page 36: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Kubelet

Kubelet

● Para Kubelets que lidam com containers:

○ CNI para estender rede

○ CSI para estender storage

● E se eu quiser ter o meu próprio ‘Node’ que finge

ser um kubelet?

● VIRTUAL KUBELET

○ Não confundir com projeto ‘kube-virt’

Page 37: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Virtual Kubelet

Virtual Kubelet

● Finge ser um Kubelet

● Implementa interface para as principais

funcionalidades de um Kubelet

○ Criar PODs

○ Ler ConfigMaps

○ Informar capacidade

○ Etc

Page 38: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Demo - AWS

Page 39: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Ecossistema Kubernetes estendido

Page 40: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

Referências

https://kubernetes.io/docs/concepts/api-extension/custom-resources/https://engineering.bitnami.com/articles/a-deep-dive-into-kubernetes-controllers.htmlhttps://github.com/karmab/samplecontrollerhttps://metallb.universe.tf/tutorial/layer2/https://medium.com/bitnami-perspectives/service-catalog-in-kubernetes-78c0736e3910https://kubernetes.io/blog/2017/03/advanced-scheduling-in-kubernetes/https://jvns.ca/blog/2017/07/27/how-does-the-kubernetes-scheduler-work/https://kubernetes.io/docs/concepts/overview/extending/https://github.com/virtual-kubelet/virtual-kubelethttps://github.com/GoogleCloudPlatform/k8s-service-cataloghttps://cloud.google.com/kubernetes-engine/docs/how-to/add-on/service-broker/use-service-cataloghttps://github.com/GoogleCloudPlatform/kubernetes-engine-sampleshttps://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/https://github.com/kubernetes-incubator/apiserver-builder/blob/master/docs/concepts/api_building_overview.md

Page 41: Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de engenharia de Nuvem no SERPRO - Projeto Estaleiro Nesse mundo Linux desde 2004, no

ObrigadoRicardo P. Katz

@[email protected]@serpro.gov.br

github.com/estaleiro

Telegram: t.me/kubernetesbr