23 Haziran 2020 Salı

DOCKER SWARM ÜZERİNDE TRAEFIK CLOUD LOAD-BALANCER İLE WORDPRESS UYGULAMASI DEPLOY ETME (1)

Merhaba. Bu yazı serisinde docker swarm cluster üzerinde (CentOS işletim sistemi kullanılmıştır.)traefik load-balancer kullanarak wordpress uygulaması deploy etmeyi anlatacağız. Bu uygulama için ilk yazıda wordpress uygulamasını docker-swarm üzerinde deploy edilmesinden bahsedeceğiz. Daha sonra traefik load-balancer ile uygulamaya kazandırılan yetenekler anlatılacaktır. Öncelikle kuracağımız mimariyi 3 node üzerinde kurulu olan docker-swarm altyapısını kullanarak oluşturacağız. Aşağıda ilk etap için uygulama bileşenlerinin topolojisi gösterilmiştir. 




Docker swarm clusterı üzerinde wordpress sitesi ayaklandırabilmemiz için temelde iki adet konteynere ihtiyaç duyulmaktadır. Birincisi wordpress uygulamasının çalışacağı wordpress, ikincisi ise veritabanı olarak kullanacağımız mysql konteyneri. Kurulacak olan sistemin kalıcı veri depolama ve nodelardan bir veya birden çoğu kapandığı zaman hizmet vermesini sağlama amacı ile ortak disk ihtiyacı oluşmuş, bu ihtiyaç NFS (Network File System) server aracılığı ile sağlanacaktır. Konteynerlerin ayrıntısına girmeden önce NFS server ve NFS client yapılandırması yapmak gerekecektir. Bunun için aşağıdaki adımlar izlenir.

NFS server hizmeti verecek olan host üzerinde (192.168.1.45, bu mimaride gösterilmeyen bir host üzerinde NFS server çalıştırılmıştır. NFS Server test amaçlı yapılandırılacağından herhangi bir docker swarm nodeunda başlatılabilir.) Öncelike nfs server bileşenleri yüklenir ve nfs server servisleri başlatılır.

~# dnf install nfs-utils
~# systemctl start nfs-server.service
~# systemctl enable nfs-server.service

NFS ile paylaştırılacak alan için bir mount point oluşturulur.

~# mkdir -p /mnt/nfs-share/docker-swarm

NFS server konfigürasyonu için "/etc/export" dosyası açılarak aşağıdaki satır eklenir.

/mnt/nfs-share/docker-swarm 192.168.1.0/24(rw,sync,no_subtree_check,all_squash,anonuid=0,anongid=0)

Yukarıda gösterilen satırda ilk alan hangi dizinin nfs server ile paylaşılacağı, ikinci alan hangi ip bloğundan ve hangi kullanıcı idlerinin hangi izinlerle bu alana erişeceğini belirtmektedir. Örnekte belirtilen ip bloğundaki hostlar için okuma/yazma yetkisi ile kullanıcıdan bağımsız olarak erişim yetkisi verilmiştir. Yapılan değişiklikten sonra exportfs komutu ile belirtilen alan nfs protokolü ile sunulmaya  başlanır. 

~# exportfs

CentOS firewalldan nfs servisi için yetkilendirme yapılır.

~# firewall-cmd --permanent --add-service=nfs

Son olarak mimaride belirtilen hostlarda (centos01, centos02, centos03) aşağıdaki komutlar çalıştırılarak paylaştırılan alan mount edilerek kullanıma başlanır.

~# mount -t nfs 192.168.1.45:/mnt/nfs-share/docker-swarm /mnt/docker-swarm/

mount edilen alanın restart sonrası tekrardan kullanılabilmesi için /etc/fstab dosyasına yazılması gerekmektedir. Aşağıdaki komut ile bu işlem sağlanır.

~# echo "192.168.1.45:/mnt/nfs-share/docker-swarm      /mnt/docker-swarm  nfs     defaults 0 0" >> /etc/fstab

