Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de...
Transcript of Estendendo o Kubernetes - QConSP · Eu, rapidão :) CKA, CKAD, LPIC3 (essa venceu…) Gerente de...
Estendendo o KubernetesTornando o Kubernetes mais que um orquestrador de containeres
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 :)
Kubernetes
“Production grade CONTAINER Orchestration”
Ecossistema Kubernetes
Como estender cada componente?
API Server
API Server
API Server
● Repositório de objetos○ POD○ NODE○ Service○ Deployment○ [........] (kubectl explain)○ Custom Resource Definition (CRD)
● Validador de “Regras”
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?
Quem usa?
● Calico - Kubernetes Datastore
● Diversos Operators - coreos.com/operators/
● Kong Ingress Controller
● Qualquer sistema integrado com o Kubernetes que
demande armazenamento de objetos :)
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
Não confunda com CronJobs :)
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
?
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 :)
DEMO - KARMAB GUITAR CENTER
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
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
Service Catalog
Fonte: https://kubernetes.io/docs/concepts/service-catalog/
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
Demo - Service Catalog + GCP
Controllers
Apenas um para a mesma função deve existir
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
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
DEMO - METALLB e GUITAR CENTER (de novo!)
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
Schedulers
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”
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
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
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
Kubelet
Kubelet
Kubelet
● Para Kubelets que lidam com containers:
○ CNI para estender rede
○ CSI para estender storage
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
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’
Virtual Kubelet
Virtual Kubelet
● Finge ser um Kubelet
● Implementa interface para as principais
funcionalidades de um Kubelet
○ Criar PODs
○ Ler ConfigMaps
○ Informar capacidade
○ Etc
Demo - AWS
Ecossistema Kubernetes estendido
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
ObrigadoRicardo P. Katz
@[email protected]@serpro.gov.br
github.com/estaleiro
Telegram: t.me/kubernetesbr