de

a

Rodolfo Pilas

rodolfo@pilas.guru
@pilasguru

https://pilas.guru

https://deployando.me

Prof. Univ. Católica del Urug.
Red Hat Certified Engeneer

DevOps @ Moove-it

CTO @ RootWay

Developers Survy Results 2019

https://insights.stackoverflow.com/survey/2019

 

  • 90.000 desarrolladores respondieron
     
  • Python: lenguaje de programación de más rápido crecimiento
     
  • Primeros códigos escritos a los 16 años
     
  • Especialistas DevOps y Site Reliability Engineers son los cargos mejores pagos
     
  • StackOverflow ahorra 30-90 minutos a la semana a los desarrolladores

de
virtualización

a
contenedores

"Virtualización es la creación a través de software de una versión virtual de algún recurso tecnológico.

Dicho de otra manera, se refiere a la abstracción de los recursos de una computadora, llamada Hipervisor, que crea una capa de abstracción entre el hardware de la máquina física (host) y el sistema operativo de la máquina virtual."

Wikipedia

Virtualización

Virtualización

Virtualización

Sistema Operativo

Virtualización

Sistema Operativo

Hipervisor

Virtualización

Sistema Operativo

Hipervisor

HW

Virtualización

Sistema Operativo

Hipervisor

HW

SO

Virtualización

Sistema Operativo

Hipervisor

App

HW

SO

Virtualización

Sistema Operativo

Hipervisor

App

HW

SO

App

App

Virtualización

Sistema Operativo

Hipervisor

App

HW

SO

App

App

App

HW

SO

App

App

App

HW

SO

App

App

App

HW

SO

App

App

"LXC (Linux Containers) es una tecnología de virtualización a nivel de sistema operativo.

LXC permite que un servidor físico ejecute múltiples instancias de sistemas aislados, conocidos como Servidores Privados Virtuales (VPS en inglés).

No es una máquina virtual, más bien es un entorno virtual que tiene su propio espacio de procesos y redes."

Wikipedia

Contenedores

Contenedores

Sistema Operativo

Contenedores

Sistema Operativo

App

Contenedores

Sistema Operativo

App

App

App

App

Contenedores

Sistema Operativo

App

App

App

App

App

App

App

App

Contenedores

Sistema Operativo

App

App

App

App

App

App

App

App

App

App

Contenedores

Sistema Operativo

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

Contenedores

Sistema Operativo

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

IP

Contenedores

Sistema Operativo

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

IP

IP

IP

IP

Contenedores

Sistema Operativo

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

IP

IP

IP

IP

Contenedores

Sistema Operativo

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

IP

IP

IP

IP

Contenedores

Sistema Operativo

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

App

IP

IP

IP

IP

a

b

c

d

Virtualizacion vs. Contenedores

Virtualizacion vs. Contenedores

  • Distinto sistema operativo
  • Distinta versión de Linux
  • Máxima performance
  • Máxima densidad
  • Corre en VM

de

Docker

docker command

docker daemon (API)

docker registry

cgroups

namespaces

filesystem

networking

cuota de recursos:

  • dispositivos
  • scheduller
  • memoria
  • CPU

Tiempo compartido UTS

Comunicación entre procesos IPC

ID de procesos PID

Usuarios

Redes

Aislación

Capas + CoW 

Caching 

Snapshotting

Software Defined Network SDN

  • Host container
  • Bridge container
  • No network

Container orchestrators

a

Kubernetes

cluster

master

node

node

worker
(minion)

worker
(minion)

Kubernetes architecture

node

master

kubectl
(cli)

dashboard
(ui)

REST client
(code)

kubelet

API
server

Scheduller

etcd

Controller
Manager

kube-proxy

Pod

Pod

Pod

Historia de Kubernetes

Junio
2014

Julio
2014

Julio
2015

Marzo
2018

Commit inicial en GitHub (Google) k8s - Go

Microsoft, RedHat, IBM y Docker

