Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
info:cursos:pue:devops:sesion3 [15/02/2019 11:23] – [varios] mateinfo:cursos:pue:devops:sesion3 [04/03/2019 06:05] (actual) – [influx+grafana+telegraf] mate
Línia 1: Línia 1:
-= Sesión 3+= Sesión 3 : swarm
 == varios == varios
   * spreed brain?:   * spreed brain?:
Línia 8: Línia 8:
     * visto en el Dockerfile (https://github.com/docker-library/mysql/blob/a7a737f1eb44db467c85c8229df9d886dd63460e/8.0/Dockerfile)     * visto en el Dockerfile (https://github.com/docker-library/mysql/blob/a7a737f1eb44db467c85c8229df9d886dd63460e/8.0/Dockerfile)
   * directiva **constrains** para deployar en máquinas concretas   * directiva **constrains** para deployar en máquinas concretas
 +    * nodo, os
 +  * daryl : plantillas + variables = yaml personalizados (imagino que cualquier otra cosa)
 +  * portainer : App templates
  
 == swarm == swarm
 +=== conceptos
 +  * swarm: ''docker node ls''
 +    * node: ''docker stack ls''
 +      * stack: ''docker service ls'' - ''docker stack services <stack>''
 +        * service ''docker service ...''
 +          * tasks ''docker ...''
 +
 +=== inicialización + gestión nodos
   * ''docker swarm init''   * ''docker swarm init''
     * para crear un swarm con varios nodos, solo 1 ha de iniciarlo     * para crear un swarm con varios nodos, solo 1 ha de iniciarlo
   * ''docker swarm join-token {manager|worker}''   * ''docker swarm join-token {manager|worker}''
     * podemos añadirnos como manager o como workers al swarm creado     * podemos añadirnos como manager o como workers al swarm creado
-  * ''docker stack deploy -c stack-portainler.yml portainer'' +  * ''docker node ls''lista nodos del cluster swarm
-  * ''docker stack ls''stacks +
-  * ''docker stack services <stack>'' : nombre servicio +
-  * ''docker service ps <servicio>''+
   * ''docker node inspect''   * ''docker node inspect''
 +
 +=== stacks & servicios
 +  * ''docker stack deploy -c stack-portainler.yml portainer'': crea nuevo stack a partir de fichero YAML
 +  * ''docker stack ls'' : stacks en el cluster
 +  * ''docker stack services <stack>'' : lista los servicios del stack
 +  * ''docker service ps <servicio>'' : lista los contenedores
 +
 +=== logs & inspección
 +  * ''docker service logs <servicio>''
 +  * si no puedes ver logs del contenedor, mirar en logs de docker:
 +    * /var/log/messages
 +    * /var/log/syslog
 +    * o en algún concentrador (ELK)
 +  * inspeccionar en el nodo que se está ejecutando:
 +    * ''docker ps''
 +    * ''docker ps -f name=<> [-q]'' : obtener la ID del contenedor filtrado por nombre
 +    * ''docker exec -ti $(docker ps -f name=<nombre> -q) /bin/bash''
 +    * ''docker logs $(docker ps -f name=ep_devops_mysql.1 -q )''
 +    * ''docker logs -f $(docker ps -f name=ep_devops_mysql.1 -q )''
 +
 +
 +
 +  * ''ssh <nodo_swarm>''
 +    * ''docker ps -f name=<nombre_contenedor>''
  
 === portainer === portainer
 +requiere tener una red llamada proxy creada: ''docker network create --driver overlay proxy''
 <code yaml; swarm-portainer.yml> <code yaml; swarm-portainer.yml>
 version: '3.4' version: '3.4'
Línia 344: Línia 377:
   enabled = true   enabled = true
   run-interval = "1s"   run-interval = "1s"
 +</code>
 +
 +relevante:
 +  * constrains
 +  * tasks.<servicio>
 +  * si apuntas un loadbalancer (traefik) a los master...
 +  * en el caso de este portainer, no desplegamos en al red de docker, si no sobre la máquina loca (pila tcp-ip local)
 +
 +<code yaml; kpeiruza-portainer.yml>
 +version: '3.4'
 +
 +services:
 +  portainer:
 +    image: portainer/portainer
 +    command: '-H "tcp://tasks.agent:9001" --tlsskipverify'
 +    ports:
 +      - ${PUBLIC_PORT}:9000
 +    networks:
 +      - proxy
 +      - portainer_agent
 +    volumes:
 +      - /var/run/docker.sock:/var/run/docker.sock
 +      - ${REMOTE_MOUNT}/${STACK_NAME}/portainer/data:/data
 +    deploy:
 +      mode: replicated
 +      replicas: 1
 +      labels:
 +        traefik.port: 9000
 +        traefik.frontend.rule: "Host:${FQDN}"
 +        traefik.docker.network: 'proxy'
 +      placement:
 +        constraints: [node.role == manager]
 +    
 +  agent:
 +    image: portainer/agent
 +    environment:
 +      AGENT_CLUSTER_ADDR: tasks.agent
 +    volumes:
 +      - /var/run/docker.sock:/var/run/docker.sock
 +    ports:
 +      - target: 9001
 +        published: 9001
 +        protocol: tcp
 +        mode: host
 +    networks:
 +      - portainer_agent
 +    deploy:
 +      mode: global
 +      placement:
 +        constraints: [node.platform.os == linux]
 +
 +
 +
 +networks:
 +  portainer_agent:
 +    external: true
 +  proxy:
 +    external: true
 +</code>
 +
 +=== traefik (con https y let's encrypt)
 +<code yaml; traefik-proxy.yaml>
 +version: '3.5'
 +
 +services:
 +  traefik:
 +    image: library/traefik:1.7
 +    command: 
 +      - "--api"
 +      - "--entrypoints=Name:http Address::80 Redirect.EntryPoint:https"
 +      - "--entrypoints=Name:https Address::443 TLS"
 +      - "--defaultentrypoints=http,https"
 +      - "--acme"
 +      - "--acme.entryPoint=https"
 +      - "--acme.httpChallenge.entryPoint=http"
 +      - "--acme.OnHostRule=true"
 +      - "--acme.onDemand=false"
 +      - "--acme.email=info@example.com"
 +      - "--acme.storage=/etc/traefik/acme/acme.json"
 +      - "--docker"
 +      - "--docker.swarmmode"
 +      - "--docker.domain=example.com"
 +      - "--docker.watch"
 +#      - "--logLevel=DEBUG"
 +#      - "--traefikLog.filePath=/dev/sterr"
 +#      - "--accessLog.filePath=/dev/stdout"
 +#      - "--accessLog.filters.statusCodes=200,300-302,400-460,500"
 +#      - "--accessLog.filters.retryAttempts=true"
 +#      - "--accessLog.fields.defaultMode=keep"
 +#      - "--accessLog.fields.names=Username=drop"
 +#      - "--accessLog.fields.headers.defaultMode=keep"
 +#      - "--accessLog.fields.headers.names=User-Agent=redact Authorization=drop Content-Type=keep"
 +#      - "--traefikLog.format=json"
 +#      - "--accessLog.format=json"
 +    networks:
 +      - frontal
 +    volumes:
 +      - /var/run/docker.sock:/var/run/docker.sock
 +      - /srv/docker/traefik/certificates:/etc/traefik/acme/
 +    ports:
 +      - 80:80
 +      - 443:443
 +      - 8080:8080
 +    deploy:
 +      restart_policy:
 +        condition: on-failure
 +
 +networks:
 +  frontal:
 +    external: true
 +</code>
 +
 +=== traefik (simple)
 +<code swarm-traefik.yml>
 +version: '3.5'
 +
 +services:
 +  traefik:
 +    image: library/traefik:1.7
 +    command: 
 +      - "--api"
 +      - "--entrypoints=Name:http Address::80"
 +      - "--defaultentrypoints=http"
 +      - "--docker"
 +      - "--docker.swarmmode"
 +      - "--docker.domain=example.com"
 +      - "--docker.watch"
 +#      - "--logLevel=DEBUG"
 +#      - "--traefikLog.filePath=/dev/sterr"
 +#      - "--accessLog.filePath=/dev/stdout"
 +#      - "--accessLog.filters.statusCodes=200,300-302,400-460,500"
 +#      - "--accessLog.filters.retryAttempts=true"
 +#      - "--accessLog.fields.defaultMode=keep"
 +#      - "--accessLog.fields.names=Username=drop"
 +#      - "--accessLog.fields.headers.defaultMode=keep"
 +#      - "--accessLog.fields.headers.names=User-Agent=redact Authorization=drop Content-Type=keep"
 +#      - "--traefikLog.format=json"
 +#      - "--accessLog.format=json"
 +    networks:
 +      - frontal
 +    volumes:
 +      - /var/run/docker.sock:/var/run/docker.sock
 +      - /srv/docker/traefik/certificates:/etc/traefik/acme/
 +    ports:
 +      - 80:80
 +      - 443:443
 +      - 8080:8080
 +    deploy:
 +      restart_policy:
 +        condition: on-failure
 +
 +networks:
 +  frontal:
 +    external: true
 </code> </code>
  • info/cursos/pue/devops/sesion3.1550258587.txt.gz
  • Darrera modificació: 15/02/2019 11:23
  • per mate