Docker et déploiement distant : tout est histoire de contexte


08/12/2020 docker context ssh gitlab gitlab-ci

Kubernetes, c’est bien mais parfois on veut faire des choses plus simples et on n’a pas forcément besoin d’avoir un système distribué ou d’une forte disponibilité. Pour autant, il est agréable avec kubernetes de pouvoir interagit à distance avec l’API au travers de kubectl. Je me suis donc mis en quête d’une alternative. Partir sur k3s avec un déploiement mono-node ? Partir sur docker/docker-compose/docker-swarm ?

Je me souvenais que l’on pouvait exposer la socket docker sur le réseau en TCP et authentification par certificat mais cela ne me plaisait pas beaucoup. Je me suis alors rappelé que l’on pouvait interagir avec un hote docker via une connection ssh. En continuant à creuser, je suis tomber sur les contextes dans Docker et ce billet How to deploy on remote Docker hosts with docker-compose. Et là : 🤩

Alors, certes, pas de secrets, configmaps ou cronjobs mais un déploiement remote que je peux automatiser dans gitlab et/ou avec lequel je peux interagir à distance 😍

Création d’un contexte puis utilisation d’un contexte :

# Création du contexte docker
docker context create mon-serveur ‐‐docker “host=ssh://user@monserveur”

# Lister les contextes docker existant
docker context ls

# Utiliser un contexte
docker context use mon-serveur

# Vérifier le bon fonctionnement de la cli docker
docker ps
[liste de conteneurs tournant sur la machine "mon-serveur"]

# Vérifier le bon fonctionnement de la cli docker-compose
cd /path/to/docker/compose/project
docker-compose ps

Pour que cela fonctionne, en plus des versions récentes de docker et docker-compose coté client et serveur. Il vous faut aussi une version récent de paramiko coté client. Celle présente dans Debian 10 n’est pas assez à jour par ex, il a fallu passer par pip3 install paramiko. Il faut aussi avoir une authentification par clé pour se simplifier la vie.

Pour docker-compose, vous avez deux solutions pour utiliser un contexte distant :

# En deux commandes
docker context use <remote context>
docker-compose <command>

# En une commande
docker-compose --context <remote context> <command>

Dans gitlab, dans le fichier .gitlab-ci.yml, on peut alors profiter de cette intégration de la façon suivante ; je prends l’exemple du déploiement du site du Paris Time Series Meetup.

Tout d’abord, dans mon fichier docker-compose.yml, j’ai mis un place holder IMAGE qui sera remplacé par la référence de mon image docker fabriquée par gitlab-ci :

version: '3.8'
services:
  web:
    image: IMAGE
    labels:
        [...]
    restart: always

Ensuite, dans gitlab-ci :

  • le job “publish” génère la version html du site et le stock dans un artefact gitlab.
  • le job “kaniko” va générer l’image docker contenant la version html du site. Pour passer la version de l’image, je stocke l’information dans un fichier docker.env. Ce fichier sera sauvegardé en fin de job sous la forme d’un artefact disponible pour le job “docker”.
  • le job “docker” recupère ce qui était dans le docker.env sous la forme de variable d’environnement. Il remplace ensuite IMAGE par sa vraie valeur. On initialise le contexte docker pour se connecter au serveur cible et on peut alors réaliser les actions habituelles avec docker-compose.
---
stages:
  - publish
  - image
  - deploy

publish:
  image:  $CI_REGISTRY/nsteinmetz/hugo:latest
  artifacts:
    paths:
      - public
    expire_in: 1 day
  only:
    - master
    - web
  script:
    - hugo
  stage: publish
  tags:
    - hugo

kaniko:
  stage: image
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  variables:
    RELEASE_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_ID-$CI_JOB_ID
  script:
    - echo "IMAGE=${RELEASE_IMAGE}" >> docker.env
    - mkdir -p /kaniko/.docker
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $RELEASE_IMAGE
  only:
    - master
    - web
  when: on_success
  tags:
    - kaniko
  artifacts:
    reports:
      dotenv: docker.env

docker:
  stage: deploy
  before_script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
  script:
    - sed -i -e "s|IMAGE|${IMAGE}|g" docker-compose.yml
    - docker context use mon-serveur
    - docker-compose pull
    - docker-compose up -d
  needs:
    - job: kaniko
      artifacts: true
  when: on_success
  only:
    - master
    - web
  tags:
    - shell
  environment:
    name: production
    url: https://www.ptsm.io/

Et voilà ! 😎

Avec ces contextes (que l’on peut utiliser aussi avec swarm et kubernetes), on a donc un moyen simple et efficace pour déployer des conteneurs à distance et de façon automatisée.

