De introductie van o.a. containers, public en private clouds, Kubernetes en Apache Mesos heeft een grote bijdrage geleverd aan de adoptie van microservices in productieomgevingen. Nog steeds wordt er helaas meer tijd besteed aan het deployen, beheren of debuggen van de infrastructuur dan aan de applicatie of service zelf.
Mantl
Mantl is een product dat gebruikmaakt van diverse orchestratiesoftware en dit combineert met infrastructuur provisioning, applicatie deployment en monitoring functionaliteit voor applicaties, zoals bijvoorbeeld de ELK stack. De gedachte hier achter is om zo een end-to-end stack aan deploymenttools te bieden om zo een bare metal en/of gevirtualiseerde infrastructuur te gebruiken om applicaties van elke grootte te kunnen hosten. Hieronder een aantal key features van Mantl:
- Mantl kan zowel infrastructuur als software als code provisionen. Dit stelt gebruikers in staat om services en applicaties uit te rollen op een programmeerbare en herhaalbare manier;
- Het kan worden uitgerold naar een reeks cloud providers, zoals AWS, Azure, CloudStack, DigitalOcean, Google Cloud Platform, etc. Dit is ook mogelijk naar private clouds, zoals OpenStack, VMware, baremetal of systemen gebaseerd op CentOS;
- Veel services zijn out of the box beschikbaar: Software defined networks, software defined storage, DNS support, databases, monitoring tools, service discovery, logging en security;
- De gebruikers volledige project stack, van infrastructuur tot aan de applicatie-instellingen, kunnen onder versiebeheer worden geplaatst;
- Het is ook mogelijk om in een upgradeproces software blue/green software uit te rollen.
Mantl is afhankelijk twee applicaties. Infrastructuur provisioning wordt namelijk uitgevoerd door Terraform. Terraform maakt gebruik van een configuratie input file om zo te verbinden naar infrastructuur providers om daar resources te kunnen alloceren. De tweede applicatie is Ansible. Met Ansible kun je eenvoudig software provisionen. YAML gebaseerde applicatiedefinities worden gebruikt als input om zo de gewenste software de deployen op de door Terraform beschikbaar gemaakte infrastructuur.
Mantl heeft drie type nodes: Control, Edge en Worker.
- Worker nodes – Op de worker nodes draaien de microservices en andere workloads van de gebruiker.
- Control nodes – de control node is verantwoordelijk voor de totale staat van de cluster. Als een node niet meer bereikbaar is, is het de verantwoordelijkheid van de control node om de rest van de cluster hierover te informeren.
- Edge nodes – de edge node is meestal toegankelijk vanaf internet, terwijl de Worker en Control node zich in een privaat netwerk bevinden. Deze node dient veelal als proxy voor interne applicaties.
Maak je eigen Mantl-omgeving op vSphere
Ik raad je aan om de http://mantl.io/ website eens te bezoeken om daar meer te lezen over de verschillende componenten, de werking en uitgebreidere toelichting van de features van Mantl.
De rest van dit blog laat zien hoe je zelf een Mantl 1.2 (meest recente versie op het moment van schrijven) omgeving kunt deployen op een VMware vSphere 6.0 omgeving.
De stappen zoals hieronder beschreven zijn bedoeld voor gebruik op Mac OSX. Natuurlijk valt dit ook te gebruiken op een Linux distributie zoals CentOS. Wel zijn er dan kleine verschillen aanwezig in de commando’s en in de syntax. Windows PowerShell is eventueel ook een mogelijkheid, al raad ik dan eerder het gebruik van een Linux VM aan. Disclaimer: mogelijkerwijs heb ik op mijn systeem al eerder bepaalde dependencies voor applicaties geïnstalleerd. Mocht er onverhoopt toch een dependency missen, installeer deze dan alsnog.
Prerequisites
- VMware vSphere (5.5 of 6.0)
- Administrator rechten voor vCenter
- Cluster setup (ook bij een single host)
- CentOS 7.2 VM die kan dienen als source template
- Open source vm-tools geïnstalleerd
- Dient gecloned te kunnen worden als template.
- Port-group met toegang tot een DHCP server
- DNS
- DHCP
- Internet
- Enige Linux kennis
- Build systeem (in dit geval Mac OSX) met:
- GIT en de GIT command line utilities
- PIP
- Homebrew (http://brew.sh/)
Configuratie van het build systeem
Voeg de public key van je build systeem toe in de authorized_keys file van je CentOS VM, zodat de applicaties zich later kunnen authenticeren op de uitgerolde VMs. In het voorbeeld heb ik een vooraf de gebruiker terra aangemaakt op mijn template VM met IP-adres 10.61.125.161.
brew install ssh-copy-id
ssh-keygen -t rsa (indien je nog geen public key hebt gegenereerd)
ssh-copy-id terra@10.61.125.161 -f
Zodra je de public key hebt gekopieerd moet het mogelijk zijn om een SSH-sessie te kunnen starten naar je CentOS VM zonder dat daar de invoer van een wachtwoord voor nodig is.
ssh terra@10.61.124.161
Als dit lukt kun je de VM naar een template converteren in vCenter. Maak vervolgens een directory aan op je build systeem voor Mantl en doe een git clone van de Mantl repository.
mkdir ~/Documents/mantl
git clone https://github.com/CiscoCloud/mantl ~/Documents/mantl
Installeer Terraform (v0.6.16 is de laatste versie op het moment van schrijven) met Homebrew.
Brew install Terraform
Test of de installatie gelukt is met:
terraform version
Ansible kan natuurlijk ook worden geïnstalleerd met Homebrew, maar Mantl maakt gebruik van een eerdere versie (< 2). Daarom kun je beter PIP gebruiken met de requirements zoals aangeleverd door Mantl.
cd ~/Documents/mantl
pip install -r requirements.txt (--upgrade)
In de Mantl directory vind je een vsphere.sample.tf bestand die je kunt gebruiken als input voor terraform om naar vSphere te deployen. Kopieer de sample file en pas deze aan op basis van je omgeving.
cp terraform/vsphere.sample.tf vsphere_ccc.tf
edit the vsphere_ccc.tf file
Voorbeeld van mijn vsphere.tf file:
provider "vsphere" {
vsphere_server = "10.61.124.12"
user = "administrator@vsphere.local"
password = "password123"
allow_unverified_ssl = "true"
}
module "vsphere-dc" {
source = "./terraform/vsphere"
long_name = "Mantl"
short_name = "Mantl"
datacenter = "VersaStack"
cluster = "ACI"
pool = "ACI/Resources/robvand"
template = "Rob van der Kind/Templates/CentOS-7"
network_label = "ACI-VersaStack/common|InfraServices|OOB-MGMT"
domain = "mantl.ccc"
dns_server1 = "10.100.0.20"
dns_server2 = "8.8.8.8"
datastore = "VS_Datastore"
control_count = 1
worker_count = 2
edge_count = 1
kubeworker_count = 0
control_volume_size = 20 # size in gigabytes
worker_volume_size = 20
edge_volume_size = 20
ssh_user = "terra"
ssh_key = "/Users/robvand/.ssh/id_rsa"
consul_dc = "amsccc" #provide this in all lower case
#Optional Parameters
#folder = ""
#control_cpu = ""
#worker_cpu = ""
#edge_cpu = ""
#control_ram = ""
#worker_ram = ""
#edge_ram = ""
#disk_type = "" # thin or eager_zeored, default is thin
#linked_clone = "" # true or false, default is false. If using linked_clones and have problems installing Mantl, revert to full clones
}
Laad de vsphere.tf file in Terraform:
terraform get
Kijk in het Terraform Plan om te zien welke acties klaar staan om te worden uitgevoerd alvorens een je Terraform Apply uitvoert.
terraform plan
terraform apply
De Terraform appl- actie kan een aantal minuten duren. Als alle acties gelukt zijn is de output van dit proces een terraform.tfstate bestand in het huidige pad. Nu kun je met behulp van Ansible controleren of de nodes ook echt bereikbaar zijn alvorens je software probeert te deployen. Mocht dit niet gelukt zijn, lees dan het log zorgvuldig. Hier staat veelal de oplossing in.
ROBVAND-M-F0WY:mantl robvand$ ansible all -m ping
Mantl-edge-01 | success >> {
"changed": false,
"ping": "pong"
}
Mantl-worker-001 | success >> {
"changed": false,
"ping": "pong"
}
Mantl-worker-002 | success >> {
"changed": false,
"ping": "pong"
}
Mantl-control-01 | success >> {
"changed": false,
"ping": "pong"
}
Voer het upgrade-packages.yml playbook uit om alle packages van de nieuwe Mantl nodes te updaten.
ansible-playbook playbooks/upgrade-packages.yml
Security staat bij Mantl hoog in het vaandel. Voer het security-setup script uit in de mantl directory om een security.yml te genereren. Het wachtwoord dat je hier opgeeft, wordt ook het wachtwoord om later in te loggen op de nginx webserver van de Mantl control-node.
Onderstaande zaken worden automatisch geconfigureerd (dit valt eventueel te tweaken in security.yml in de Mantl root directory):
- SSH key-based authentication
- Enable ip table rules
- Admin based HTTP authentication on Mesos/Marathon/Consul/etc.
- Optional private docker registry
- Mesos authorization
- Marathon authorization
- Consul authorization, SSL and ACLs
- Zookeeper ACLs
- Vault for secret storage
./security-setup
In de sample.yml file in de Mantl directory root staat stap voor stap beschreven welke software en instellingen elk type node dient te hebben. Kopieer de sample.yml file en pas deze aan indien wenselijk.
cp sample.yml mantl.yml
Voer het mantl playbook uit en vergeet niet de eerder aangemaakte security.yml op te geven.
ansible-playbook -e @security.yml mantl.yml
De afronding van de laatste stap kan wel 20 minuten duren. Maar als vervolgens alles goed is gegaan, is je Mantl-omgeving operationeel en bereikbaar op de hostname of het IP-adres van de control node. Nu heb je een volledig operationele omgeving om je applicaties op te bouwen en testen.
Elke Stack (optioneel)
In de addons folder in de mantl directory root vind je ook een playbook voor de installatie van de elk stack (Elastic Search, Logstash en Kibana) https://www.elastic.co/. Deze kun je eenvoudig toevoegen aan je Mantl-omgeving met onderstaand commando:
ansible-playbook -e@security.yml addons/elk.yml