Header Ads Widget

Ticker

6/recent/ticker-posts

Hướng dẫn viết Docker Compose để xây dựng API Gateway với Kong và quản lý Kong bằng giao diện với Konga

Keywords: How to write Docker Compose to build API Gateway with Kong and manage Kong by GUI with Konga
Trước khi nói đến Kong thì chúng ta cần phải nói sơ qua về Microservices trước đã và mình sẻ không nói dài dòng lý thuyết mà chỉ nói ngắn gọn ý chính theo cái mà mình hiểu được thôi nên vì vậy, các bạn ai vẫn muốn hiểu rõ hơn về những vấn đề mình chuẩn bị nói đây thì vui lòng tra google giúp mình nhé, mình chỉ hướng dẫn còn giải thích thì đơn giản thôi, ok vậy Microservices là gì?
Theo như mình biết bình thường khi chúng ta xây dựng một Application thì chúng ta sẻ xây dựng dưới dạng tập trung và được gọi là monolitd, nhưng monolitd chỉ có thể giúp ta với những Application nhỏ còn với một Application lớn với hệ thống khổng lồ, yêu cầu nhiều thứ, thì chúng ta cần phải tách từng phần ra thành một services nhỏ và chính vì thế chúng ta sẻ cần đến API Gateway để sử lý và khi chúng ta tách ra từng phần nhỏ như thế thì nó được gọi là Microservices
Thật ra có rất nhiều API Gateway để cho chúng ta lựa chọn, như của Amazon chẳng hạn, vậy tại sao ta lại chon Kong?
  • Thứ 1: Kong là một Open Sources và đơn nhiên nó miễn phí.
  • Thứ 2: Có khả năng mở rộng dễ dàng.
  • Thứ 3: Hiệu năng khủng, mình thì nghe nói thôi chứ cũng chưa test nó với Amazon trên thực tế thế nào.
  • Thứ 4: Nó có nhiều Plugins hổ trợ.
Ok chúng ta sẻ bắt đầu từng phần để cài đặt nào và mình sẻ hướng dẫn các bạn cài đặt với Docker nhé, như hướng dẫn và documents chính thức từ trang kong và konga (Phần giao diện cho Kong vì khi chỉ cài Kong bạn chỉ sử dụng API Rest chứ không có GUI) thì các câu lệnh Docker để xây dựng sẻ là như sau

Cách 1: Cài đặt Kong và Konga với Docker bình thường

Kong sử dụng 2 Database là Cassandra và Postgres nhưng mình sẻ hướng dẫn trên database PostgreSQL
  • Install Postgres:
docker run -d --name kong-database \
                -p 5432:5432 \
                -e "POSTGRES_USER=kong" \
                -e "POSTGRES_DB=kong" \
                postgres:9.6
  • Prepare Database cho Kong:
docker run --rm \
    --link kong-database:kong-database \
    -e "KONG_DATABASE=postgres" \
    -e "KONG_PG_HOST=kong-database" \
    -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
    kong kong migrations bootstrap
  • Install Kong:
docker run -d --name kong \
    --link kong-database:kong-database \
    -e "KONG_DATABASE=postgres" \
    -e "KONG_PG_HOST=kong-database" \
    -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
    -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
    -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
    -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
    -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
    -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
    -p 8000:8000 \
    -p 8443:8443 \
    -p 8001:8001 \
    -p 8444:8444 \
    kong
  • Prepare Database cho Konga:
docker run --rm pantsel/konga:latest -c prepare -a {{adapter}} -u {{connection-uri}}
  • Install Konga (GUI):