Web, Ops & Data - Octobre 2018


31/10/2018 ansible test ssh tls php molecule rolespec iac cli postgres redis certificats vault hashicorp training firefox cookie redhat ibm

J’ai eu le plaisir et l’opportunité de participer à la réalisation de l’épisode 10 de Dev’Obs, le magazine du DevOps, pendant lequel nous avons parlé de formation, d’innovation et des tests dans la mouvance Infrastructure As Code.

Acquisition

Automatisation

  • Mitogen for Ansible : extension pour Ansible qui permettrait d’accélérer Ansible via une optimisation de la connexion à l’hôte distant. “Expect a 1.25x - 7x speedup and a CPU usage reduction of at least 2x, depending on network conditions, modules executed, and time already spent by targets on useful work. Mitogen cannot improve a module once it is executing, it can only ensure the module executes as quickly as possible."
  • Molecule : molelcule est un framework pour Ansible permettant de tester les rôles/playbooks au travers de linter (syntaxe yaml, python, etc), mais aussi de réaliser des tests unitaires, de valider l’omnipotence d’une tâche, etc. A tester, mais vous ne devriez plus avoir de mauvaises surprises à l’exécution d’un playbook et ainsi mettre fin au cycle “run, break, fix” que l’on a trop souvent avec Ansible.
  • Ansible to adopt molecule and ansible-lint projects : les projets molecule et ansible-lint vont passer sous l’organisation Ansible sur Github et ont pour objectif d’accroitre la qualité des playbooks ansible. Cela fait apparamment partie aussi d’un objectif RedHat de péréniser les ressources liées au projet tout en étendant l’écosystème.
  • The release of Red Hat Ansible Engine 2.7 : Pas de révolution dans cette version, essentiellement des améliorations de perfomances/stabilité/connectivité. Il faudra une version python 2.7+ ou 3.5+ pour qu’Ansible fonctionne correctement.
  • Reboot Plugin for Linux in Ansible 2.7 : Avec l’arrivée de cette version 2.7 arrive également officiellement le module reboot. Il permet ainsi de piloter des playbooks pour lesquels un reboot est nécessaire (mise à jour de noyau, etc).
  • 12 Factor CLI Apps : le principe des 12 factors apps appliqué aux outils en ligne de commande. Il y a pas mal de bonnes idées (et donc de travail à faire) pour améliorer ses scripts.

(No)SQL

  • [RELEASE] Redis 5 is out! : l’annonce de la version 5.0 de la base Redis vient de sortir avec pas moins de 19 nouveautés listées. Si les Streams sont la principale nouveauté de cette version, de nombreuses améliorations ont été apportées à la base. La montée de version se veut compatilbe à 99%, il y a néanmoins quelques incompatibilités.
  • PostgreSQL 11 Released! : la version 11 de la base Postgres vient de sortir - ce que j’ai retenu de cette version majeure, c’est le support du catch-all dans le partitionning (si une donnée ne correspond à aucune clé de partitionnement, alors le catch-all récupère cette donnée) et la capacité à mettre à jour ces clés de partitionnement. D’autres nouveautés sont également intéressantes, je vous laisse le soin de les lire. Une traduction française de l’annonce est disponible sur le blog de Loxodata.

Sécurité

  • Around 62% of all Internet sites will run an unsupported PHP version in 10 weeks : Pour les sites développés en PHP, à compter de janvier 2019, il faudra être minimum en version de PHP 7.1 pour avoir les mises à jour de sécurité - le support de PHP 5.6 et 7.0 se finit à la fin de l’année.
  • Extended Validation Certificates are Dead : le bandeau avec l’intitulé de l’organisme propriétaire du certificat est en train de disaparaitre des navigateurs. Il ne sert donc plus à rien d’en acheter un.
  • Removing Old Versions of TLS : TLS 1.0 et 1.1 ne seront plus supportés en mars 2020 dans les navigateurs. Dès aujourd’hui, ces deux versions ne représentant que ~1% du traffic observé par les navigateurs, il peut être judicieux de n’utiliser que du TLS 1.2+ et voir s’il n’y a pas quelques vieux programmes à mettre à jour d’ici là…
  • Announcing the HashiCorp Learn Platform for HashiCorp Vault : pour ceux qui veulent se faire la main sur Vault et mieux gérer leurs secrets applicatifs, Hashicorp vient de lancer une plateforme gratuite et avec des contenus sous licence libre (un dépot sera prochainement mis à disposition) pour se former à leur outil Vault.
  • Firefox 63 Lets Users Block Tracking Cookies - Firefox va incorporer un mécanisme expérimental de gestion des cookies pour limiter le pistage inter sites. A activer selon vos préférences.

