7 Mayıs 2020 Perşembe

Bulut İçin Linux İmajları Oluşturma ve Deploy Etme (1)

Merhaba. Bu yazıda günümüz "cloud-computing" teknolojilerinin de kullandığı yöntem olan cloud-init yöntemi ile linux işletim sistemi deploy etmeyi açıklayacağız. Cloud-init yazılımı ile hemen hemen tüm public cloud platformlarında ve bazı private cloud platformlarında (KVM, OpenStack, LXD, Bare metal installs) çok kısa sürede tüm büyük linux dağıtımları ayağı kaldırılabilmektedir. Peki nasıl?

Öncelikle cloud-init servislerinin çalışma mantığından bahsedeceğiz. Cloud-init servisleri işletim sisteminin boot edilmesi esnasında çalıştırılmaktadır. Böylece kurulumunu yapacağınız işletim sistemini ilk boot esnasında konfigüre etmenizi sağlar. Bu servislerin çalıştırılabilmesi için öncelikle cloud tabanlı işletim sistemi imajlarını kullanıyor olmanız gerekmektedir. Örneğin Ubuntu veya CentOS işletim sistemi kuracaksanız, işletim sistemi imajlarınızı https://cloud-images.ubuntu.com/ - https://cloud.centos.org/centos/ adreslerinden indirmelisiniz. İndirmiş olduğunuz imaj dosyaları içerisinde cloud-init servisleri bulunmaktadır. Cloud-init servisleri çalıştığında çeşitli kaynaklardan verileri okuyarak konfigürsayonları gerçekleştiriler. Örneğin veriler dosyadan okunacak ise yaml formatında üç farklı dosya oluşturulabilir:

    - meta-data        : instance-id,  hostname gibi makineye ait bilgiler
    - user-data         : Kullanıcı adı, parola, ssh public anahtarları, işletim sisteminde kurulması istenen paketler vb. ayarların yapıldığı dosyadır.
    - network-config : Ağ ayarlarının yapıldığı dosyadır. 

Bu aşamada işletim sistemi boot edilirken sırası ile aşağıdaki cloud-init servisleri çalışmaktadır.

1- Generator: Bu hizmet ile boot başlatıldığında systemd boot hedeflerinin içinde cloud-init hedefi yer alıyorsa -varsayılanda yer almaktadır- cloud-init servisi başlatılır. Yalnızca aşağıdaki durumlarda cloud-init servisleri çalıştırılmaz.
    - /etc/cloud/cloud-init.disabled dosyası mevcut ise,
    - kernel komut satırında cloud-init=disabled ifadesi yer alıyor ise.
2- Local: cloud-init-local.service servisi tarafından kontrol edilir. "/" kök dosya sistemi mount edilir edilmez çalışmaya başlamaktadır. Lokal "data-source" kaynaklarını bulur ve data-source kaynaklarını okuyarak ağ konfigürasyonlarını gerçekleştirir. (Data-source  bulunan deploy ortamına bağlı olarak değişmekle birlikte bizim yapacağımız örnekte meta-data ve network-config dosyaları olacaktır.)
3- Network: cloud-init.service servisi tarafından kontrol edilir. Local adımından sonra çalıştırılır. Bu adım çalıştırılmadan önce makine ağ ayarlarını almış ve "interface"ler "up" duruma gelmiştir. Bu aşamada disk_setup ve mounts modulleri çalışarak mount pointler, partitionlar yönetilir veya diskler formatlanır. Ayrıca bootcmd gibi ön yükleme adımları nu aşamada çalıştırılır. 
4- Config: cloud-config.service servisi tarafından kontrol edilir. Network adımından sonra çalıştırılır ve config modullerini çalıştırır. Örneğin password, timezone, runcmd  modüller. Bu aşamada kullanıcı adı, parola, ssh public anahtarları, işletim sisteminde kurulması istenen paketler vb. ayarlar yapılmaktadır.
5- Final: cloud-final.service servisi tarafından kontrol edilir. Son olarak bu adım çalıştırılır. Klasik olarak rc.local altındaki uygulamalar ile aynı zamanda çalışmaktadır. Bu aşama paket yükleme, configration managemet pluginlerinin yüklenmesi, shell scriptlerinin (user-data ile gelen) çalıştırılması gibi işlemlerin yapılma aşamasıdır.


Cloud-init servislerini ve çalışma süreçlerini anlattıktan sonra örnek üzerinden deployment sürecini izleyellim. Örnekte platform olarak KVM private cloud ortamını kullanılacaktır. Kısa sürede linux imajı oluşturup, oluşturulan bu imajı KVM hipervizörü üzerinde deploy edeceğiz. Bu çalışmada linux dağıtımlarından CentOS ve Ubuntu için yapılacak olan işlem adımları ayrı ayrı anlatılacaktır. 

"cloud-init" yöntemi olarak da bilinen bu yöntemde öncelikle temel işletim sistemi imajı resmi sayfasından indirilir. Bu imaj işletim sisteminin yalın ve sade hali ile gelmektedir. CentOS işletim sistemi için https://cloud.centos.org/centos/ adresine girilerek kurulacak işletim sistemi sürümü seçilir (bu çalışmada CentOS 8 sürümünü deploy edeceğiz.) ve listelenen imajlardan "qcow2" uzantılı "GenericCloud" disk seçilir ve indirilir. 

