AÖF Soru Bankası

Unix Sistem YönetimiÜnite 8 Özeti

Yapılandırma Yönetim Sistemleri

BİL211U-UNIX SİSTEM YÖNETİMİ

Ünite 8: Yapılandırma Yönetim Sistemleri

Giriş

Yapılandırma yönetim sistemleri, yöneticiler ve operasyon ekipleri için çok sayıda sunucuyu kontrol etme sürecini kolaylaştırmak için tasarlanmıştır. Bu sistemler sayesinde birçok farklı sistem tek bir merkezî konumdan otomatik olarak kontrol edilebilmektedir. Chef ve Puppet gibi Linux sistemlerde kullanılabilecek pek çok popüler yapılandırma yönetim aracı olsa da bunlar çoğu zaman istenilen ve ihtiyaç duyulandan daha karmaşıktır. Sunucuların güvenilir ve verimli bir şekilde dağıtık yapılarda kullanımı ve yönetilmesi bilgi işlem veri merkezlerinde yapılması gereken önemli görevler arasındadır. Geleneksel veri merkezlerinde sistem yöneticileri her bir sunucuya yazılımlar kurulup gerekli ayarları değiştirerek farklı makinelerdeki hizmetleri yönetmektedir. Otomasyon, bugünlerde çok karmaşık olan ve sistem yöneticilerinin ve geliştiricilerin her şeyi manuel olarak yapmak zorunda kaldıklarında çok hızlı ölçeklenmesi gereken bilgi ve teknoloji ortamları için çok önemlidir. Otomasyon, karmaşık görevleri basitleştirerek yalnızca geliştiricilerin işlerini daha yönetilebilir kılmakla kalmaz, aynı zamanda bir kurumun gelişimine katkı sağlayan diğer görevlere dikkatlerini vermelerini de sağlar.

Yapılandırma Yönetı̇mı̇-Ansı̇ble

Ansible, otomasyon görevlerini gerçekleştirmek için SSH protokolünden yararlandığı ve yapılandırma ayrıntılarını YAML dosyaları ile tanımladığı için nodlara özel yazılım yüklemeyi gerektirmeden bahsedilen bu sistemlere karşı iyi bir alternatiftir. Diğer protokoller desteklense de tüm talimatların uzak istemcilerle SSH üzerinden iletişim kuran bir kontrol makinesinden çalıştırıldığı bire-çok aracısız bir yapıya sahiptir. Ansible’ın temel çalışma mantığında, kontrol ve yönetilen nod kavramları yer almaktadır. Ansible’ın kurulu olduğu herhangi bir makine olan kontrol nodundan yönetilen nodlara komutlar ve talimatlar göndererek bağlantı sağlanır. Ansible’ın yönetilen nodlarda çalıştırdığı her kod birimine modül denir. Her modül bir görev tarafından çağrılır ve sıralı bir görev listesi birlikte bir çalışma kitabını (playbook) oluşturur.

Temel Kavramlar

• Makine (Host): Ansible tarafından yönetilen uzak makine • Grup (Group): Ortak özelliği paylaşan birlikte gruplandırılmış birkaç ana bilgisayar • Envanter (Inventory): Ansible’ın yönettiği tüm ana bilgisayarların ve grupların bir listesi. Envanter karmaşık olmayan yapılarda statik bir dosya olabilir ya da bulut sağlayıcıları gibi uzak kaynaklardan alınabilir. • Modüller (Modules): Ansible’ın çalıştırılmak üzere uzak nodlara gönderdiği kod birimleri • Görevler (Tasks): Bir modülü ve argümanlarını diğer bazı parametrelerle birleştiren eylem birimleri

• Çalışma Kitapları (Playbooks): Bir sistemi yapılandırmak için bir yöntem tanımlayan gerekli parametreleriyle birlikte sıralı görev listesi • Roller (Roles): Kullanıcıların otomasyon kodunu daha kolay paylaşmasına olanak tanıyan yeniden dağıtılabilir organizasyon birimleri • YAML: İnsanlar tarafından kolayca anlaşılabilir olan popüler ve basit bir veri formatı.

Ansible’ın Yüklenmesi