Web, Ops & Data - Janvier 2018


31/01/2018 mysql mariadb root dns ssh bastion docker kubernetes let's encrypt test unitaire test coreos redhat

Container & Orchestration

  • Core Workloads API GA : la version 1.9 de Kubernetes sortie tout début janvier marque un tourant intéressant avec le passage en stable des “Core Workload API” (Pod, ReplicationController, ReplicaSet, Deployment, DaemonSet, and StatefulSet). Avec cette stabilisation des termes, des concepts et des API, c’est le socle de Kubernetes qui se stabilise sérieusement. Une bonne raison de plus de creuser cette solution au fur et à mesure que l’écosystème va se stabiliser et se simplifier.
  • The Twelve-Factors Kubernetes : Revue de la terminilogie et des concepts de Kubernetes au travers de 12 points et énonciation de quelques bonnes pratiques générales associées.
  • Traefik 1.5 - Cancoilote Is Here : cette version corrige notamment le problème de méthode de génération de certificat de Let’s Encrypt (voir plus bas). En plus de celà, cette version apporte notamment une gestion dynamique des certificats par frontend/backend et de la qualité de service avec la possibilité de définir des limites de consommation de ressources.
  • Container Structure Tests: Unit Tests for Docker Images : Google vient de sortir son framework de tests unitaires pour les containers Docker. A creuser pour voir s’il n’est possible de faire que de tests de “surface” ou bien si on peut aller plus en profondeur (mais est-ce souhaitable ?)
  • CoreOS to join Red Hat to deliver automated operations to all : CoreOS rejoint la galaxie RedHat qui fait son retour dans le monde des conteneurs… après Openshift (qui s’appuie sur Docker + Kubernetes), voilà qu’ils mettent la main sur CoreOS + Tectonic (la version de Kubernetes packagée par CoreOS), ainsi que les autres projets CoreOS (etcd, etc). Ils vont pouvoir proposer un sacré vertical et revenir dans la cour des acteurs majeurs du conteneur ; sans parler du fait qu’ils ont aussi Ansible pour la partie automatisation…

Infrastructure

  • Le Bastion SSH : Petite revue théorique et pratique d’un bastion SSH, la passerelle SSH qui vous permet d’accéder depuis un réseau X à des machines d’un réseau Y en SSH dans exposer tout le réseau Y en libre accès ou parce que le réseau Y n’a pas d’IP publique ou … Si vous prévoyer de déployer un bastion, prévoyez d’en avoir deux pour éviter le SPOF (ou qu’il soit redéployable très rapidement).
  • PHP et les résolveurs DNS : à l’heure des micro-services et des API, une mauvaise couche réseau et votre application peut très mal se comporter. L’article porte ici sur la résolution DNS et les solutions de cache possible pour que votre application soit plus résiliente.

(No)SQL

  • Moving from MySQL to MariaDB in Debian 9 : je me demandais pourquoi je perdais mon accès au compte root d’une instance MariaDB suite à un mysql_secure_installation, voici enfin la réponse. Sur les nouvelles installations, l’accès au compte root de mariadb est protégé. Il faut passer par sudo mysql -u root -p ... par ex pour pouvoir se connecter en root.
  • How to Install MariaDB on Debian 9 Stretch : l’article qui m’a mis sur la piste et qui donne éventuellement une solution de contournement pour reproduire l’ancien mécanisme (à vos risques et périls).
  • An update on Redis Streams development : les Streams dans Redis, ce sera pour la version 5.0 prévue pour dans 2 mois. Pour rappel, les Streams, ce sont des listes Redis + PubSub + historique. C’est une réponse de Redis sur la partie Topic/Message de Kafka.

Certificats

  • Let’s Encrypt a annoncé le 10 janvier avoir identifié une “faille” lors de la génération du certificat lié à l’utilisation de Let’s Encrypt dans un environnement mutualisé via la méthode TLS-SNI. Avec le partage d’une même IP, il serait possible pour une personne malveillante de récupérer un certificat pour votre domaine à votre insu. Let’s Encrypt a finalement décidé de désactiver complètement les méthodes TLS-SNI-001 et TLS-SNI-002 et de travailler sur une nouvelle méthode TLS-SNI-003 qui corrigerait ce problème. En attendant, il faut utiliser les méthodes HTTP-01 ou DNS-01.

Astuce(s) du mois

