traefik und HashiCorp Consul mit terraform


Traefik und Hashicorp Consul mit Terraform

Wenn man eine Lösung sucht, um einen Reverse Proxy oder Load Balancer aufzusetzen, ohne dafür aber eine sehr lange Konfigurationsdatei schreiben und warten zu müssen, dann ist die Kombination von Traefik mit Consul vielleicht die richtige Lösung.

Traefik implementiert einen Zugriff auf Consul, um von dort seine Konfigurationsdaten zu beziehen. Dies erlaubt einem sämtliche Konfigurationen im Key/Value-Store von Consul abzulegen und Traefik nimmt diese Änderungen wahr und lädt sich selbstständig neu.

 1logLevel = "INFO"
 2defaultEntryPoints = ["http", "https"]
 3
 4[consul]
 5  endpoint = "${consul_backend}"
 6  watch = true
 7  prefix = "${prefix}"
 8
 9[entryPoints]
10  [entryPoints.http]
11    address = ":80"
12  [entryPoints.https]
13    address = ":443"
14    [entryPoints.https.tls]
15
16[acme]
17  email = "it-is-me@example.com"
18  storage = "${prefix}/acme/account"
19  entryPoint = "https"
20  caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"
21  [acme.httpChallenge]
22    entryPoint = "http"
23  [acme.dnsChallenge]
24    provider = "dnsimple"
25    delayBeforeCheck = 0
26[[acme.domains]]
27    main = "*.example.com"
28    sans = ["example.com"]

In unserem Beispiel verwenden wir nun ein Docker whoami Image, um die Skalierung und das Loadbalancing im Hintergrund zu veranschaulichen.

Außerden werden wir das ganze auch mittels Terraform ausrollen. Zu allererst definiert man die Variablen, um auf den Hosts dann die Docker Container zu starten. Die beiden Hosts wurden so provisioniert, dass der Docker-Port im lokalen Netz verfügbar ist.

 1variable "traefik_version" {
 2  default = "v1.7.11"
 3}
 4variable "consul_version" {
 5  default = "1.5"
 6}
 7variable "traefik_host" {
 8  default = "10.0.0.10"
 9}
10variable "backend_host" {
11  default = "10.10.0.20"
12}
13variable "prefix" {
14  default = "traefik"
15}
16variable "consul_backend" {
17  default = "10.10.0.20:8500"
18}
19variable "domain" {
20  default = "example.com"
21}

Anschließend muss Consul ausgerollt werden:

 1
 2provider "docker" {
 3  host = "tcp://${var.backend_host}:2376/"
 4}
 5resource "docker_image" "consul" {
 6  name = "consul:${var.consul_version}"
 7}
 8resource "docker_container" "consul" {
 9
10  image    = "${docker_image.consul.latest}"
11  name     = "consul"
12  must_run = true
13  restart  = "always"
14
15  ports {
16    internal = 8500
17    external = 8500
18    protocol = "tcp"
19  }
20}

Auf diesem Host wird dann auch das whoami Image laufen:

 1resource "docker_image" "whoami" {
 2  name = "jwilder/whoami"
 3}
 4resource "docker_container" "whoami" {
 5
 6  image    = "${docker_image.whoami.latest}"
 7  name     = "whoami"
 8  must_run = true
 9  restart  = "always"
10
11  ports {
12    internal = 8000
13    external = 8000
14    protocol = "tcp"
15  }
16}

Zum Schluss muss Traefik auf seinem eigenen Host definiert und ausgerollt werden:

 1provider "docker" {
 2  host = "tcp://${var.traefik_host}:2376/"
 3}
 4
 5data "template_file" "traefik_config" {
 6  template = "${file("templates/traefik.tpl")}"
 7
 8  vars {
 9    consul_backend = "${var.consul_backend}"
10    prefix         = "${var.prefix}"
11  }
12}
13
14resource "docker_container" "traefik" {
15  depends_on = ["consul_keys.whoami"]
16
17  image    = "${docker_image.traefik.latest}"
18  name     = "traefik_proxy"
19  must_run = true
20  restart  = "always"
21
22  ports {
23    internal = 80
24    external = 80
25    protocol = "tcp"
26  }
27
28  ports {
29    internal = 443
30    external = 443
31    protocol = "tcp"
32  }
33
34  upload {
35    content = "${join(",", data.template_file.traefik_config.*.rendered)}"
36    file    = "/etc/traefik/traefik.toml"
37  }
38
39  volumes {
40    host_path      = "/srv/traefik"
41    container_path = "/srv/"
42    read_only      = false
43  }
44}

Damit nun alle Services miteinander reden können, muss diese Information in Consul abgelegt werden. Auch hier wird Terraform dafür verwendet, diese Daten anzulegen und zu warten:

 1resource "consul_keys" "whoami" {
 2  key {
 3    path  = "${var.prefix}/acme/account/"
 4    value = ""
 5  }
 6
 7  key {
 8    path  = "${var.prefix}/backends/whoami/servers/server1/url"
 9    value = "http://${var.backend_host}:8000/"
10  }
11
12  key {
13    path  = "${var.prefix}/backends/whoami/servers/server1/weight"
14    value = "10"
15  }
16
17  key {
18    path  = "${var.prefix}/frontends/frontend1/backend"
19    value = "whoami"
20  }
21
22  key {
23    path  = "${var.prefix}/frontends/frontend1/routes/whoami/rule"
24    value = "Host: whoami.${var.domain}"
25  }
26}

Nach diesem Konfigurationschritt lädt Traefik seine Konfiguation neu. Ein Zugriff auf <whoami.example.com> wird an Traefik und von diesem an einen whoami Container mit der entsprechenden ID weitergeleitet.

Zurück

We are here for you

You are interested in our courses or you simply have a question that needs answering? You can contact us at anytime! We will do our best to answer all your questions.

Contact us