Ansible’ı kullanmaya başlamak için öncelikle Ansible’ın kontrol nodu olarak kullanılacak makineye kurulması gerekmektedir. Bu dizüstü bilgisayarınız olabilir. Bu kontrol nodundan Ansible, diğer makinelere bağlanıp yönetecek ve bu makinelerde farklı görevleri gerçekleştirecektir. Kontrol nodu Python 3.8 veya daha yeni sürümüne sahip herhangi bir makine olabilmekle birlikte Microsoft Windows işletim sistemi desteklenmemektedir.

Kontrol Makinesine Ansible Uygulamasının Kurulumu

SSH protokolü ile kontrol makinesine bağlanıp (ssh [email protected]) yazılım depoları güncellendikten sonra (sudo apt update) Ansible paketini Ubuntu yazılım deposundan kurmak için kitapta yer alan komut çalıştırılmalıdır. Onay aşamasında klavyede sırasıyla Y ve Enter tuşlarına basılarak kurulum işlemi tamamlanmış olacaktır. sudo apt install ansible -y komutu ile onay aşaması geçilip doğrudan kurulum da yapılabilir.

Envanter (İnventory) Dosyasını Oluşturma

Envanter dosyası, Ansible ile yönetilecek diğer bilgisayarlar ile ilgili bilgiler içerir. Envanter dosyasına tek bir ya da yüzlerce sunucu eklenebileceği gibi bu makineler gruplar ve alt gruplar altında organize edilebilirler. Envanter dosyası genellikle, çalışma kitapları ve şablonlarda kullanılmak üzere yalnızca belirli bilgisayarlar veya gruplar için geçerli olacak değişkenleri ayarlamak için kullanılır. Ansible genelde /etc/ansible/hosts konumunda varsayılan bir envanter dosyası oluştursa da ihtiyaçlara daha uygun herhangi bir konumda projeye özel envanter dosyaları oluşturulabilir. Bu durumda, Ansible komutlarını ve çalışma kitapları çalıştırılırken -i parametresiyle özel envanter dosyasının yolu belirtilmelidir. Her proje için farklı envanter dosyalarının kullanılması, yanlış sunucu grubunda bir çalışma kitabı çalıştırma riskini en aza indireceğinden geliştiriciler tarafından tercih edilen bir uygulamadır.

Yönetilen Makinelere Bağlantı

Yönetilecek makinelere kontrol makinesinden ssh ile bağlantı sağlanması işleminde yönetilecek makinelerdeki varsayılan kullanıcı kullanılabileceği gibi her bir makinede ansible adında yeni bir kullanıcı tanımlanıp bağlantı bu kullanıcı üzerinden de gerçekleştirilebilir. Bu bölümde yönetilecek her bir makinede ansible adında süper kullanıcı yetkisi ile bir kullanıcı oluşturulacaktır. Ansible kullanıcısı oluşturulduktan sonra kontrol makinesinden yönetilen makinelere ssh anahtarı (ssh key ile; Bknz. Ünite 04 Mac


OS İşletim Sisteminde SSH Kimliği Oluşturma başlıklı bölüm) ile parolasız giriş sağlanmalıdır.

Ansible ile Nginx Web Sunucu Kurulumu

Bu aşamada, sistem paketlerini kurma, şablonları uygulama ve Ansible çalışma kitaplarında işleyicileri (handlers) kullanma konusunda biraz bilgi yararlı olacaktır. Bu bölümde, Ubuntu 22.04 Linux işletim sisteminde statik bir HTML web sitesini barındırmak için uzak makinelerde Nginx sunucusu kurmayı otomatikleştiren bir çalışma kitabı oluşturulacaktır.

Nginx web sunucusunu yönetilen makinelerde kurmak için öncelikle kontrol makinesinde tercihen ev dizininde (/home/ubuntu gibi) nginx proje klasörü oluşturulacaktır.

Projede çalışma kitabı (playbook) tarafından kullanılması istenen dosyalar var ise bu dosyalar için proje altında demo- html adında bir klasör oluşturulup bu dosya(lar) bu klasörün altında yer alabilir. Nginx Web sunucu projesi için “Merhaba Dünya” yazan bir index.html dosyasının tüm yönetilen makineler tarafından Nginx Web sunucu yazılımı kurulduktan sonra kullanılması planlanmıştır.

