Kubernetes v1.24 ve sonraki sürümleri, Aralık 2020’nin v1.20 sürümünde kullanımdan kaldırılmasının ardından Dockershim olmadan gemiyi yayınlar. Dockershim artık yerleşik bir kapsayıcı çalışma zamanı olarak mevcut değil. Bunun yerine containerd, CRI-O veya Docker Engine gibi desteklenen farklı bir çalışma zamanı kullanmanız gerekir. cri-dockerd
adaptör.
Bu makalede, etkilenip etkilenmediğinizi nasıl kontrol edeceğinizi göstereceğiz, ardından farklı bir çalışma zamanına nasıl geçiş yapabileceğinizi açıklayacağız. Bu adımları atmalısın önceki kümenizin iş yüklerinin etkilenmemesi için Kubernetes v1.24 veya sonraki bir sürüme yükseltirsiniz.
Dockershim Neydi?
Dockershim, Kubernetes’in daha fazla kapsayıcı çalışma zamanını destekleyebilmesi için gerekli bir bileşen olarak geliştirildi. Projenin başlangıcında Kubernetes yalnızca Docker Engine ile çalıştı. Bu kısıtlama, CRI standardının getirilmesiyle kaldırıldı. Standardın bir OCI uygulaması olan containerd ve CRI-O da dahil olmak üzere, herhangi bir CRI uyumlu çalışma zamanı artık Kubernetes ile kullanılabilir.
CRI, Kubernetes’e yeni bir esneklik getirirken, mevcut kümeler için bir sorun teşkil ediyordu. Docker, CRI standardı için destekten yoksundu, bu nedenle Dockershim, Kubernetes ekibinin katman uyumluluğunu en üst düzeye çıkarmak için oluşturuldu. Dockershim, her zaman geçici bir önlem olması amaçlanan Docker Engine ile doğrudan bir entegrasyondu.
Orijinal Kubernetes push to CRI’ın gösterdiği gibi, konteyner hareketi artık Docker’dan çok daha fazlası. Docker, Cloud Native Computing Foundation (CNCF) mezunu olan containerd olarak çıkarılan çalışma zamanı ile ayrı bileşenlere ayrılmıştır.
containerd, Kubernetes tarafından tam olarak desteklenir ve bulut ortamlarında bağımsız kullanım için daha uygundur. Kubernetes, Pod’larınızı çalıştırmak için Docker CLI ve onun birçok özelliğini gerektirmez; ihtiyacı olan tek şey, konteynerleri nispeten düşük bir seviyede başlatma ve çalıştırma yeteneğidir. Dockershim, bakımı zor olduğu için kaldırıldı. Kullanımı, Docker Engine’in uygulamasına sıkı sıkıya bağlı olan kırılgan kodlar yarattı.
Dockershim Kullanıp Kullanmadığınızı Kontrol Etme
Modern platformlarda yakın zamanda oluşturulan kümelerin Dockershim kullanması pek olası değildir. Buna Amazon EKS, Azure AKS, Google GKE ve DigitalOcean DOKS gibi popüler bulut sağlayıcıları tarafından yönetilen kümeler dahildir.
Kendi kümenizi koruyorsanız ve ilk olarak birkaç yıl önce kurduysanız, büyük olasılıkla harekete geçmeniz gerekecektir. Bu Kubectl komutunu çalıştırarak, Düğümlerinizden herhangi biri için çalışma zamanı olarak Dockershim kullanıp kullanmadığınızı kontrol edebilirsiniz:
$ kubectl get nodes -o wide NAME STATUS VERSION CONTAINER-RUNTIME node-1 Ready v1.22.8 docker://19.3.1 node-2 Ready v1.22.8 containerd://1.4.13
Bu örnekte, düğümlerden biri containerd kullanıyor ve olduğu gibi bırakılabilir. Diğer düğüm, Docker kullanılarak yapılandırılır ve Dockershim’in kaldırılmasından etkilenebilir. Düğümde bu komutu çalıştırarak kontrol edebilirsiniz:
$ tr \\0 ' ' < /proc/"$(pgrep kubelet)"/cmdline | grep "\-\-container\-runtime"
Düğümünüz, herhangi bir çıktı görüntülenmezse kapsayıcıları çalıştırmak için Dockershim kullanıyor. Bir miktar çıktı alırsanız, görüntülenenleri inceleyin --container-runtime-endpoint
Dockershim’in etkin olup olmadığını belirlemek için bayrak değeri. Bir çalışma zamanı uç noktası unix:///run/containerd/containerd.sock
containerd sinyalleri kullanılır, bu nedenle geçiş gerekmez.
Bir Düğümün Çalışma Zamanını Değiştirme
Dockershim kullanan düğümlerin farklı bir çalışma zamanı kullanacak şekilde güncellenmesi gerekir. Öncelikle Kubectl kullanarak Düğümün iş yüklerini boşaltın, böylece Pod’larınız kümenizdeki diğer Düğümlere yeniden planlanır. Planlanan yeni Kapsülleri durdurmak için Düğümü de kordon altına almalısınız.
$ kubectl cordon node-1 $ kubectl drain node-1 --ignore-daemonsets
Ardından, Düğümün kendisinde aşağıdaki komutları çalıştırın. Docker arka plan programını ve Düğümün Kubelet çalışan sürecini durdurarak başlayın:
$ systemctl stop kubelet $ systemctl disable docker.service --now
Artık yeni çalışma zamanınızı yükleyebilirsiniz.
containerd’ı kullanma
containerd genellikle mevcut kümeler için tercih edilen çözümdür. Docker Engine’in belirli özelliklerine güvenmiyorsanız, containerd’a geçiş yapabilmeniz gerekir. Eğer öyleyseniz, aşağıdaki bölüme gidin ve bunun yerine cri-dockerd’ı yükleyin.
Paket listeleriniz zaten içermiyorsa, Docker’ın deposunu sisteminize ekleyin. containerd, Docker’ın deposunda dağıtılır.
$ sudo apt-get update $ sudo apt-get install ca-certificates curl gnupg lsb-release $ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg $ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Containerd’yi yükleyin:
$ sudo apt update $ sudo apt install containerd
Şimdi yeni çalışma zamanını kullanmak için Düğümün Kubelet yapılandırma dosyasını güncelleyin. Açık /var/lib/kubelet/kubeadm-flags.env
. Arayın veya ekleyin --container-runtime
ve --container-runtime-endpoint
aşağıdaki değerlere sahip bayraklar:
--container-runtime=remote
--container-runtime-endpoint=unix:///run/containerd/containerd.sock
Ardından, Kubernetes kontrol düzleminde Node nesnesine karşı kaydedilen soket açıklamasını değiştirin:
$ kubectl edit node node-1
Açılan dosyada şunu bulun: kubeadm.alpha.kubernetes.io/cri-socket
ek açıklama ve olarak değiştirin unix:///run/containerd/containerd.sock
. Düğümün nesnesini güncellemek için dosyayı kaydedin ve kapatın.
Şimdi Kubelet’i yeniden başlatın:
$ systemctl start kubelet
Düğümün başlaması ve Kubernetes kontrol düzlemine bağlanması için birkaç dakika bekleyin. tekrarlayabilmelisin get nodes
komutunu verin ve containerd’in şu anda kullanıldığını görün.
$ kubectl get nodes -o wide NAME STATUS VERSION CONTAINER-RUNTIME node-1 Ready v1.22.8 containerd://1.4.13 node-2 Ready v1.22.8 containerd://1.4.13
Son olarak, Düğümün etrafına yerleştirdiğiniz kordonu çıkarın, böylece Pod’ları almaya başlayabilir:
$ kubectl uncordon node-1
cri-dockerd’ı kullanma
cri-dockerd, Docker ve Mirantis tarafından ortaklaşa geliştirilen bir çalışma zamanıdır. Dockershim’in bağımsız olarak bakımı yapılan bağımsız bir sürümüdür. Kubernetes projesini Dockershim’in bakım gereksinimleriyle sınırlamadan tanıdık işlevleri kullanmaya devam etmenizi sağlar.
Docker Engine’in kurulu olduğundan emin olun. Ardından GitHub sürümlerinden en son ikili dosyayı indirerek cri-dockerd’ı yükleyin:
$ wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.0/cri-dockerd-v0.2.0-linux-amd64.tar.gz $ tar xvf cri-dockerd-v0.2.0-linux-amd64.tar.gz $ mv cri-dockerd /usr/local/bin/
Ardından cri-dockerd’ın systemd hizmet yapılandırmalarını indirin, kurun ve etkinleştirin:
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket sudo mv cri-docker.socket cri-docker.service /etc/systemd/system/ sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service sudo systemctl daemon-reload sudo systemctl enable cri-docker.service sudo systemctl enable --now cri-docker.socket
Artık Düğümünüzün Kubelet yapılandırmasını cri-dockerd kullanacak şekilde değiştirebilirsiniz. Bu, bir Düğümün containerd kullanacak şekilde yapılandırılmasına benzer.
Açık /var/lib/kubelet/kubeadm-flags.env
. Arayın veya ekleyin --container-runtime
ve --container-runtime-endpoint
aşağıdaki değerlere sahip bayraklar:
--container-runtime=remote
--container-runtime-endpoint=unix:///var/run/cri-dockerd.sock
Ardından, Node nesnesinin soket açıklamasını değiştirin:
$ kubectl edit node node-1
Açılan dosyada şunu bulun: kubeadm.alpha.kubernetes.io/cri-socket
ek açıklama ve olarak değiştirin unix:///var/run/cri-dockerd.sock
. Düğümün nesnesini güncellemek için dosyayı kaydedin ve kapatın.
Şimdi Kubelet’i yeniden başlatın:
$ systemctl start kubelet
Birkaç dakika bekleyin ve ardından Düğümün çalıştığını kontrol etmek için Kubectl’i kullanın. Yine de Docker çalışma zamanını gösterecek, ancak şimdi Kubernetes ile entegre olan Dockershim yerine bağımsız cri-dockerd’a dayanıyor.
$ kubectl get nodes -o wide NAME STATUS VERSION CONTAINER-RUNTIME node-1 Ready v1.22.8 docker://19.3.1 node-2 Ready v1.22.8 containerd://1.4.13
Artık Düğümün etrafına yerleştirdiğiniz kordonu kaldırabilirsiniz. Pod planlama isteklerini tekrar kabul etmeye başlayacak.
$ kubectl uncordon node-1
Çözüm
Kubernetes v1.24, daha önce Docker Engine için CRI uyumluluğunu entegre eden Dockershim bileşenini kaldırdı. En son kümeler etkilenmeyecek olsa da, yeni sürüme yükseltmeden önce Dockershim kullanıp kullanmadığınızı kontrol etmelisiniz.
Geçiş yapılacak çalışma zamanı, kümenizi şu anda nasıl kullandığınıza bağlıdır. Docker özelliklerini kullanmıyorsanız, containerd genellikle iyi bir seçimdir. Docker Engine’e bağlı mevcut araçlarla uyumluluğu korumanız gerekiyorsa, Dockershim benzeri entegrasyonu geri getirmek için cri-dockerd’ı kullanabilirsiniz. Bu, Docker arka plan programı soketini (/var/run/docker.sock
) Docker-in-Docker iş akışlarını güçlendirmek için kapsayıcılarınıza ekleyin.
Dockershim’in kaldırılması, kapsayıcı görüntülerini oluşturma ve kullanma şeklinizi etkilemez. Kubernetes ile oluşturulan görüntüleri hala çalıştırabilir docker build
ve desteklenen tüm çalışma zamanlarıyla uyumludurlar. CRI çalışma zamanları, Docker ve diğer görüntü oluşturucuların çıktısı olarak herhangi bir OCI biçimli görüntüyle çalışır.