sumarsono.com
Take it with a grain of salt


Mencoba Traefik v2

Posted on

Traefik, belum lama ini rilis versi 2.0. Good news dan bad news. Good news karena pastinya membawa fitur yang makin caem. Bad news karena perubahannya nge-break traefik v1.7. Artinya konfigurasi yang kupakai di traefik v1.7 tidak bisa kupakai begitu saja di traefik v2. Jadinya senang dan sedih campur jadi satu. Namun demikian, life must go on. Aku gak bisa stuck di traefik v1.7 untuk selamanya. Rencanaku, aku mau nunggu sampai traefik v2.1 rilis baru aku migrasi. Soalnya, traefik v1.7 yang kupakai sejauh ini ya fine aja ditambah lagi traefik v2 masih ada kekurangan di dokumentasinya. Oh iya, aku pakai traefik untuk ingress cluster kubernetes. Namun untuk coba-coba ini aku tidak akan pakai klaster k8s.

Meskipun berencana migrasi setelah traefik v2.1 rilis, aku tetap harus mencoba traefik v2 sedini mungkin. Demi memahami segala perubahannya dan mempersiapkan diri untuk migrasi. Migrasi tidaklah semudah membalik telapak tangan kalau breaking changes-nya masif.

Untuk studi kasus yang akan ku lakukan adalah dengan mencoba expose service dengan backend file dan docker. Backend untuk traefik ini banyak soalnya, ada file, docker, kubernetes, rancher, dll.

Untuk backend file, aku mau expose nginx legacy (maksudnya non docker). Nginx ini akan aku bind ke port 81. Goalnya adalah ketika aku GET url localhost/nginx maka akan muncul halaman default nginx. Dalam hal ini, traefik akan di set untuk watch sebuah directory, begitu ada perubahan pada directory tersebut traefik akan otomatis baca dan menyesuaikan.

Sedangkan untuk backend docker, aku mau expose service docker containous/whoami. Goalnya adalah ketika aku GET url localhost/whoami akan muncul halaman dari docker containous/whoami. Enaknya traefik untuk ekspose kontainer docker ini, kita gak perlu repot bikin konfigurasi dan mapping port satu satu. Cukup main label di kontainer yang mau di expose. Traefik akan otomatis bikin konfigurasinya. Asyik kan. Haha.

Langkah pertama, tentu saja siapkan traefik v2:

mkdir -p /penyimpananBersama/docker/traefikv2
cd /penyimpananBersama/docker/traefikv2
vim docker-compose.yaml

file docker-compose.yaml tersebut isinya:

version: "3.3"

services:
  traefik:
    image: "traefik:v2.0"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--accesslog=true"
      - "--api.insecure=true"
      - "--providers.docker=true" # aktifkan backend docker
      - "--providers.file.directory=/myconf" # aktifkan backend file
      - "--providers.file.watch=true" # watch perubahan backend file
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entryPoints.websecure.address=:443"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
      - "--certificatesresolvers.mytlschallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.mytlschallenge.acme.email=postmaster@sumarsono.com"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./letsencrypt:/letsencrypt"
      - "./myconf:/myconf"
    networks:
      - web

networks:
  web:
    external: true

Langkah kedua adalah run traefik v2:

cd /penyimpananBersama/docker/traefikv2
docker network create web
docker-compose up -d

Langkah ketiga, uji coba backend file dengan cara install nginx, bind nginx ke port 81 kemudian start service nginx. Baru kemudian kita coba expose pakai traefik v2:

# pakai sudo krn directory ini milik root
sudo vim /penyimpananBersama/docker/traefikv2/myconf/test.yaml

isi dari file test.yaml adalah sebagai berikut:

http:
  # Add the router
  routers:
    router-legacy:
      entryPoints:
      - web
      middlewares:
      - "test-stripprefix"
      service: service-nginx
      rule: "Host(`localhost`) && PathPrefix(`/nginx`)"

  # Add the middleware
  middlewares:
    test-stripprefix:
      stripPrefix:
        prefixes: 
        - "/nginx"

  # Add the service
  services:
    service-nginx:
      loadBalancer:
        servers:


        passHostHeader: false

Maksud dari konfigurasi diatas adalah request ke localhost/nginx akan diteruskan ke http://172.17.0.1:81/ dengan path /nginx nya dibuang. Karena nginx tersebut servenya path /.

Bukalah localhost:8080, mestinya traefik v2 udah ngebaca rule yang kita bikin secara otomatis. Terus bukalah localhost/nginx, hasilnya akan sama dengan akses localhost:81. Cool~

Berikutnya aku mau coba expose service docker container. dalam hal ini aku mau pakai containous/whoami. Pertama, kita siapkan compose utk service tersebut:

mkdir /penyimpananBersama/docker/whoami/
vim /penyimpananBersama/docker/whoami/docker-compose.yaml

Isi dari docker-compose.yaml ini adalah:

version: "3.3"

services:
  whoami:
    image: "containous/whoami"
    container_name: "whoami"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`localhost`) && Path(`/whoami`)"
      - "traefik.http.routers.whoami.entrypoints=web"
    networks:
      - web
networks:
  # network ini tadi udah dibikin pas mau run traefik v2
  web:
    external: true

Kuncinya ada pada labels. Label itulah yang akan dibaca traefik dan otomatis dibuatkan tetek bengeknya sama traefik v2.

Selanjutnya tinggal jalankan:

cd /penyimpananBersama/docker/whoami
docker-compose up -d

Tinggal tes, coba buka localhost/whoami. Coba juga buka dashboard traefik v2 localhost:8080.

Selesai, so far so good. Masih banyak PR nya, test issue cert LE, eksplor middleware (di traefik v1 belum ada), explore dynamic conf, dll.

Cool~