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

Ömer Faruk URHAN
4 min readJan 1, 2021

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 için yapılacak olan işlem adımları 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

user-data:

#cloud-config
password: "parola"
chpasswd: {expire: False}
ssh_pwauth: True
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
timezone: Europe/Istanbul
ssh_authorized_keys:
- ssh-rsa [ssh-public key]
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

network-config:

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

user-data, meta-data ve network-config 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şturulacaktı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 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 centos01 --memory 2048 --vcpus 1 --disk centos.img,format=qcow2,bus=virtio --network bridge=virbr0 --graphics vnc --disk centos.iso,device=cdrom

Böylece 2gb RAM ve 1 vcpu lu bir sanal makineyi KVM üzerinde cloud-init servislerini kullanarak deploy etmiş oluyoruz. Yukarıdaki komut ile deploy yapıldıktan 2 dk sonra sanal makineye ssh bağlantısını yapıp kullanmaya başlayabilirsiniz. (Centos Cloud imajlarında varsayılan kullanıcı adı centos’dur.)

omer@omer-desktop:~$ ssh centos@192.168.122.20 
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Fri Jan 1 15:31:56 2021 from 192.168.122.1
[centos@centos01 ~]$

Originally published at http://omerurhan.blogspot.com.

--

--