docker run -p 1337:1337 
          --network {{kong-network}} \ // optional
          -e "TOKEN_SECRET={{somerandomstring}}" \
          -e "DB_ADAPTER=the-name-of-the-adapter" \ // 'mongo','postgres','sqlserver'  or 'mysql'
          -e "DB_HOST=your-db-hostname" \
          -e "DB_PORT=your-db-port" \ // Defaults to the default db port
          -e "DB_USER=your-db-user" \ // Omit if not relevant
          -e "DB_PASSWORD=your-db-password" \ // Omit if not relevant
          -e "DB_DATABASE=your-db-name" \ // Defaults to 'konga_database'
          -e "DB_PG_SCHEMA=my-schema"\ // Optionally define a schema when integrating with prostgres
          -e "NODE_ENV=production" \ // or 'development' | defaults to 'development'
          --name konga \
          pantsel/konga
Những bước trên là mình lấy từ hướng dẫn chính thức từ trang chủ của nó, thề luôn là phải chạy lằng nhằn từng cái từng cái 1 rồi khi ta muốn gỡ ra chúng ta phải chạy từng câu lệnh nghe phức tạp, với lại nhìn vô cái mớ hướng dẫn hổn độn ở trên mình cảm thấy nhức đầu rồi nói chi là các bạn, vì thế mình sẻ hướng dẫn các bạn viết 1 đoạn Docker Compose từ các hướng dẫn về docker ở trên, để khi chạy ta chỉ việc gõ docker-compose up là ok và khi ta muốn gỡ nó ra thì chỉ việc gõ down là mọi thứ đều tự động tháo bỏ, nó cũng giống 1 con script vậy, nói chung muốn biết thằng docker compose là gì thì các bạn liên hệ với anh google nhé hehe, mình sẻ show file docker-compose của mình và giải thích từng phần cho các bạn hiểu.

Cách 2: Sử dụng Docker Compose

Đây là code của mình:
version: '3.8'

networks:
    kong-net:
        name: kong-net
        driver: bridge
services:
    kong-database:
        image: postgres:9.6
        container_name: kong-database
        environment:
            POSTGRES_USER: kong
            POSTGRES_DB: kong
            POSTGRES_PASSWORD: kong
        ports:
            - "1000:5432"
        volumes:
            - /root/docker-compose/kong/db-data:/var/lib/postgresql/data
        networks:
            - kong-net 
    
    kong-migrations:
        image: kong:latest
        container_name: kong-migrations
        restart: on-failure
        depends_on:
            - kong-database
        links:
            - kong-database:kong-database
        environment:
            KONG_DATABASE: postgres
            KONG_PG_HOST: kong-database
            KONG_PG_USER: kong
            KONG_PG_PASSWORD: kong
            KONG_CASSANDRA_CONTACT_POINTS: kong-database
        entrypoint: sh -c "sleep 100 && kong migrations bootstrap --vv"
        networks:
            - kong-net
            
    kong:
        image: kong:latest
        container_name: kong
        restart: on-failure
        links:
            - kong-database:kong-database
        networks:
            - kong-net
        environment:
            KONG_DATABASE: postgres
            KONG_PG_HOST: kong-database
            KONG_PG_USER: kong
            KONG_PG_PASSWORD: kong
            KONG_CASSANDRA_CONTACT_POINTS: kong-database
            KONG_PROXY_ACCESS_LOG: /dev/stdout
            KONG_ADMIN_ACCESS_LOG: /dev/stdout
            KONG_PROXY_ERROR_LOG: /dev/stderr
            KONG_ADMIN_ERROR_LOG: /dev/stderr
            KONG_ADMIN_LISTEN: 0.0.0.0:8001, 0.0.0.0:8444 ssl
        ports:
            - "1001:8000"
            - "1002:8443"
            - "1003:8001"
            - "1004:8444"
    
    konga-prepare:
        image: pantsel/konga
        container_name: konga-prepare
        command: "-c prepare -a postgres -u postgresql://kong:kong@kong-database:5432/konga"
        networks:
            - kong-net
        restart: on-failure
        links:
            - kong-database:kong-database
        depends_on:
            - kong-database
    
    konga:
        image: pantsel/konga
        container_name: konga
        restart: on-failure
        links:
            - kong-database:kong-database
        depends_on:
            - kong-database
        networks:
            - kong-net
        environment:
            DB_ADAPTER: postgres
            DB_HOST: kong-database
            DB_PORT: 5432
            DB_USER: kong
            DB_PASSWORD: kong
            DB_DATABASE: konga
            KONGA_HOOK_TIMEOUT: 120000
            NODE_ENV: production  
        ports:
            - "1005:1337"