Şablon Nginx Yapılandırma Dosyasını Oluşturma

Şimdi uzak web sunucusunu yapılandırmak için gerekli olan Nginx şablonunu oluşturulacaktır. Çalışma kitabı (playbook) olmayan dosyaları saklamak için ansible-demo dizininde dosyalar adıyla yeni bir klasör oluşturulacaktır. Oluşturulan dosyalar klasörünün içinde nano dosyalar/nginx.conf.j2 komutu ile yönetilen makinelerdeki Nginx uygulamasında kullanılacak şablon ayar dosyası işlevi görecek nginx.conf.j2 dosyası oluşturulacaktır.

Çalışma Kitabı (Playbook) Dosyasının Oluşturulması

Şimdi yeni bir Ansible çalışma kitabı oluşturularak ve yukarıdaki bölümünde açıklanan bazı değişkenler bu dosya içinde tanımlanacaktır. nano playbook.yml komutu ile playbook.yml adlı yeni bir dosya oluşturulup içine girilecektir. Bu çalışma kitabı, makine tanımının all olarak tüm makinelerin kullanılacağı ve become değişkeni ile Ansible’a tüm görevleri varsayılan şekilde root kullanıcı olarak (komutları sudo ile manuel olarak çalıştırmak) çalıştırmasını söyleyen bir yönerge ile başlamaktadır. Çalışma kitabının vars bölümünde üç değişken oluşturulacaktır: server_name (sunucu adı), document_root (belge kök dizini) ve app_root (uygulama dizini).

Gerekli Paketlerin Yüklenmesi

Aşağıdaki görev sayesinde, apt yazılım önbelleği güncellenecek ve ardından Nginx Web sunucu paketinin uzak nodlara kurulumunu gerçekleştirecektir. Bu görevde name değişkeni ile görevin adı, yazılım paketinin yüklenmesi için Ansible kurulumunda varsayılan gelen apt görev türünün kullanılacağı, name değişkeni ile yüklenecek yazılımın adı, state:latest değeri ile yüklenecek yazılımın en güncel versiyonunun yükleneceği ve son değişken olan update_cache ile apt update komutundaki gibi yazılım depolarının güncellenip güncellenmeyeceği belirlenmiştir.

Web Sitesi Dosyalarının Uzak Nodlara Yüklenmesi

Sonraki görevde, web sitesi dosyalarını uzak makinedeki belge kök dizinine yüklemek için Ansible kurulumunda varsayılan olarak gelen kopyala (copy) görev türü kullanılacaktır. Uygulama klasörünün oluşturulacağı sunucuda hedef dizini belirtmek için belge kök dizini (document_root) değişkeni kullanılacaktır. Burada name ile görevin adı, copy altında yer alan src değişkeni ile kopyalanacak dosyanın kontrol makinesindeki konumu, dest değişkeni ile dosyanın uzak makinede aktarılacağı konum ve mode: preserve ile de uzak makineye kopyalanacak dosyanın kontrol makinesindeki kaynak dosya ile aynı dosya izinlerine sahip olacağı belirtilmiştir.

Özelleştirilmiş Nginx Yapılandırmasının Uygulanıp Etkinleştirilmesi

Şimdi web sunucusunu statik HTML dosyasını barındıracak şekilde yapılandıracak ve Nginx şablonuna uygulanacaktır. Yapılandırma dosyası /etc/nginx/sites- available olarak ayarlandıktan sonra, /etc/nginx-sites- enabled içinde bu dosyaya sembolik bir bağlantı oluşturulacaktır. Sonrasında notify işleyicisi (handler) ile Nginx hizmetinin yeniden başlatılması sağlanacaktır. Bu süreç iki ayrı görevin tanımlanmasını gerektirecektir.

Nginx şablonunun yönetilen makinelere uygulanacağı birinci görevde name değişkeni ile görevin adı name değişkeni ile verilmektedir. Görevin gerçekleştirilmesi için Ansible kurulumu ile varsayılan olarak gelen template görevi kullanılacaktır. Şablon dosyanın konumu src değişkeni ile belirtilirken uzak makinelerde bu şablon dosyasının konumu dest parametresi ile tanımlanmıştır. Yeni sitenin etkinleştirilmesi görevinde ise yine name değişkeni ile görevin adı belirtilerek Ansible kurulumu ile varsayılan gelen file değişkeni ile görev türünün dosya işlemi olduğu belirtilmiştir. Src değişkeni ile işlem yapılacak dosyanın konumu belirtilmiştir.