NFS paylaşım alanı oluşturulduktan sonra konteynerlerin üzerinde koşacağı overlay network oluşturulur. Bunun için aşağıdaki komut çalıştırılır. 

~# docker network create -d overlay --subnet 10.0.6.0/24 base-network

Altyapı oluşturulduktan sonra docker-swarm üzerinde konteyner deployment için yaml dosyası oluşturacağız. Bu dosyada konteynerlerimizi servislere bağlı olarak deploy edeceğiz. Deploy planımızda:

- iki adet servis yer alacaktır. Bunlar wordpress ve db servisleri.
- wordpress servisi 3 adet wordpress konteyner oluşturacak ve bunları hostlara dağıtacaktır. 
- wordress servisi wordpress içeriğinin kalıcı olması için wp-content klasörünü nfs share alanına bind edecektir. 
- wordpress servisi TCP 80 portunu dış dünyaya expose edecektir. 
- wordpress servisi base-network üzerinde ayağı kalkacaktır. 
- wordpress servisi veritabanına environment variableları kullanarak bağlanacaktır. 
- wordpress servisi "depends_on" özelliğini kullanarak veritabanı konteynerının keşfedecektir.
- db servisi manager node üzerinde konteyner ayağı kaldıracaktır.
- db servisi kalıcı olabilmesi için "/var/lib/mysql" dizinini nfs share alanına bind edecektir. 
- db servisi konteyerı başlatırken wordpressin bağlanacağı veritabanını oluşturmak için environment variable ları kullanacaktır. 
- wordpress servisi base-network üzerinde ayağı kalkacaktır. 

Yukarıda belirtilen işlemleri aşağıda gösterilen yaml dosyası ile tanımlıyoruz.

wordpress.yml:
--------------------------------------------------------------------------------------------------------------------------

#wordpress application
version: "3.8"
services:
  wordpress:
    image: wordpress:latest
    depends_on:
      - db
    volumes:
      - /mnt/docker-swarm/wordpress/:/var/www/html/wp-content
    deploy:
      mode: global   #konteynerlerin tüm hostlarda oluşmasını sağlar
    ports: 80:80
    environment:
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_DB_USER=test-user
      - WORDPRESS_DB_PASSWORD=test-passwd
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_TABLE_PREFIX=first-site
    networks:
      base-network:

  db:
    image: mysql:5
    deploy:
      placement:
        constraints:
          - "node.role==manager"    # mysql konteynerini swarm manager node üzerinde çalıştırır.
    environment:
      - MYSQL_ROOT_PASSWORD=test-passwd-root
      - MYSQL_ALLOW_EMPTY_PASSWORD=no
      - MYSQL_USER=test-user
      - MYSQL_PASSWORD=test-passwd
      - MYSQL_DATABASE=wordpress
    volumes:
      - /mnt/docker-swarm/mysql:/var/lib/mysql
    networks:
      base-network:
--------------------------------------------------------------------------------------------------------------------------
Yukarıda gösterilen dosya hazırlandıktan sonra aşağıdaki komut ile wordpress uygulaması deploy edilir.

~# docker stack deploy -c wordpress.yml WORDPRESS_APP

Komut çalıştırıldan bir süre sonra wordpress uygulaması ayağı kalkmış olur  ve tarayıcıdan docker hostlarının herhangi birisinin ip adresi ve 80. portu girilerek wordpress kurulum safyasına ulaşılabilir. Siteye tüm hostlardan erişilebilmesi overlay networkü sayesinde gerçekleşmektedir. Örneğin wordpress konteynıru sadece tek bir hostta (192.168.1.101) tanımlanmış olsaydı dahi yine diğer sunucu ip adresleri yazılarak wordpress uygulamasına erişilebilir olurdu. 

Bu makalede docker-swarm üzerinde wordpress uygulamasının nasıl deploy edileceği anlatılmıştır. Bir sonraki  yazıda mimarinin eksiklikleri değerlendirilecek ve sonrasında traefik cloud-native load balancer ile bu eksiklikler tamamlanmaya çalışılacaktır. 


Yararlanılan Kaynaklar: