Her Kubernetes sürümünde olduğu gibi 1.20 sürümünde de yapılan değişikliklere dair bir liste yayınlandı. Yapılan değişikliler arasında gözden kaçmayacak kadar önemli bir girdi yer almakta: Docker desteği sonlanıyor. Bu yazımızda şimdiye kadar verilen bu desteğin ne olduğunu, Kubernetes yöneticileri ile geliştiricilerin ne şekilde etkileneceğini ele alacağız.
Bu değişikliğin etkisinden söz etmeden önce mevcutta Docker için sunulan desteğin ne olduğundan bahsetmekte fayda var. Kubernetes’in mimarisindeki en önemli bileşenlerden birisi şüphesiz ki Container Runtime‘dır. Node’lar üzerinde çalışan ve iş yüklerini yöneten Kubelet, üzerinde çalıştığı node için bir iş yükü atanması olduğunda konteyner’ın başlaması için arkaplanda Container Runtime ile iletişime geçmektedir. Her ne kadar en yaygın kullanılan Container Runtime Docker olsa da bu alanda tek değildir. Her bir Container Runtime’ın tasarımı nedeniyle kendine göre artıları ve eksileri bulunmaktadır. Kubernetes’in Docker ve diğer tüm Container Runtime’larla da sorunsuz çalışabilmesi amacıyla Container Runtime Interface (CRI) geliştirilmiştir. Kubernetes 1.5 ile birlikte alfa olarak yayınlanan CRI arayüzü ile oluşturulan soyutlama sayesinde Kubelet, uyumlu Container Runtime’lar ile arada ek bir dönüştürücü olmaksızın doğrudan iletişim kurabilmektedir. Container Runtime Interface (CRI) ile kazanılan soyutlama sayesinde Kubernetes yöneticileri, ihtiyaçları ve zaman içerisindeki geliştirmeler neticesinde istedikleri Container Runtime’ı seçebilme özgürlüğüne sahip olmuştur.
Bu paragraf ardından aklınıza şu soru takılmış olabilir: “Madem CRI var, o zaman Docker desteğinin sonlanması ne demek?” Bu soruya cevap vermek için Docker-Kubernetes entegrasyonuna yakından bakmamız gerekiyor. Öncelikle, Docker Kubernetes içerisine gömülmesi için tasarlanmış bir ürün ya da Kubernetes’in bir alt projesi değil. Docker hali hazırda CRI uyumlu değil, yani CRI desteği bulunmuyor. Dolayısıyla CRI desteği yoksa Docker-Kubernetes entegrasyonu ek bir iş yükü anlamına gelmekte. Problemin temelinde de bu durum yatmakta. Şimdiye kadar Docker-Kubernetes entegrasyonu Kubernetes tarafından geliştirilen ve desteği sunulan DockerShim tarafından sağlanmaktaydı. DockerShim aynı bir dönüştürücü gibi Kubernetes direktiflerini Docker’ın anlayacağı komutlar haline dönüştürüyordu.
Bu noktada Docker’ın Kubernetes altında çalışmak üzere tasarlanmadığını bir kez daha hatırlatma fayda var. Docker daha çok insanların kolay kullanımı için tasarlanmış bir Container Runtime. Dolayısıyla, bir yazılım olan Kubernetes’in insanların kullanımı için tasarlanmış Docker ile iletişim kurmasını sağlayan DockerShim’e çok iş düşmekte. Üstelik DockerShim, cgroups v2, user namespace’leri gibi güncel konulara destek sunmadığı için deyim yerindeyse Kubernetes’in gelişiminde de bir ayak bağı haline gelmiş durumda.
Bu bilgiler ardından yeniden Kubernetes’in Docker desteğinin sonlanmasına döndüğümüzde, aslında sonlananın DockerShim desteği olduğu çıkarımına rahatlıkla ulaşabilirsiniz. DockerShim’in kaldırılması hakkındaki değişiklik teklifini bu adreste bulabilirsiniz. DockerShim Kubernetes’ten kaldırılıyor, bunun hem de 1.22 sürümü gibi yakın bir sürümde olması planlanıyor.
Gelelim DockerShim’in Kubernetes’ten kaldırılmasının geliştiriciler ve Kubernetes yöneticilerini ne şekilde etkilediğine. Burada asıl iş Kubernetes yöneticilerine düşmekte. Bu nedenle öncelikle Kubernetes yöneticilerine olan etkisi inceleyeceğiz. Kubernetes kümeleriniz GKE, EKS ya da AKS gibi bir bulut sağlayıcısında ise görece daha rahatsınız. Bu bulut sağlayıcılarında varsayılan Container Runtime olarak containerd kullanılmaktadır. Aksi bir yapılandırma yapmadığınıza emin olmalı, desteklenen bir Container Runtime’a geçiş yapmalısınız. Eğer On-Prem olarak Kubernetes kümelerini kullanıyorsanız 1.20 sürümü ile docker desteğinin sonlanacağına dair bir uyarı alacaksınız. Takip eden sürümlerde problemlerle karşılaşmamak adına Docker yerine desteklenen bir Container Runtime’a geçiş yapmalısınız.
Bu değişikliğin uygulama geliştiricileri ne şekilde etkileyeceğine baktığımızda karşımızda daha rahat bir tablo bulunuyor. DockerShim’in emekli olması geliştiricilerin Docker ile ürettikleri konteyner imajlarını etkilememekte. Docker’ın ürettiği konteyner imajları Open Container Initiative (OCI) uyumludur. Bu uyum sayesinde diğer Container Runtime’lar tarafından da sorunsuz şekilde çalışabiliyorlar. Bu nedenle şu an için geliştiricilerin alması gereken bir aksiyon bulunmuyor.
Son bir notu sürekli entegrasyon/teslimat süreçleri için düşmekte fayda var. Eğer sürekli entegrasyon/teslimat sürecinizde Docker Socket’ine bağımlılığınız bulunuyorsa yakın zamanda artık bu socket Kubernetes kümesinden kalkacağı için sürecinizi gözden geçirerek modifiye etmenizde fayda var.