Güvenlik Duvarında 80 Portuna İzin Verilmesi

Bir sonraki görevde ise Nginx Web sunucu uygulamasının kullanacağı 80/TCP portuna uzak makineye gelen istekler için izin verilecektir. Tüm görevlerde olduğu için name değişkeni ile görevin adı belirtildikten sonra ufw (uncomplicated firewall) ile işlem yapılacak görev türünün güvenlik duvarı olduğu tanımlanmıştır. rule:allow değişkeni ile kural türünün izin vermek olacağı, port:80 değişkeni ile izin verilecek portun 80 ve proto:tcp ile de bağlantı protokolünün tcp olacağı belirtilmiştir.

Nginx Servisi İçin İşleyici (Handler) Oluşturma

Çalışma kitabındaki görevleri tamamlamak için son olarak işleyici (handler) tanımlaması yapılarak Nginx Web sunucu uygulamasının yeniden başlatılacağı belirtilmiştir. İşleyiciler (handlers) altındaki name ile işleyicinin adı, service değişkeni ile görev türünün bir servis olacağı ve altındaki name ile bu servisin adı belirtilerek son olarak state değişkeni ile servisin durumunun yeniden başlatma (restarted) olacağı belirlenmiştir.


Tamamlanmış Çalışma Kitabının Çalıştırılması

Çalışma kitabı envanter dosyasında belirlenmiş sunucu(lar)da çalıştırmak için aşağıda yeşil yazı rengi ile belirtilmiş komut kullanılarak çalıştırılacaktır. Komuttaki -i parametresi ile kullanılacak envanter dosyası belirtilmiştir (-i inventory). -u ansible parametresi ile uzak makineye bağlantı yapacak kullanıcının ansible kullanıcısı olacağı ve -K parametresi ile uzak makineye ansible kullanıcısı ile giriş yapıldıktan sonra süper kullanıcı (sudo) yetkisi ile komut çalıştırmak için kullanılacak süper kullanıcı parolası (BECOME password) kullanılacağı belirtilmiştir. Çalışma kitabının çalışması tamamlandığında kullanılan bilgisayarda açılan tarayıcının adres çubuğuna yönetilen makinelerin ip adresleri yazılarak Nginx web sunucusu tarafından sunulan arayüze erişilecektir.

Konteyner Yönetimi-Kubernetes

Linux konteynerleri, içerdikleri uygulamaların üzerinde çalıştıkları işletim sistemlerinden bağımsız olarak çalışmasını sağlarlar. Doğru bir şekilde oluşturulmuş bir konteyner, taşınabilen ve verimli bir şekilde çalıştırılabilen ayrı yazılımları içinde barındıracaktır. Fakat sistemde çalışan farklı konteynerler olduğunda bunların Kubernetes gibi bir platforma tanımlanması ile aşağıdaki senaryolar gerçekleştirilebilir. Bir Kubernetes kümesi, uygulama iş yükünün dağıtıldığı çalışan nodlardan ve kümedeki çalışan nodları ve podları yönetmek için kullanılan ana noddan oluşmaktadır. Ana nod Kubernetes kümesini oluşturur ve çalışan nodlar (worker nodes) bu kümeye katılırlar. Kubernetes kümeleri konteynerleştirilmiş yazılımları çalıştıracak şekilde tasarlandıklarından Kubernetes kümesi yapılandırılıp ayağa kaldırıldıktan sonra bu bölümde bir Nginx konteyneri yayına alınacaktır.

Makine İsimlerinin Ayarlanıp Hosts Dosyasına Girilmesi

Kubernetes kümesinde yer alacak ana nod (master node) ve çalışan nodların (worker nodes) makine adı ve İp bilgilerinin ana nod’ta tanımlanması işlemi yapılmalıdır. Bunun için öncelikle kümede yer alacak tüm makinelere bağlanılıp makine adlarının tanımı yapılarak yine tüm makinelerde /etc/hosts dosyasında kümedeki tüm makinelerin makine adları ve ip bilgileri girilecektir. Bu sayede Kubernetes kümesinde yer alan tüm makineler birbirleri ile makine adları ile iletişim kurabilecektir.