La commande docker history (ou docker image history) permet de voir le nombre de layers d’une image, la taille de ces layers et leur âge. Exemple avec l’image nginx:stable :

docker image history nginx:stable
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
dfe062ee1dc8        6 weeks ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
<missing>           6 weeks ago         /bin/sh -c #(nop)  STOPSIGNAL [SIGTERM]         0B
<missing>           6 weeks ago         /bin/sh -c #(nop)  EXPOSE 80/tcp                0B
<missing>           6 weeks ago         /bin/sh -c ln -sf /dev/stdout /var/log/nginx…   22B
<missing>           6 weeks ago         /bin/sh -c set -x  && apt-get update  && apt…   53.1MB
<missing>           6 weeks ago         /bin/sh -c #(nop)  ENV NJS_VERSION=1.12.2.0.…   0B
<missing>           6 weeks ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.12.2-…   0B
<missing>           6 weeks ago         /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B
<missing>           6 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>           6 weeks ago         /bin/sh -c #(nop) ADD file:f30a8b5b7cdc9ba33…   55.3MB

Pour avoir l’intégralité du contenu de la ligne “CREATED BY”, il suffit de rajouter un --no-trunc.

Source : Docker - history

C’est assez pratique lorsque l’on cherche notamment à comprendre et optimiser la taille de ses images Docker.

Web, Ops & Data - Semaine 14


08/04/2016 reverse-proxy docker kubernetes elasticsearch kibana vnc ssh openshit influxdb tick reindex

Infrastructure

Container

  • Elastikube : une solution de gestion d’une infrastructure Kubernetes ; cela fait penser à une version allégée d'Openshift. Containers
  • Containers are not VM : Une clarification par l’équipe Docker sur la différence entre un container et une VM sur la base de l’analogie avec l’appartement (le container) et la maison (la VM). Une maison (VM) contient tout ce dont elle a besoin pour fonctionner alors que pour un immeuble, des ressources sont partagées et chaque appartement de l’immeuble en profite dans une certaine mesure.
  • Docker a annoncé Docker pour Windows/Mac (beta) ; cela permet d’utiliser Docker de façon plus native et intuitive sous Windows/Mac. Pour Windows, cela demande d’avoir Windows 10 pour bénéficier de l’hypervision via Hyper-V. Sur ce sujet, l’équipe Hypriot dans leur revue de Docker pour Mac et Docker pour Windows montre le bonus (easter egg) de cette version à savoir qu’il est possible de faire tourner des conteneurs ARM sous environnement OSX/Windows ; cela permettrait de batir des conteurs pour Raspberry ou des projets IoT plus facilement. Je ne peux hélas pas le tester pour le moment, mais cela semble plus prometteur que Docker Toolbox qui reste un peu complexe à mettre en oeuvre.
  • Rancher, une solution d’orchestration de conteneurs, après avoir annoncé le support de Kubernetes, vient d’annoncer la sortie de la version 1.0. A suivre, même si la notion d’environnement ne permettrait pas une allocation optimale des capacités d’infrastructure (chaque environnement aurait ses hôtes alors que Kubernetes pourrait a priori permettre une mutualisation totale via la gestion des “namespaces” ; à creuser !).
  • Kubernetes, la solution d’orchestration de container (Docker/Rocket) développée par Google, est sorti en version 1.2 avec diverses améliorations et notamment une nouvelle GUI.
  • Kubernetes on ARM vient de sortir sous la version 0.7.0 ; de quoi se faire la main sur Kubernetes avec vos Raspberry ;-) ; une image Rancher est d’ailleurs disponible.
  • Docker en production : la bataille sanglante des orchestrateurs de conteneurs : Pour conclure, Octo compare Docker Swarm, Kubernetes et Openshift et donnant Kubernetes gagant pour le moment. Personellement, vu qu’a minima pour Kubernetes et Docker Swarm, on peut utiliser des containers docker, il est peut être intéressant de combiner les 2 solutions qui répondent plus ou moins bien à différentes problématiques. Je vois assez bien l’utilisation de Docker Swarm dans une logique de développement / labs et plus Kubernetes en effet dans une logique de production pure. Il ne faut pas se cacher que Kubernetes est plutôt “Ops friendly” et remonte la chaine de valeur vers les développeurs quand Docker fait le contraire…

Elasticsearch & friends

InfluxDB & Friends

Sysadmin

  • Teleport ; Une passerelle (bastion) SSH qui permet d’accéder à ses serveurs via SSH ou en HTTPS via une IHM Web. A tester !

Sécurité

  • VNCFail ; vous reprendrez bien un peu de non sécurité: l’analyse des 4 milliards de plage IPv4 remonte 5 millions d’adresse pour lesquelles le logiciel VNC (prise de contrôle à distance) est accessible et au final 2.246 hotes avec des systèmes accessibles sans mot de passe dont des systèmes sensibles (contrôle d’aération, usine éléctrique, etc).

Syndication

Restez informé(s) de notre actualité en vous abonnant au flux du blog (Atom)

Nuage de tags

kubernetes docker influxdb timeseries traefik grafana kafka ansible elasticsearch postgres python warp10 aws sécurité mysql redis terraform tick cassandra cloud helm ovh git swarm telegraf rancher résilience test timescaledb chronograf docker-compose flux gitlab ptsm architecture arm confluent dashboard devops ksql log machine-learning microservice monitoring prometheus s3 serverless spark angularjs api bilan cert-manager cncf container cérénit dns gcp graphql hashicorp iac ingress java javascript opensource operator optimisation perspective raspberrypi service-mesh sql ssh stream vscode warpscript windows csp documentation elastic flows gke hpkp influxace jenkins kafka-streams kapacitor kibana kubedb lambda lean licence maesh maintenance mariadb microsoft mobile nginx npm orientdb performance pipeline redhat rest rethinkdb reverse-proxy rook sauvegarde scaleway agile apm automatisation azure bash big-data bigdatahebdo ceph certificat ci/cd cli cluster containerd continous-delivery continous-integration cookie deployment diff fluxlang forecast framework gdpr gitlab-ci grav hsts http/3 https hypriot hébergement influxdata influxdays istio jq json k3s lets-encrypt linux load-balancer longhorn meetup molecule mongodb nosql nvidia openebs percona php pip podman postgresql reaper registry replication rootless rpi rsyslog runc scale secrets société solr sre systemd timezone tls vault virtualenv vitess vue.js wagtail warpfleet yarn accessibilité acme akka alerte alibaba amazon-emr amqp anonymisation anthos apache-pulsar ara arima arrow audit bastion beam beat bounded-context branche brigade browser buildkit cahier-des-charges calico cassandra-reaper cd cdc cdk centos centralisation-de-logs certificats cgroups chart checklist chrome ci cilium cloud-init cloud-native cloud-storage clusterip cnab cni cockroachdb code codeurs-en-seine commit confluence conftest consul context continous-deployment conventional-commit coreos cors covid19 cqrs crash cri cron crontab csi csrf css curl d3.js daemonset data data-engineer data-pipelining data.gouv.fr datacenter dataviz date date-scientist ddd debezium debian delta deprek8 desktop devoxx dig distributed-systems dive docker-app docker-hub docker-registry docker-swarm dockershim documentdb dog dokcer données-personnelles draft drop-in duration déploiement développement-du-site e-commerce ebs ec2 edge elassandra electron elk engineering entreprise ergonomie etcd event-sourcing faas facebook faisabilité falcor feature-policy fedora feed filebeat firebase firefox fish flash flask fleet flink fluentd formation foundation frontend fsync fullstack github gitignore glacier glowroot google google-cloud-next gpu grid géospatial hacker hadoop haproxy harbor hdfs header html html5 http hue ia iaac ibm immutable incident index influxcloud infrastructure-as-code ingénierie inspec iot jquery jwt k3d k8s k9s kotlin kubeadm kubecon kubectl laravel letsencrypt linky liste-de-diffusion loadbalancer logstash logstatsh loi mailing-list management maturité mesh mesos message metallb micro-service mot-de-passe mqtt multi-cloud médecine métrique network newsletter nodeport nomad null object-storage observability observabilité opa opendata openmetrics openshit openssh openstack openweb over-engineering ovhcloud packaging pandas parquet partiql password persistent-volume-claim pipenv pod portainer portworx prediction prescience production ptyhon publicité pubsub pulsar push pyenv pérénnité qualité quasardb quay questdb queue quic ram rambleed raml react recaptcha recherche redistimeseries reindex reinvent reliability responsive revocation revue-de-code rgpd rhel rkt rolespec root rpo rto rust rwd safe-harbor scalabilité scanner schema scp sdk search select serverless-architecture service service-account service-worker setuptools sftp sha1 sharding shell shipyard sidecar souveraineté-numérique spinnaker spécifications sri ssh-agent ssl stabilité stash statistique storage superset suse sympa syslog-ng sérénité terracost terrascan test-unitaire tidb tiers timer timescale timestream training travail tsl ubuntu unikernel unit ux vector vendredi victoria-metrics vie-privée virtualbox virtualisation vm vnc volume voxxeddays vpc warpstudio web yaml yq yubikey