09 January 2020 ~ 0 Comments

Docker Compose i Kafka klaster

U prethodnom članku opisana je proces instalacije i pokretanja Kafka klastera. Za pokretanje Kafke i Zookeepera koriste se shell skripte koje imaju svoje prednosti ali i nedostatke. Kako bi se efikasnije upravljalo Kafka i Zookeeper komponentama u ovom članku opisati će se kako navedeno uspješno postići Docker Compose alatom.

Docker Compose je alat za definiciju i upravljanje više-kontejnerskim okruženjima. Drugim rječnikom, omogućava jednostavnije pokretanje, definiranje, gašenje, itd. Docker kontejnera na jednom poslužitelju. Za više poslužiteljsko okruženje logičan slijedeći korak je Docker Swarm ili Kubernetes

Docker Compose oslanja se na definiciju kontejnera (usluga, service) u yaml datotekama. Objašnjenje Docker Compose yaml datoteke je izvan okvira ovog članka te je detalje moguće pronaći u službenoj dokumentaciji. Također, detalji CLI Docker Compose naredbi je izvan okvira ovog članka a svi detalji opisani su u službenoj dokumentaciji

Docker Compose instalacija

Docker Compose nije dio instalacije Dockera pa je potrebno instalirati Docker Compose. Instalacija je jednostavna i svodi se na curl i chmod. 

Slijedeća naredba preuzeti će 1.25.1 Docker Compose verziju za Linux (uname -s) operativni sustav 64bit arhitekture (uname -m).

$ curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

Docker Compose se redovno održava i nadograđuje pa je poželjno provjeriti da li postoji novija verzija pa u naredbi iznad izmijeniti “1.25.1” u aktualnu verziju. Docker Compose datoteka će se pohraniti u /usr/local/bin/docker-compose direktorij te je potrebno omogućiti izvršavanje datoteke.

$ chmod +x /usr/local/bin/docker-compose

Uspješno preuzimanje Docker Compose alata moguće je provjeriti naredbom.

$ docker-compose --version

A rezultat bi trebao biti (moguće je da neće biti ista verzija, trebala bi biti usklađena sa verzijom koja se preuzimala naredbom iznad): 

docker-compose version 1.25.1, build a82fef07

Compose yaml datoteka

Docker Compose koristi yaml datoteke sa definicijom kontejnera za upravljanje kontejnerima. Shodno, prvo je potrebno kreirati yaml datoteku primjerenog naziva. Za primjer će se koristiti datoteku naziva “kafka-stack.yaml”.

$ cd /opt/scripts/
$ nano kafka-stack.yaml

Sadržaj datoteke bi trebao biti sličan slijedećem.

version: '2.1'

services:
  zookeeper:
    image: bitnami/zookeeper:3.5.6-debian-9-r59
    container_name: zookeeper
    hostname: kafka.lab.local
    restart: unless-stopped
    network_mode: host
    ports:
      - "2181:2181"
      - "2888:2888"
      - "3888:3888"
    environment:
        ZOO_SERVER_ID: "1"
        ZOO_SERVERS: "0.0.0.0:2888:3888"
        ZOO_ENABLE_AUTH: "yes"
        ZOO_SERVER_USERS: "user"
        ZOO_SERVER_PASSWORDS: "password"
    volumes:
      - /opt/data/zookeeper:/bitnami/zookeeper
  kafka:
    image: bitnami/kafka:2.4.0-debian-9-r16
    hostname: kafka.lab.local
    restart: unless-stopped
    network_mode: host
    ports:
      - "9092:9092"
      - "9696:9696"
    environment:
        ALLOW_PLAINTEXT_LISTENER: "no" 
        KAFKA_CERTIFICATE_PASSWORD: "storepassword" 
        KAFKA_INTER_BROKER_USER: "admin"
        KAFKA_ZOOKEEPER_USER: "user"
        KAFKA_ZOOKEEPER_PASSWORD: "password" 
        KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: "false" 
        KAFKA_CFG_ADVERTISED_LISTENERS: "SASL_SSL://:9092"
        KAFKA_CFG_DELETE_TOPIC_ENABLE: "true"
        KAFKA_CFG_DEFAULT_REPLICATION_FACTOR: "1"
        KAFKA_CFG_INTER_BROKER_PROTOCOL_VERSION: "2.2.2"
        KAFKA_CFG_LISTENERS: "SASL_SSL://:9092"
        KAFKA_CFG_ZOOKEEPER_CONNECT: "kafka.lab.local:2181"
        JMX_PORT: "9696"
    volumes:
      - '/opt/certificates/keystore/kafka.keystore.jks:/opt/bitnami/kafka/conf/certs/kafka.keystore.jks:ro'
      - '/opt/certificates/truststore/kafka.truststore.jks:/opt/bitnami/kafka/conf/certs/kafka.truststore.jks:ro'
    depends_on:
      - zookeeper

Yaml datoteka sastoji se od definicije Zookeeper kontejnera te Zookeeper kontejnera. Gotovo cijela datoteka se poklapa sa shell skriptama iz prethodnog članka sa par dodataka:

  • container_name
  • hostname
  • depends_on

container_name definira kako će se nazvati kontejner prilikom pokretanja kontejnera. Docker neće dozvoliti pokretanje dva kontejnera sa istim nazivima pa ili promijenite naziv drugog kontejnera ili prepustite Dockeru da generira naziv (ukloniti container_name).

hostname definira naziv hosta na kojem se pokreću Docker kontejneri. Ovaj parametar je nužan ukoliko kontejeneri ovise o nazivu hosta što je u slučaju Kafke bitno zbog certifikata.

depends_on parametar definira ovisnosti kontejenra o drugim kontejnerima te ne dozvoljava, u ovom slučaju, pokretanje Kafke prije Zookeepera. Nažalost, depends_on ne provjerava da li je kontejner u potpunosti spreman za rad nego isključivo da li se kontejner pokrenuo. 

network_mode: host parametar nije sretno rješenje ali za potrebe lab okruženja biti će dostatno. Za ozbiljnije primjene preporuka je kreirati dediciranu Docker mrežu.

Sve što preostaje je pokrenuti kontejere.

$ docker-compose -f /opt/scripts/kafka-stack.yaml up

Navedena naredba će pokrenuti Zookeeper pa Kafka kontejner te u konzoli ispisivati cijeli log. Ovo je dobro za inicijalno testiranje ali u praksi nema smisla. Da bi se kontejneri pokrenuli kao deamon potrebno je iz up dodati -d parametar.

$ docker-compose -f /opt/scripts/kafka-stack.yaml up -d

Rezultati bi trebao biti.

Starting zookeeper ... done
Starting kafka     ... done

Stanje kontejenra može se porvjeriti standardnim Docker naredbama (docker ps) ili Docker Compose naredbama.

$ docker-compose -f /opt/scripts/kafka-stack.yaml ps

Ukoliko je potrebno zaustaviti kontejnere navedeno je moguće stop naredbom dok će down naredba zaustaviti i ukloniti sve kontejnere, mreže, image i volume.

Shell skripte kao i kafka-stack.yaml datoteku moguće je preuzeti i na GitHubu.

Leave a Reply