Takas Alanının Devre Dışı Bırakılması

Tüm makinelerde takas belleği (SWAP) kullanıyorsa Kubernetes çalışmayacaktır. Bunun için sudo swapoff -a komutu ile makinelerdeki swap alanının devre dışı bırakılması gerekecektir. Yazılan komut ile makineler yeniden başlatılıncaya kadar takas belleği devre dışı bırakılacaktır. Makine yeniden başlatıldığında takas alanı yeniden etkin olacaktır. Takas alanının kalıcı olarak devre dışı bırakılması ve makinenin yeniden başlatılması gerektiğinde devreye girmemesi için /etc/ altındaki fstab dosyası açılarak içindeki /swap.img satırının önüne diye (#) eklenerek yoruma alınacaktır.

Çekirdek (Kernel) Ayarlarının Yapılması

Tüm makinelerde aşağıdaki çekirdek modüllerini yüklemek için öncelikle /etc/modules-load.d/ altında containerd.conf adında bir dosya oluşturulacaktır. Oluşturulan dosyanın içine aşağıdaki 2 satır eklenip kaydedildikten sonra dosya kapatılacaktır.

Containerd Programının Yüklenmesi

Bir konteyner programı, konteynerleri çalıştırmaya yarayan yazılımdır. Kubernetes kurulurken Pod’ların orada çalışabilmesi için kümedeki her bir noda bir konteyner programının yüklenmesi gerekir. Kubernetes tarafından desteklenen konteyner programları Docker, CRİ-O ve Containerd’dir.

Kubernetes’in Yüklenmesi

Artık Kubernetes’in kurulması için hazırlıklar tamamlanmıştır. Bu noktaya kadar olan diğer tüm komutlarda olduğu gibi, bu işlem kümedeki tüm makinelerde yapılmalıdır.

Kubernetes Kümesinin (Cluster) Kubeadm Komutu ile Başlatılması

Artık Kubernetes kümesi başlatılmaya hazırdır. Aşağıdaki kubeadm komutunu yalnızca ana makineden çalıştırılarak Kubernetes kümesinin çalıştırılmasına başlanacaktır.

Kubernetes küme yapısı ve nodların durumlarını görmek için sırasıyla kubectl cluster-info ve kubectl get nodes komutları çalıştırılacaktır. İlk komutta Kubernetes kontrol nodunun https://k8smaster.ornek.net:6443 adresinde çalıştığı bilgisi verilmektedir. İkinci komutta ise kümede k8smaster.ornek.net adıyla bir makine olduğu ancak durumunun (STATUS) hazır olmadığı (NotReady) görülmektedir. Birazdan açıklanacak olan konteyner network arayüzü yazılımları yüklendikten yaklaşık 1 dakika sonra ikinci k mut tekrar çalıştırıldığında bu sefer durumun hazır (Ready) olarak değiştiği görülecektir.

Calico Pod Ağ Eklentisinin Yüklenmesi

Calico ağ eklentisinin yüklenmesi için kontrol nodunda aşağıdaki curl ve kubectl komutları çalıştırılacaktır. Curl komutu çalıştırılarak belirtilen adresteki calico.yaml dosyası komutun çalıştırıldığı dizine (kitaptaki örnekte /home/ubuntu) indirilecektir. kubectl apply komutu ile indirilen dosya içindeki komutlar çalıştırılacaktır. Kube sisteminde podların durumunu doğrulamak için kubectl get pods -n kube-system komutu kullanılacaktır.

Kubernetes Kurulumunun Testi

Kubernetes kurulumunu test etmek için tüm çalışan nodlara Nginx Web sunucusu yüklenip sunuculara tarayıcı üzerinden erişim sağlanacaktır. Aşağıdaki komutta nginx imajı kullanılarak 2 adet kopya kurulacağı belirtilmektedir.

Bu ünitenin sorularını uygulamada çözŞıklar, doğru cevaplar ve süreli sınav modu AÖF Soru Bankası uygulamasında