~]# wget https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2 

meta-data, user-data, network-script dosyaları yml dosyası formatında oluşturulur. Bu örnekte deploy edeceğimiz işletim sisteminin docker uygulaması ile birlikte statik ip adresi alarak ayağa kalmasını istiyoruz. Bu sebeple aşağıda gösterilen dosyalar hazırlanır.

meta-data:
--------------------------------------------------------------------------------------------------------------------------
# cloud-metadata dosyası

instance-id: centos01

local-hostname: centos01


--------------------------------------------------------------------------------------------------------------------------
network-config:
--------------------------------------------------------------------------------------------------------------------------
version: 2
ethernets:
  eth0:
    dhcp4: false
    addresses:
      - 192.168.1.104/24
    gateway4: 192.168.1.1
    nameservers:
      search: [omer.com, bar.local]
      addresses: [8.8.8.8, 4.4.4.4]
--------------------------------------------------------------------------------------------------------------------------

user-data:
--------------------------------------------------------------------------------------------------------------------------
#cloud-config
password: "sizin parolanız"
chpasswd: {expire: False}
ssh_pwauth: True
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
timezone: Europe/Istanbul
ssh_authorized_keys:
  - ssh-rsa  "public-key"
# runcmd bölümüne  deploy etttiğiniz işletim sistemi ayağa kalktıktan sonra çalıştıracağınız komutları yazabilirsiniz. Zira sunucu boot olduktan ve systemd ile servisler başlatıldıktan sonra bu #bölüm çalıştırılır.
runcmd:
# Kurulum sonrası tüm cloud servisler disable edilerek sunucunun sonraki açılışlarında bu servislerin çalışmasının önüne geçilir.
  - systemctl disable cloud-config.service
  - systemctl disable cloud-final.service
  - systemctl disable cloud-init-local.service
  - systemctl disable cloud-init.service
# keymap seçilir.
  - localectl set-keymap trq
# docker uygulaması için gerekli olan paket kurulumları 
  - yum install -y yum-utils
  - yum install vim-enhanced -y
  - dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
  - dnf install docker-ce --nobest -y
  - dnf install curl -y
# docker-compose kurulumu
  - curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  - systemctl start docker
  - systemctl enable docker
  - usermod -a -G docker centos
  - chmod +x /usr/local/bin/docker-compose
--------------------------------------------------------------------------------------------------------------------------
user-data, meta-data dosyaları oluşturulduktan sonra işletim sisteminin açılışta boot edileceği iso dosyası bu üç dosya kullanılarak oluşturulur. Böylece işletim sistemi ayağı kalkarken "data-source" olarak iso dosyası okuyup konfigürsayonları buradan çekecektir. Bu aşamada "genisoimage" yazılımı kullanılarak bu üç ayar dosyası iso kalıp dosyasının içine aktarılır.

~]# genisoimage -output centos.iso -volid cidata -joliet -rock user-data meta-data network-config 

Yukarıda çalıştırılan komut ile "centos.iso" adında bir imaj kalıp dosyası oluşturulmuş olacaktır. İşletim sistemini KVM üzerinde deploy etmeden önce indirmiş olduğumuz centos GenericCloud diskinin kapsitesini değiştirebilirsiniz. Varsayalında 10G olarak gelen bu diski "qemu-img" yazılımı ile düzenleyebilirsiniz. Bu örnekte disk kapasitesini 30G olarak güncelleyeceğiz. Ayrıca indirdiğimiz disk üzerinde düzenleme yapmadan önce bu diski kopyalayıp değişiklikleri kopyaladığımız disk üzerinde yapacağız.

~]# sudo cp CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2 centos.img
~]# qemu-img resize centos.img  30g

Son olarak KVM üzerinde komut satırı ile sanal makine kurulumu yapmamıızı sağlayan "virt-install" yazılımı ile hazırlamış olduğumuz işletim sistemini aşağıdaki komut ile deploy edeceğiz. 

~]# virt-install --import --name centos --memory 2048 --vcpus 4 --disk centos.img,format=qcow2,bus=virtio --cdrom=centos.iso --network bridge=br0 --graphics vnc  &

Komutun çalışmasını müteakip işletim sistemi KVM üzerinde ayağı kalkacak ve cloud-init servisleri sırası ile çalışarak işletim sisteminin yapılandıracaktır. Bu yöntem ile ön hazırlığını yaparak çok kısa bir süre içerisinde işletim sistemlerini deploy edebilme imkanı kazanmış olacaksınız. Bir sonraki yazıda Ubuntu işletim sisteminin KVM üzerinde "cloud-init" metodu kullanılarak deploy edilmesini inceleyeceğiz.

Yararlanılan kaynaklar:
[1] Linux Bible Ninth Edition
[2] https://cloudinit.readthedocs.io/en/latest/

Hiç yorum yok:

Yorum Gönder