Resources attached to the Road To DevOps tutorial
https://blog.noobtoroot.xyz/road-to-devops/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
367 lines
8.5 KiB
367 lines
8.5 KiB
2 years ago
|
# Docker
|
||
|
|
||
|
![Schema Docker Swarm](images/docker-wave-whale.svg "Schema Docker Swarm")
|
||
|
|
||
|
__Les hôtes Docker__
|
||
|
|
||
|
Maxime Poullain • Christian Tritten
|
||
|
|
||
|
|
||
|
|
||
|
## Où déployer ses conteneurs ?
|
||
|
|
||
|
|
||
|
* Bare-metal
|
||
|
|
||
|
|
||
|
* IaaS - cloud public
|
||
|
|
||
|
* Amazon Web Services (AWS)
|
||
|
|
||
|
* Google Cloud Engine (GCE)
|
||
|
|
||
|
* Microsoft Azure
|
||
|
|
||
|
* ...
|
||
|
|
||
|
|
||
|
* IaaS - cloud privé
|
||
|
|
||
|
* OpenStack
|
||
|
|
||
|
|
||
|
* CaaS
|
||
|
|
||
|
* Google Kubernetes Engine
|
||
|
|
||
|
* Amazon Elastic Container Service for Kubernetes
|
||
|
|
||
|
* ...
|
||
|
|
||
|
|
||
|
## Offres CaaS
|
||
|
|
||
|
|
||
|
### Google Kubernetes Engine
|
||
|
|
||
|
* Google gère l'infrastructure multi-masters de kubernetes.
|
||
|
|
||
|
* Kubernetes Engine est certifié conforme Kubernetes : compatibilité complète avec l'écosystème Kubernetes.
|
||
|
|
||
|
* Monitoring complet du cluster.
|
||
|
|
||
|
* Les applications Kubernetes standard sont entièrement compatibles et peuvent facilement être migrées vers Google Kubernetes Engine.
|
||
|
|
||
|
* C'est l'offre la plus complète du marché.
|
||
|
|
||
|
* [https://cloud.google.com/kubernetes-engine/](https://cloud.google.com/kubernetes-engine/)
|
||
|
|
||
|
|
||
|
### Amazon Elastic Container Service for Kubernetes
|
||
|
|
||
|
* Amazon gère l'infrastructure multi-masters de Kubernetes.
|
||
|
|
||
|
* Amazon EKS est certifié conforme Kubernetes : compatibilité complète avec l'écosystème Kubernetes.
|
||
|
|
||
|
* Les applications Kubernetes standard sont entièrement compatibles et peuvent facilement être migrées vers Amazon EKS.
|
||
|
|
||
|
* [https://aws.amazon.com/fr/eks/](https://aws.amazon.com/fr/eks/)
|
||
|
|
||
|
|
||
|
## Distributions classiques
|
||
|
|
||
|
Toutes les grandes distributions incluent désormais Docker dans leurs dépôts de paquets :
|
||
|
|
||
|
* Debian
|
||
|
|
||
|
* Ubuntu
|
||
|
|
||
|
* RedHat
|
||
|
|
||
|
* CentOS
|
||
|
|
||
|
|
||
|
Toutefois les versions de Docker proposées dans ces dépôts peuvent dater.
|
||
|
|
||
|
Pour pallier cela Docker Inc. maintient ses propres dépôts avec les versions à jour de ses produits :
|
||
|
|
||
|
* http://apt.dockerproject.org
|
||
|
|
||
|
* http://yum.dockerproject.org
|
||
|
|
||
|
|
||
|
|
||
|
## Systèmes d'exploitation spécialisés
|
||
|
|
||
|
* Systèmes légers, conçus et optimisés pour les conteneurs
|
||
|
|
||
|
* Peuvent intégrer nativement des fonctionnalités avancées
|
||
|
|
||
|
* Peuvent présenter une sécurité accrue
|
||
|
|
||
|
|
||
|
### RedHat Atomic
|
||
|
|
||
|
![Logo Atomic](images/logo-atomic.png)
|
||
|
|
||
|
* Développé par RedHat
|
||
|
* Système Linux léger et immutable (read only OS)
|
||
|
* Basé sur systemd
|
||
|
* Intègre une IHM dédiée : Cockpit
|
||
|
* Orchestration possible via Kubernetes
|
||
|
|
||
|
|
||
|
### CoreOS
|
||
|
|
||
|
![Logo CoreOS](images/logo-coreos.jpg)
|
||
|
|
||
|
* Basé sur systemd, etcd, rkt, fleet, flannel
|
||
|
* Peut faire tourner des conteneurs rkt et docker
|
||
|
* Fleet est un système d'init distribué basé sur systemd qui permet l'orchestration de conteneurs sur plusieurs hôtes.
|
||
|
* Intégration facile avec Kubernetes
|
||
|
* Production ready
|
||
|
|
||
|
|
||
|
### RancherOS
|
||
|
|
||
|
![Logo Rancher](images/logo-rancher.jpg)
|
||
|
|
||
|
* Système Linux minimaliste (20Mb) basé sur Docker
|
||
|
* Docker tourne directement au dessus du kernel, avec le PID 1 (en remplacement de... sysVinit / systemd)
|
||
|
* Tous les services habituels du "user-space" sont fournis sous forme de conteneurs Docker
|
||
|
* Les conteneurs applicatifs utilisent un daemon Docker séparé
|
||
|
|
||
|
|
||
|
#### Architecture de RancherOS
|
||
|
|
||
|
![Architecture RancherOS](images/rancheros-architecture.png)
|
||
|
|
||
|
|
||
|
### VMware Photon OS
|
||
|
|
||
|
![Logo Photon](images/logo-photon.jpg)
|
||
|
|
||
|
* Développé par VMware en opensource
|
||
|
* Système Linux léger optimisé pour les plateformes VMware
|
||
|
* Intégration avec vSphere et vCloud Air
|
||
|
* Supporte les conteneurs Docker et rkt
|
||
|
|
||
|
|
||
|
|
||
|
## Comment Déployer ?
|
||
|
|
||
|
- À la main ;-)
|
||
|
|
||
|
- Infrastructure as code
|
||
|
* Ansible
|
||
|
* Heat
|
||
|
* Terraform
|
||
|
* ...
|
||
|
|
||
|
|
||
|
### Infrastructure as Code
|
||
|
|
||
|
L'infrastructure cible est décrite dans des fichiers de configuration à l'aide d'une syntaxe spécifique.
|
||
|
|
||
|
Il devient possible gérer et versionner les modifications apportées à l'infrastructure.
|
||
|
|
||
|
Reconstruire, modifier partiellement ou dupliquer une infrastructure s'en trouve d'autant simplifié.
|
||
|
|
||
|
|
||
|
#### Exemple de workflow de déploiement
|
||
|
|
||
|
- Authentification auprès du fournisseur
|
||
|
- Allocation des ressources stockage et d'adressage IP
|
||
|
- Création du réseau
|
||
|
- Déploiement des VMs
|
||
|
- Configuration OS
|
||
|
- Installation et configuration du démon Docker (et/ou Swarm)
|
||
|
|
||
|
|
||
|
#### Ansible
|
||
|
|
||
|
![Ansible](images/logo-ansible.png)
|
||
|
|
||
|
_Ansible_ est un outil de gestion de configuration très populaire.
|
||
|
|
||
|
Sa force réside dans un écosystème riche de centaines de modules permettant de gérer à peu près tous les aspects d'une infrastructure ou d'un système.
|
||
|
|
||
|
|
||
|
A l'origine conçu comme outil de gestion de configuration pour les systèmes Linux, il peut désormais s'interfacer avec les cloud les plus populaires :
|
||
|
* AWS,
|
||
|
* GCP,
|
||
|
* Azure,
|
||
|
* OpenStack,
|
||
|
* VMware,
|
||
|
* et bien d'autres ...
|
||
|
|
||
|
|
||
|
Par exemple les modules Ansible pour OpenStack offrent les fonctionnalités suivantes :
|
||
|
|
||
|
* Keystone: users, groups, roles, projects
|
||
|
* Nova: servers, keypairs, security-groups, flavors
|
||
|
* Neutron: ports, network, subnets, routers, floating IPs
|
||
|
* Ironic: nodes, introspection
|
||
|
* Swift Objects
|
||
|
* Cinder volumes
|
||
|
* Glance images
|
||
|
|
||
|
|
||
|
Il offre également une gestion partielle de Docker via des modules dédiés :
|
||
|
|
||
|
* docker (D) - manage docker containers
|
||
|
* docker_container - manage docker containers
|
||
|
* docker_image - Manage docker images.
|
||
|
* docker_image_facts - Inspect docker images
|
||
|
* docker_login - Log into a Docker registry.
|
||
|
* docker_network - Manage Docker networks
|
||
|
* docker_service - Manage docker services and containers.
|
||
|
|
||
|
|
||
|
<!-- .slide: data-state="medium-code" -->
|
||
|
```
|
||
|
---
|
||
|
# Ansible and OpenStack automation
|
||
|
- name: VM deployment
|
||
|
hosts: docker-cluster
|
||
|
tasks:
|
||
|
...
|
||
|
- name: Create the network
|
||
|
os_network:
|
||
|
state: present
|
||
|
name: testnet
|
||
|
external: False
|
||
|
shared: False
|
||
|
register: testnet_network
|
||
|
|
||
|
- name: Create the test subnet
|
||
|
os_subnet:
|
||
|
state: present
|
||
|
network_name: "{{ testnet_network.id }}"
|
||
|
name: testnet_sub
|
||
|
ip_version: 4
|
||
|
cidr: 192.168.0.0/24
|
||
|
gateway_ip: 192.168.0.1
|
||
|
enable_dhcp: yes
|
||
|
dns_nameservers:
|
||
|
- 8.8.8.8
|
||
|
register: testnet_sub
|
||
|
|
||
|
- name: Create server instance
|
||
|
os_server:
|
||
|
state: present
|
||
|
name: testServer
|
||
|
image: debian
|
||
|
flavor: m1.small
|
||
|
security_groups: secgr
|
||
|
key_name: ansible_key
|
||
|
nics:
|
||
|
- net-id: "{{ testnet_network.id }}"
|
||
|
register: testServer
|
||
|
```
|
||
|
|
||
|
|
||
|
#### Heat
|
||
|
|
||
|
![Terraform](images/logo-heat.jpg)
|
||
|
|
||
|
_Heat_ est un outil d'orchestration spécifiquement conçu pour gérer des déploiements dans un environnement OpenStack.
|
||
|
|
||
|
Il permet le déploiement de l’infrastructure initiale puis de son évolution à l'aide de fichiers "Templates" qui décrivent les ressources à produire.
|
||
|
|
||
|
|
||
|
##### Exemple de template Heat
|
||
|
|
||
|
<!-- .slide: data-state="medium-code" -->
|
||
|
```
|
||
|
description: Deploys a Docker Swarm
|
||
|
parameters:
|
||
|
...
|
||
|
docker_node:
|
||
|
type: OS::Nova::Server
|
||
|
properties:
|
||
|
name: {get_param: hostname}
|
||
|
image: { get_param: instance_image }
|
||
|
flavor: { get_param: instance_flavor }
|
||
|
key_name: { get_param: ssh_key }
|
||
|
networks:
|
||
|
- port: { get_resource: docker_node_port }
|
||
|
user_data_format: RAW
|
||
|
user_data: |
|
||
|
#!/bin/bash
|
||
|
apt-get update
|
||
|
apt-get -y upgrade
|
||
|
wget -q https://test.docker.com/ -O /root/install_docker.sh
|
||
|
chmod 755 /root/install_docker.sh
|
||
|
/bin/bash /root/install_docker.sh
|
||
|
docker swarm join 10.0.2.21:2377
|
||
|
```
|
||
|
|
||
|
|
||
|
#### Terraform
|
||
|
|
||
|
![Terraform](images/logo-terraform.jpg)
|
||
|
|
||
|
_Terraform_ est un outil pour construire, modifier, versionner une infrastructure de manière sécurisé et efficiente.
|
||
|
|
||
|
|
||
|
Il gère les fournisseurs les plus populaires :
|
||
|
* IaaS (AWS, GCP, Microsoft Azure, OpenStack, ...)
|
||
|
* PaaS (Heroku, ...)
|
||
|
* SaaS services (Terraform Enterprise, DNSimple, CloudFlare, ...)
|
||
|
|
||
|
|
||
|
<!-- .slide: data-state="medium-code" -->
|
||
|
`variables.tf`
|
||
|
```
|
||
|
variable "network" {
|
||
|
type = "string"
|
||
|
default = "training-docker"
|
||
|
}
|
||
|
|
||
|
variable "nodes" {
|
||
|
default = 3
|
||
|
}
|
||
|
```
|
||
|
|
||
|
|
||
|
`formation.tf`
|
||
|
<!-- .slide: data-state="medium-code" -->
|
||
|
```
|
||
|
resource "openstack_compute_instance_v2" "formation" {
|
||
|
|
||
|
name = "training-${count.index + 1}"
|
||
|
count = "${var.nodes}"
|
||
|
flavor_name = "m1.tiny"
|
||
|
key_pair = "training-keypair"
|
||
|
region = "RegionOne"
|
||
|
block_device {
|
||
|
uuid = "724d7bd0-2ea3-4e39-b3d8-dd394ea933f1"
|
||
|
source_type = "image"
|
||
|
volume_size = 8
|
||
|
boot_index = 0
|
||
|
destination_type = "volume"
|
||
|
delete_on_termination = true
|
||
|
}
|
||
|
|
||
|
network {
|
||
|
name = "${var.network}"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
|
||
|
`formation.tf (suite)`
|
||
|
<!-- .slide: data-state="medium-code" -->
|
||
|
```
|
||
|
provisioner "remote-exec" {
|
||
|
inline = [
|
||
|
"sudo apt update -y",
|
||
|
"sudo apt upgrade -y",
|
||
|
"sudo apt install -y curl",
|
||
|
"sudo curl -fsSL https://get.docker.com/ | sh",
|
||
|
]
|
||
|
}
|
||
|
|
||
|
}
|
||
|
```
|