Kubernetes v1.0

Nov
2015

Primer KubeCon

Feb
2016

Helm Package Manager

CNCF Certified

Kubernetes ecosytem

Local

  • Minikube
  • Docker Desktop (Windows y Mac)
  • MicroK8S
  • k3s

Nube pública

  • Google Cloud (GKE)
  • Amazon (EKS)
  • Azure (AKS)
  • DigitalOcean

Raspberry Pi

Private
datacenter

Instalación de kubernetes

Kubernetes en la nube

  • Administración del Master
  • Nodos pueden ser VM
  • Gestión de actualizaciones
  • Precio

Curva de aprendizaje de Kubernetes

Namespace

  • propiedad adicional de los recursos
  • Separación lógica (virtual cluster)
  • Diferentes teams
  • Diferentes environments
# kubectl apply -f namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace

Pod

  • Encapsula 1 o más contenedores
  • Comparte storage
  • Comparte network:
    • IP address
    • Rango de puertos
# kubectl apply -f hostname-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: hostname-pod-example
spec:
  containers:
    - name: hostname
      image: adongy/hostname-docker

ReplicaSet

  • Escalabilidad
  • Alta-disponibilidad
  • Dispersa pods entre nodos worker
# kubectl apply -f hostname-replicaset.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: hostname-rs-example
  labels:
    name: hostname
spec:
  replicas: 3
  selector:
    matchLabels:
      name: hostname
  template:
      metadata:
        name: hostname-pod-example
        labels:
          name: hostname
          language: golang
      spec:
        containers:
          - name: hostname
            image: adongy/hostname-docker

Deployment

  • Actualiza ReplicaSet
  • Manejo de versiones
  • Roll-back
# kubectl apply -f hostname-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-example-1
  labels:
    name: example-1
spec:
  replicas: 5
  selector:
    matchLabels:
      name: hostname
  strategy:
    type: RollingUpdate
  template:
      metadata:
        name: hostname-pod-example
        labels:
          name: hostname
          language: golang
      spec:
        containers:
          - name: hostname
            image: adongy/hostname-docker

Deployment

Las aplicaciones se ven como
Deployments

# kubectl apply -f hostname-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-example-1
  labels:
    name: example-1
spec:
  replicas: 5
  selector:
    matchLabels:
      name: hostname
  strategy:
    type: RollingUpdate
  template:
      metadata:
        name: hostname-pod-example
        labels:
          name: hostname
          language: golang
      spec:
        containers:
          - name: hostname
            image: adongy/hostname-docker

Service

  • IP -> Pods
  • Crea EndPoint a la app
  • Varios tipos
  • No balancea carga
# kubectl apply -f hostname-service.yml
apiVersion: v1
kind: Service
metadata:
  name: hostname-svc
  labels:
    app: hostname
spec:
  type: ClusterIP
  selector:
    app: server
  ports:
  - port: 9999
    protocol: TCP
    targetPort: 3000

Service

# kubectl apply -f hostname-service.yml
apiVersion: v1
kind: Service
metadata:
  name: hostname-svc
  labels:
    app: hostname
spec:
  type: ClusterIP
  selector:
    app: server
  ports:
  - port: 9999
    protocol: TCP
    targetPort: 3000

El EndPoint es interno al cluster, para conectar necesitamos:

  • Un pod
  • Habilitar forward (dev)

Ingress







apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: hostname-ing
  labels:
    name: hostname
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - path: /hostname(/|$)(.*)
        backend:
          serviceName: hostname-svc
          servicePort: 3333
  • Requiere controlador
  • Controlador SSL / LB
  • Configura reglas (path)
  • Vincula con EndPoint

Text

¿preguntas?

Sobre esta presentación

Atribución 4.0 Internacional
(CC BY 4.0)

The ultimate introduction to Kubernetes - Pascal Naber

Érase una vez Kubernetes - Manuel Morejón

Basada principalmente en: