OpenStack’te Kubespray ile Kubernetes Cluster Kurulumu
Bu yazı, Kubespray ile OpenStack’te bir Kubernetes cluster kurarken size yol göstermesi amacıyla yazılmıştır ve altyapısında OpenStack kullanılan SkyAtlas projesi üzerinden anlatılmıştır. Kubespray, ortam kurulumu için Terraform’u ve Kubernetes’in otomatik kurulumu için Ansible’ı kullanmaktadır.
Dizini kubernetes_cluster olarak değiştirir ve şu yazıdaki talimatları izlerseniz Kubernetes dağıtımı için özel bir sanal ortam oluşturmuş olursunuz.
Terraform apply komutunu çalıştırdıktan sonra, aşağıdaki gibi bir çıktı almalısınız:
Bu çıktı size Bastion node’un genel IP’sini ve Kubernetes cluster tarafından kullanılan sanal alt ağ (subnet) kimliğinizi gösterir.
Şimdi, Bastion node’una giriş yapmalıyız. Kubespray çeşitli kurulum seçenekleriyle birlikte gelir. Burada kullandığımız seçenek, yönetmek için yalnızca Bastion node’undan erişilebilen bir cluster oluşturmaktır. Bastion node’unda oturum açmak için Terraform kurulumunda kullandığınız ssh-key’e ihtiyacınız var.
Sonrasında repo root klasörüne giderek, örnekten yeni bir altyapı kopyalarız
$ cd kubespray/
$ cp -rfp inventory/sample inventory/mycluster
ve requirements’ı kurarız.
$ pip install — user -r requirements.txt
Gitlab CI entegrasyonu
Repomuzun root dizininde, GitLab Runner’da komut dosyalarını çalıştırmaktan sorumlu olan, .gitlab-ci.yml adlı özel bir YAML dosyası var.
Bu dosyayı Gitlab CI ile tetiklerseniz, GitLab Runner yukarıdaki adımları otomatik olarak çalıştırır ve her şey planlandığı gibi giderse Bastion node’unuza giriş yapabilir ve aşağıdaki adımlara devam edebilirsiniz.
Şimdi Ansible için envanter dosyasını düzenlemeliyiz. OpenStack API istemciniz yoksa, SkyAtlas Dashboard’a giriş yaparak, Compute / Instances altında Kubernetes node’larınızı ve onların IP adreslerini bulabilirsiniz.
Inventory dosyamızı düzenliyoruz:
$ vim inventory/mycluster/inventory.ini
Aşağıdaki gibi görünmeli:
Şimdi all.yaml dosyasında cloud_provider seçeneğini OpenStack olarak ayarlamamız gerekiyor:
$ vim inventory/mycluster/group_vars/all/all.yml
Tüm Kubernetes cluster node’larına yalnızca Terraform kurulumunda kullandığımız ssh-key ile erişilebilir, ancak Bastion node dışında kalanlara yalnızca kendi ağlarından erişilebilir. Bu nedenle, özel ssh-key’i Bastion node’unuza ~/.ssh/id_rsa olarak ekleyin (Elbette dosya için başka bir yol (path) kullanabilirsiniz. Bu durumda, Ansible yapılandırmanızı değiştirmeniz veya private-key= opsiyonlarından kullanmanız gerekir.) ve ana makinelerinizi ve envanter dosyalarınızı doğru bir şekilde düzenleyin. Böyle Ansible, diğer Kubernetes node’larına erişebilir.
Kubespray, RC dosyasından ortam değişkenlerinize ihtiyaç duyar.
RC dosyasını nasıl alacağınızı burada görebilirsiniz. Bastion node’undaki RC dosyasını source ettikten sonra, Ansible ile Kubernetes cluster kurmaya hazırsınız.
Her şey planlandığı gibi giderse, aşağıdaki sonucu görmelisiniz:
Bastion node’una koyduğunuz özel anahtar ile Kubernetes node’larınızı SSH yapabilirsiniz. Tüm master node’larda/etc/kubernetes/cloud_config dosyasındaki LoadBalancer bölümüne subnet-id ve floating-network-id ekleyin. cloud_config dosyanızın şöyle görünmesi gerekir:
Eğer OpenStack API istemciniz kurulu değilse, subnet-id ve floating-network-id’yi SkyAtlas panelinden alabilirsiniz.
Cluster statüsünü kontrol edelim:
Şimdi test edelim!
Elimde test amaçlı kullanacağım Docker imajı var ve onu Kubernetes LoadBalancer servisiyle birlikte kullanabiliriz. Kubia, HTTP isteklerini kabul edecek ve içinde çalıştığı makinenin hostname’iyle yanıt verecek basit bir node.js imajıdır.
Service bölümünde yer alan kubia.yaml dosyasını düzenleyelim ve “THE_FLOATING_NETWORK_ID”yi “loadbalancer.openstack.org/floating-network-id:” satırından itibaren değiştirelim.
Dosyadan pod’lar ve servisler oluşturalım:
$ kubectl create -f kubia.yaml
Son durumda, kubia uygulaması aşağıdaki gibi 3 pod üzerinde çalışmalı ve bu 3 pod farklı worker node’lara kurulmuş olmalı:
Kubia.yaml dosyası, Kubernetes servisi ile kubia uygulamasını ortaya çıkarır. Servis, SkyAtlas üzerinde otomatik olarak bir LoadBalancer oluşturur.
Bu servise genel IP’si üzerinden bağlanıldığında, rastgele bir pod seçilir ve ardından bu bağlantıya ait ağ paketlerinin tümü o pod’a gönderilir. Yeni bir bağlantı olursa, bu yeni trafik bir sonraki pod’a gider.
Artık uygulamaya farklı bağlantılarla ulaşmayı her denediğinizde, sıradaki diğer pod yanıt verecektir.