Biliyorsunuz CentOS 7 bugün EOL oldu ve kullanılamıyor. Geliştirme süreçlerinde ise hızlı aksiyon almanız gerekiyorsa ve hali hazırda kullandığınız yazılıma güncelleme gelmediyse aşağıdaki işlemleri yapın.
Hatadan örnek vermem gerekirse
centos-sclo-rh paketini bulamıyor
direk olarak mirrorliste erişemiyor.
Docker’da en kolay çözüm yöntemi ise şu şekilde kullanabilirsiniz.
# Workaround the fact that CentOS 7 is EOLRUN sed-i's/mirrorlist/#mirrorlist/g'/etc/yum.repos.d/CentOS-*\ && sed -i's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g'/etc/yum.repos.d/CentOS-*\ && yum-config-manager --disablecentos-sclo-rh\ && yum installepel-release-y
ESXi kurulumunu ESXi Kurulumu Nasıl Yapılır? makalesi ile yaptınız ve servislerinizi dışarı açacaksanız ki özellikle subnet satın almışsanız makinede 1 Adet Router VM ihtiyacınız olacaktır. Bu VM alınan subnet’in internete çıkabilmesi amacıyla kullanılır ve zorunludur, aksi durumda tek tek ip adresi satın alınmalı ve servis sağlayıcısının DHCP sunucusundan ip adresi alınmalıdır. Bu örnekte Hetzner kullanıyor olacağım.
Bu Router VM bir MikroTik olabilir, router görevi gören bir Linux işletim sistemi olabilir ve/veya VyOS, OpenWRT, PfSense gibi çözümler olabilir. Bu örnekte ben MikroTik kullanıyorum.
Ücretlendirmesi sebebiyle, tekil ip satın alınmasını önermiyorum. Ancak yönlendirme amacıyla satın alınan 1 adet tekil ip üzerine “Separate MAC” isteği yapılması ve bu ip adresinin router VM’de kullanılması gereklidir. Genellikle sağlayıcı fark etmeksizin aynı işlem yapılmaktadır.
VM oluştururken verilen bu “00:50:56:00:4D:A9” mac adresi Router VM ethernet ayarlarında aşağıdaki gibi girilmelidir. Çünkü sağlayıcılar genellikle bu MAC adresleri üzerinden sizin istek yaptığınızı ve kim olduğunuzu belirler. Yani “Bridged Network” aslında sizin Uplinkinizdir.
Adapter Type VMXNET 3
MAC → Manual → Separate MAC number
“Bridged Network” Topolojisi, internete erişecek ana makine vSwitch aşağıdaki gibi gözükmelidir.
“Routed Network” Topolojisi vSwitch üzerinde aşağıdaki gibi gözükmelidir.
Her iki Network’te aynı VLAN ID’de olmalıdır. Ben bu örneği yaparken VLAN yapılandırmadığım için 0 olarak bıraktım. Trafiği izole etmek için VLAN kullanabilirsiniz.
USB belleğimiz hazır olduktan sonra bilgisayarımızı yeniden başlatıyoruz. Bilgisayarımız/Sunucumuz yeniden başladıktan sonra ESXi 6.7 kurulum ekranı gelecektir. Tüm ESXi Sürümlerinde genellikle aynı kurulum adımları uygulanmaktadır. Enter tuşuna basarak kurulumu başlatıyoruz.
Bu aşamada yükleme için gerekli olan dosyaları sisteme yüklemek için biraz bekleyeceksiniz.
Her şey hazır olduğunda karşınıza aşağıdaki donanımı kontrol eden ekran gelecek.
Aşağıdaki ekran karşımıza gelecek burada Enter tuşuna basarak devam ediyoruz.
EULA’yı kabul ediyoruz.
Sistemin kurulabileceği diskleri taraması için bir süre bekliyoruz. Çok kısa sürecek…
Kurulumu yapacağımız diski seçiyoruz. Benim kurulumu yapacağım disk sanal bir disk ve VMware Virtual S olarak görünüyor. Sizde farklı bir disk görünebilir. Ben şuan için sanal makine içerisine kuruyorum. Yani Nested yapıyorum. Diski seçtikten sonra Enter tuşuna basarak devam ediyoruz.
Kurulumu yapacağımız diski seçtikten sonra Enter tuşuna basarak devam ediyoruz. Klavye seçimi yapmamız lazım Türkçe olarak devam etmek gerekli seçimi yapıyoruz ve Enter tuşuna basıyoruz.
Root parolası belirliyoruz. Parolayı belirledikten sonra Enter tuşuna basarak devam ediyoruz.
Diskin üzerine kurulum yapılacağı için uyarı veriyor. F11 tuşuna basarak devam ediyoruz.
Son olarak kurulumu onaylıyoruz ve kurulum başlıyor.
Son olarak kurulumu onaylıyoruz ve Enter tuşuna basarak devam ediyoruz.
Artık makinemiz başarılı bir şekilde kuruldu ve yeniden başlatılacak.
İlk kurulumda F2 tuşuna basarak ESXi 6.7 ayarlarını yapmamız gerekebilir. DHCP üzerinden ip alınan durumlarda F2 tuşuna basarak ayarlarımızı genel olarak gerek yoktur.
Kurulum tamamlandığında aşağıdaki gibi bir ekran karşımıza gelecektir. Bu ekran gelmişse kurulum başarılı olmuş demektir.
Size verdiği ip adresi üzerinden ESXi Host arayüzüne erişebilirsiniz.
Belirlediğiniz bilgiler ile giriş yaptıktan hemen sonra ise gerekli yönetimsel işlevleri yapabilirsiniz.
Bu anlatım yapılırken Vmware Workstation kullanılmıştır, sunucu kurulumları ile bire bir aynıdır sadece network ve disk yapılandırması değişiklik göstermektedir.
Sanal bir makine üzerinden BGP bağlantıları sağlıyorsanız ve yüklü miktarda linux makinenizde route listesi varsa özellikle aşağıdaki gibi uyarılar ile karşılaşacaksınız, bu durum cihazınızın diskinin şişmesine de ayrıca sebep olacak.
VMware makineye bildiğiniz gibi vmware-tools kurar ki sistemdeki metrikleri toplayabilsin ve hataları izleyebilsin. Tabii router olarak kullanılan bir makinede routingi kapatmak daha sağlıklı gerekte yok zaten. Ki bu durum makinede 30 dakikada bir CPU fırlamasına da sebep oluyor onu da çözmüş oluyoruz.
/etc/vmware-tools/tools.conf içerisine aşağıdaki satırları ekliyoruz.
Kaydedip kapatıyoruz, ardından makineye ufak bir reboot atıyoruz. Ardından her şey rayına girmiş oluyor ve sistemde bu şekilde uyarılar görmemeye başlıyoruz.
Geçtiğimiz günlerde bir elasticsearch cluster kurarken başımızı ağrıtan bir durum oldu, gerçekten ilginç bir durumdu işletim sistemleri üzerine otomatik bir şekilde gerekli kurulumları yaptık ve haliyle makineleri docker swarm’a dahil ettik, bu noktada başımız ağrımaya başladı.
Sorun neydi?
Makineler birbiri ile doğru bir şekilde haberleşmiyordu, aşağıdaki gibi bir uyarı vermeye başladı
[WARN ][o.e.c.c.ClusterFormationFailureHelper] master not discovered yet
Ardından biraz gözlemleyelim belki master elasticsearch birşeyler yapıyordur ve yayına geçmemiştir dedik bir kaç dakika bekledik. Tabii bu sırada aşağıdaki gibi bir uyarı daha gözümüze ilişti
[WARN ][o.e.d.SeedHostsResolver ][elasticsearch-master-1] failed to resolve host [elasticsearch-master.local]
Tam olarak olay burada koptu, biz her şekilde ip üzerinden erişiyorduk icmp paketleri vs her şekilde ulaşıyordu ve sorun gözükmüyordu. hostname ile curl atamıyorduk ama ip adresi ile curl atabiliyorduk. Bu durum haliyle bizi DNS’i kontrol etmeye itti ama konunun DNS ile hiç bir alakası yoktu.
Nelere bakıldı?
Makinelerin bir biri arasında network erişimlerini kontrol ettik
telnet aracılığı ile portların açık olup olmadığına baktık
traceroute ile trafiğin nereden geçtiği bizim yanlışlıkla bir firewall kuralı ile iletişimlerini kesmiş olabilir miyiz ona baktık.
DNS tarafını kontrol ettik, acaba swarm düzgün mü işlemiyor diye uzunca bir süre baktık.
Makinelerin firewall durumlarına baktık
Kurulumları otomatik yaptığımız için yanlış network kartını mı dinletiyoruz diye iki kez yapılandırmamızı kontrol ettik.
Nasıl Çözdük?
Her şeyi denemiştik, başladık internete araştırma yapmaya uzunca bir süre arama yaptıktan sonra bir makalede gözümüze bir şey ilişti giden paketlerde checksum kontrolünü kapattığında birisinin sorunu çözdüğünü gördük bende direk gittim aşağıdaki komutu çalıştırdım.
ethtool -K <interface> tx off
Bir baktık ki hakikaten sorun çözülüyor, erişim geliyordu buraya kadar bir sorun yoktu ancak kararlı çalışmıyordu. 1 saat kadar bu şekilde çalıştırdık ve biraz gözlemledik. Bazı makalelerde çözümün sanal makinelerde ağ kartını değiştirmek olduğunu önermişler, lakin ESXi’da VMXNET3 dışında kullanmak pek önerilmez çünkü vmware zaten bu network kartını tüm sistemler düzgün ve performanslı çalışsın diye yapıyor o sebeple hiç değiştirmedik bile.
Kesin çözüme ise ulaşmamız bu aşamadan sonra zor olmadı, araştırmaya devam ettiğimizde konuyla ilgili bir çözüm karşıladı bizi evet bulmamız biraz zaman aldı ancak nihayetinde çözdük sorunu.
docker swarm init --data-path-port=3888
VMware ortamınızda NSX çalıştırıyorsanız ki çoğu zaman çalışır “overlay networking” varsayılan olarak UDP port 4789‘u kullanır ve bu da VMware NSX’in VXLAN için iletişim portu ile çakışır sorunda işte burada başlar. Bu portu değiştirince her şey haliyle zart diye çözülmüş oldu.
docker compose kurulumlarda çok fazla kullanılıyor pratikte çokta işe yarıyor ama zaman zaman hataya düşebiliyor, bir işlem yapıyorsunuz ve çakışmalara, aynı ağ adlarını almaya başlıyor.
Bu durumda docker güncellemelerinde ve/veya sistem güncellemelerinden sonra ortaya çıkıyor. Ağların ve konteyner’ların başlamasına engel oluyor.
Örnek bir hata mesajı
Sep 01 18:30:15 debian docker compose[2281641]: Removing network mertcan_defaultSep 01 18:30:15 debian docker compose[2281641]: network mertcan_default is ambiguous (2 matches found based on name)Sep 01 18:30:16 debian systemd[1]: mertcan_default.service: Control process exited, code=exited, status=1/FAILURE
Aşağıdaki gibi yazdığımız ufacık bir python kodu ile sistemden başa bela olan bu ağları otomatik kaldırma işlemi yapabilirsiniz.
import subprocessimport jsonimport logginglogger = logging.getLogger(__name__)output = subprocess.check_output(["docker","network","ls","--format","{{json .}}"])networks =set()# use a set to avoid duplicatesfor line in output.decode("utf-8").splitlines():# check line is not emptyifnot line: logger.debug("Empty line found in docker network ls output (ignoring)")continue network = json.loads(line)if network["Name"]in networks: logger.info("Removing duplicate network: %s", network["Name"]) subprocess.check_call(["docker","network","rm", network["Name"]]) networks.add(network["Name"])
Bazı şeyleri otomatize ederken oto deployun yanı sıra otomatik güncelleme yapmakta önemli, bunun için rsync veya ssh üzerinden güncelleme yapmak yerine direk olarak docker containerı güncelleyebilirsiniz.
Bu işlem için ise direk olarak docker container build etmemiz bizim için yeterli, uygulamamız bunun içerisinde çalışacak ve watchtower bunu otomatik güncelleyecek.
İmaj oluşturmak için .gitlab-ci.yml için aşağıdaki yapılandırmayı kullanabilirsiniz.
Bu yapılandırma direk olarak mastera gönderilen her kodu container haline getirecek ve gitlab “container registry” içerisine basacak. Burada çift branch kullanmanızı öneririm. dev ve master olarak yoksa otomatik güncellemede sorunlarla karşılaşabilirsiniz.
Dockerfile yapılandırmamız ise aşağıdaki gibi, NodeJS uygulamamız çalışıyor siz kendinize göre güzel bir yapılandırma uygulayın.
FROM node:17
RUN set -eux; \
npm install -g pm2
COPY app .
RUN npm install
CMD ["pm2-runtime", "index.js"]
İşlemler tamamlandığında imajımız gitlab’da duracak, isterseniz bu imajı docker hub üzerinede gönderebilirsiniz, karar size kalmış. Gitlab kullandığımız için biz başka bir alanda barındırmak istemedik.
Otomatik güncelleştirme kısmına geldik aşağıdaki gibi bir docker-compose.yml dosyası işimizi fazlasıyla görecek
Yapılandırmayı kendinize göre özelleştirmekte özgürsünüz 30 saniyede bir container registrymiz kontrol edilecek varsa güncelleme alınacak, isterseniz bu süreyi arttırabilirsiniz.
Docker CLI ve Docker Compose ile ilgili sıkça kullandığım komutlar yer almaktadır. bu komutları terminal aracınıza kaydedip snippet olarak kullanabilirsiniz. Termius ve xShell üzerinde işlemlerinizi yapabilirsiniz.
Geçenlerde Twitter üzerinden isyanımı belki görmüşsünüzdür, bazıları gidip OVA olarak sanal makine imajı yayınlıyor. Virtualbox dışında bunu direk olarak açmak imkansız. Herhangi bir sıkıştırma uygulaması ile dışarı çıkartabiliyorsunuz içerisinde VMware\’ye uygun bir iso çıkıyor bunu kullanabiliyorsunuz tabii
Peki benim gibi VMware kullanmayan birisi ne yapacak? Tabii ki başının çaresine bakmak zorunda kalacak, Hyper-V ve KVM kullananları kimse düşünmesin zaten biz kimiz ki…
Neyse fazla uzatmaya gerek yok. Qemu kardeşimizin geliştirdiği imaj dönüştürme aracını kullanıp formatlar arasında değişiklik yapabiliyoruz. Özellikle Windows bir makinede qemu-img for Windows aracı ile bu işlemi basitçe yapabilirsiniz.
Aslında bu aracın ana amacı bütün sanallaştırma imajları arasında geçiş yapabilmeyi sağlamak. Genel anlamda aşağıdaki bütün uygulamalar için dönüştürme işlemi yapabiliyor.
Hyper-V
KVM
VMware
VirtualBox
Xen
Bu aracı ana yayıncı silebileceği için ben bir sürümünü kendi makinemde tutacağım qemu-img-win-x64-2_3_0.zip sürümüne her zaman ulaşabilirsiniz.
Desteklenen Disk Formatları
Imaj Formatı
-f ve -o çıktı formatı
VMDK (VMware)
vmdk
QCOW2 (KVM, Xen)
qcow2
VHD (Hyper-V)
vpc
VHDX (Hyper-V)
vhdx
RAW
raw
VDI (VirtualBox)
vdi
Herhangi bir imajı VHDX formatına dönüştürmek
Bahsettiğim gibi istediğiniz imajı dönüştürebilirsiniz, yeter ki dönüştüreceğiniz disk imajı bozuk olmasın. Örneğin ben vmdk imajını direk olarak Hyper-V uyumlu VHDX formatına geçireceğim.
Bu işlem diskin boyutuna ve sisteminizin gücüne bağlı olarak biraz zaman alacak. Ama dönüştürme işlemi tamamlandığında gidip Hyper-V üzerinde imajı kullanabileceksiniz.
Herhangi bir imajı VHD formatına dönüştürmek
Yukarıda kullandığım aynı VMware disk imajını gidip Hyper-V uyumlu olan bir diğer format olan VHD\’ye dönüştüreceğim. Fark ettiyseniz disk boyutlarını fixed olarak belirledim. Dönüştürme işlemlerinden hemen sonra diski Hyper-V ile düzenleyip isterseniz dynamic moda geçirebilirsiniz.
Bu işlemde yukarıda olduğu gibi sanal diskinizin boyutuna ve sisteminizin gücüne göre biraz zaman alacak ama düzgün bir şekilde dönüştürme işlemi tamamlanır rahat olun.
Bu işlemden sonra Windows bize VHD imajının bilgilerini verebilir, VHDX için henüz böyle bir özellik olmasa da VHD diskler için oldukça işlevsel.
Get-VHD .\disk1.vhd
Bu kod bize direk olarak VHD hakkında bilgileri ekrana aşağıdaki gibi basmakta.
Artık sanal makine diskleri arasında nasıl geçiş yapabileceğinizi öğrendiniz, internette uyumlu imaj aramayı bırakabilirsiniz. Tabii gün sonunda dönüştürme işlemi başarılı olsa bile ön yükleyici bozulabilir bu gibi durumlarda elle aksiyon alıp örneğin *nix bir işletim sistemiyse grubu tamir edip sorunu çözebilirsiniz.
Birden fazla geliştirme ortamı kullandığımız ve imajların güncelliğini yitirdiği senaryolar olabiliyor, mevcut bir konteyneri silmek istemeyebiliriz. Kullanılan bu konteyner production ortamında çalışıyor ve üzerinde işlem yapılıyor olabilir.
Docker kardeşimizde imajlar geçici olacak şekilde tasarlanmıştır. Yani mevcut bir imajı güncellemek için eskisini mecbur kaldırır ve yenisini başlatırsınız.
Bu işlemi yapmak için aşağıdaki prosedürü izlemeniz yeterlidir.
docker-compose pull
docker-compose up -d --remove-orphans
docker image prune -f
Bir imajın indirilmesinin başarısız olacağı senaryolar olabilir, kesintilerin sizin için önemli olacağı senaryolar olabilir. Bu sebeple tekrar imajı composer üzerinden pull etmeden ayağa kaldırma komutumuzu vermiyoruz. Güncel imajı indirmek ve bunun üzerinden tekrar konteyner ayağa kaldırmak bizim için önemli.
Gitea ile kendinize özgü kişiselleştirilmiş git sunucusu kurabilir, repolarınızı kendi bünyenizde barındırabilir siniz. Normalde kurulum biraz daha uzun ancak Docker kullanarak bu kurulumu sancısız atlatmak ve çok basit bir şekilde kullanmak mümkün
Resmi belgelendirmede paylaşılan docker-compose.yml dosyasının aksine ben uygulamayı lokalde çalıştırmayı seçtim ve dışarıya da NGINX ile açma yoluna gittim. Çalıştırmak için;
Ardından NGINX yeniden başlattığınız anda kurulum ekranı karşınıza çıkacak, gerisi size kalmış durumda. Gitea uygulaması üzerinde yapacağınız değişiklikler için /var/lib/docker/volumes/gitea_gitea/_data/gitea/conf/ yolu içerisinde yer alan app.ini dosyasını değiştiriniz.
Yanlış yapılandırılan her docker konteyneri dışarıya yüklü miktarda log basar, disk alanı az olan sunucularda sistem yöneticileri güneşi hızlı bir şekilde görebilir ve servis kesintileri yaşayabilir.
Aşağıda yapacaklarımızdan hemen önce lütfen docker-compose dosyanız üzerinde gerekli olan ince ayarları yapınız, aksi taktirde yapacağınız bu işlemlerin log dosyalarının boyutunu düşürmede bir etkisi olmayacaktır.
Bir müşteride mevcut logların boyutunu şu şekilde gördüm, burada anladığım kadarıyla 2 konteyner aktif olarak kullanılmış ve üzerinde ciddi anlamda işlem yapılmış ve log üretilmiş.
Müşteri bana logların önemli olabilecek verileri uzak storageda tutabileceğini ve gerektiği kadarını silmemi (bence saçma, bir işine yaramaz bu log ama neyse)
Ardından log dosyasını bölmem ve çoğunu kesmem gerektiği için apt install util-linux kurulumu yaptım(ilginç şekilde yüklü değildi), ardından fallocate ile dosyayı bölme işlemine geçiş yaptım ve aşağıdaki gibi büyük çoğunluğunu uçurdum.
Böylelikle dosyada 1 GB‘lik kısmı bıraktım, ancak ben bunu yapıncaya kadar sistemde yapılan işlemler sebebiyle +4 GB kadar daha log birikmişti. Docker ile ilgilenen arkadaşa ilettim konuyu(ancak çözmemiş)
Otomatik log rotasyonu aktif edildiği taktirde bu makalede anlatılan çözümü yapmanıza gerek yok.
windows ve linux sistem yönetimi, network ve ağ güvenliği, siber güvenlik, yazılım ve gündemdeki diğer teknolojik konular hakkında blog yazıları