Ghi chú nhỏ tại đây:
version: theo như mình hiểu thì đây là phiên bản của docker compose bạn muốn điền phiên bản nào cũng được, mình thì lấy phiên bản hiện tại là 3.8 vì hiện tại docker compose chỉ mới ra version 3.8 thôi
networks: đây là nơi mình sẻ khai báo mạng mình dùng để sử dụng, nếu như mình cho nó tự tạo network thì mình sẻ để là "drive: bridge" nhưng phần networks này thì lát mình sẻ tự tạo nó, nên vì thế mình sẻ để là "external: true".
services: đây sẻ là nơi chứa các bản build image của docker, như trên mình đã khai báo các thành phần để cài đặt Kong, giả sử mình muốn build container Postgres thì mình đã khai báo tên service của mình là kong-database
  1. image: mình lấy sẻ là postgres:9.6
  2. container_name: bạn muốn đặt tên gì cũng được nếu như không thích tên nó tự đặt
  3. ports: đây là nơi để port (1000:5432) trong đó 1000 chính là port giao tiếp ở máy host với các container trong docker, do docker mình là 1 máy tập trung chung nên mình sẻ sắp sếp port lại cho gọn gàng bằng cách đặt port theo ý mình 1000 tránh bị đụng port, khi ở ngoài mình truy cập 1000 nó sẻ kết nối tới port 5432 trong docker
  4. volumes: đây là nơi chứa data trong docker với máy ở ngoài của chúng ta (máy host) giả sử nếu mình đặt data trong docker thì khi mình gỡ docker ra đồng nghĩa với việc data sẻ mất hết vì vậy mình sẻ để data ở ngoài bằng cách tạo volumes để khi mình chạy lại nó sẻ lấy data từ máy ngoài và data mình không bị mất, dễ backup nữa
  5. networks: networks ở đây khác networks mà mình hướng dẫn ở trên nghĩa là nó sẻ khai báo rằng uh tao sử dụng mạng kong-net đã tạo, đơn giản bạn chỉ cần hiểu rằng bạn sẻ lựa chọn mạng nào để sử dụng thế thôi chẳng gì hết
  6. environment: cái này bạn còn nhớ các dòng -e ở phía trên không? ở đây mình sẻ thêm một số biến vào cho nó như là user và password thay cho các dòng -e ở cách 1 vậy, thì đơn giản -e chính là viết tắt của environment chứ đâu
Mình chỉ giải thích đơn giản vậy thôi còn 1 số cái nó cũng tương tự như thế các bạn có thể xem nó rõ hơn tại file compose của mình đặt ở phía trên, file người khác thế nào thì mình không biết chứ mình là ok 100% rồi, giải thích vậy chắc cũng ok, còn lại thì dựa vào tư duy của các bạn rồi, mình sẻ bắt đầu vào bước thực hiện cài Kong và Konga
Đầu tiên chúng ta sẻ tạo một mạng network có tên là kong-net với type là bridge nhé
docker network create -d bridge kong-net
Sau đó thực hiện tạo 1 folder kong với đường dẫn như hình phía dưới
Tiếp đến mình sẻ tạo 1 file kong-compose.yml (do docker-compose chạy file.yml) với nội dung là đoạn code mà mình đã để ở trên cho các bạn rồi đấy, tạo luôn cả folder db-data để chứa database từ docker postgres nữa nhé
Sau đó mình gõ lệnh docker ps -a để kiểm tra thì như hình phía dưới hoàn toàn chưa có gì
Thực hiện chạy lệnh sau để run file kong-compose.yml
docker-compose -f kong-compose.yml up -d --build
Bình thường nếu như file có tên là docker-compose.yml thì ta chỉ cần gõ docker-compose up là nó sẻ chạy liền, còn đằng này mình thay đổi file yml thành 1 cái tên khác với cái tên mặt định nên phải sử dụng giá trị -f vào nữa với options -d là để build luôn và không cần kiểm tra lỗi, có show đi nữa cũng ra mấy cái lỗi tào lao mía lao không cần thiết và cũng không ảnh hưởng
Sau khi chạy xong bạn chạy lại lệnh docker ps -a để kiểm tra lại thì thấy nó đã tạo ra các services như những gì chúng ta config trong file compose rồi đấy
Giờ bạn thử test thử kong trước nhé, tại máy linux bạn gõ lệnh sau:
curl -i http://localhost:1003
Nếu như nó hiện ra 1 nùi chữ thế này nghĩa là ok rồi đó
Chắc cú hơn thì các bạn truy cập trên browser bằng IP của máy bạn với Port 1003 ( Ở đây Port 1003 là do mình tự đặt trong file compose mình nói ở trên ak đáng lý port defaults của nó là 8001 nhưng mình đã trỏ nó về 1003 cho máy host ở ngoài )
Ok như đã test 2 lần thì chắc chắn rằng kong đã được cài đặt rồi đấy, giờ chúng ta thực hiện truy cập konga để test luôn cả konga nha, ở đây konga của mình đặt là port 1005 nên mình chỉ cẩn sửa port lại là xong ak
Như giao diện trên là ngay từ lần đầu đăng nhập đầu tiên nó đã yêu cầu chúng ta tạo tài khoản admin rồi, nên vì thế mình sẻ tạo 1 tài khoản tại đây
Sau khi đăng nhập ta điền Link Access đến server Kong lúc đầu ta check vào, để có thể quản lý Kong bằng Konga

Ok như vậy là mình đã hướng dẫn cho các bạn xong cách thực hiện cài đặt Kong và Konga sử dụng Compose của Docker rồi đấy, trong quá trình chạy file compose up lên mà bạn check docker ps -a thằng kong nó không start mà cứ để restarting (1) giống như hình thì không sao, cứ down nó đi và up lại 1 lần nữa thì nó sẻ lên ak, có thể code của mình viết còn sai sót nhỏ chổ nào đó không đáng kể hoặc do thằng Kong nó cần thời gian để start nhưng nói chung mình thấy nó lâu quá nên mình down  nó và up lại cho nó lẹ haha, tại lúc đầu mình test chục cái không sao, không hiểu sao đến lúc viết guide cho các bạn nó lại chậm start lên.
Còn việc sử dụng Kong thì mình sẻ gợi ý cho các bạn như sau, "Routes => Services => Upstreams":
Routes: các bạn thực hiện trỏ đường dẫn routes đến domain của web
Services: sau khi thực hiện routes rồi tiếp tục trỏ đến địa chỉ IP của web nghĩa là trước đây nếu muốn đến web bằng domain thì các bạn chỉ việc khai báo domain add với địa chỉ ip là xong nhưng với kong thì bạn sẻ được đi qua một con server trung gian đó là Kong, nhưng nếu các bạn thực hiện upstream thì phần Host không trỏ đến IP nữa mà phải trỏ đến name của upstream
Upstream: Để bạn có thể trỏ đến 2 IP thực hiện quá trình loadbalancer và high avaiability (Tính sẵn sàng cao) phân chia độ ưu tiên cho từng Web Application
Nên mình sẵn tiện viết cách hướng dẫn luôn, tới đây thì coi như xong rồi Kong và Konga điều ok, chúc các bạn thành công nhé.

Post a Comment

1 Comments

  1. Mình đã thử và đã chạy được trên windows với powershell và administator

    ReplyDelete

Vài lời muốn nói:
* Không được nhận xét thô tục bởi mình biết các bạn là những người văn minh.
* Pass giải nén mặt định là itblognote hoặc itblognote.com nếu có Pass khác thì mình sẽ ghim trong bài viết.
* Click vào quảng cáo và chia sẻ bài viết để mình có thêm động lực viết bài nhé.