Java'da kendi Kubernetes denetleyicinizi geliştirin, denemek ister misiniz?

Yazar | Nicolas Fränkel

Çevirmen | Tanrı sıkı çalışmayı ödüllendirir, sorumlu editör | Xu Weilong

Mühür görüntüsü | Görsel Çin'de CSDN indirme

Bu yazıda kendi Kubernetes denetleyicimizi geliştirmeye başlayacağız.

Teknoloji yığını Python, NodeJS veya Ruby olabilir. Bu blogun adı "Java Geek" olduğundan, Java'yı seçmek normaldir.

Bir kullanım örneği olarak, sepet modunu uygulayacağız: bir kapsül planlandığında, sepet bölmesi de programlanacaktır. Birincisi silinirse, ikincisi de silinmelidir.

Doğru aracı seçin

Java'da REST çağrıları gerçekleştirmek için önce bağlamaların oluşturulması gerekir. Bunu yapmanın birkaç yolu var. En zahmetli işlem, bu işlemi manuel olarak gerçekleştirmektir: olası tüm JSON istek ve yanıt kombinasyonlarını dikkatlice yönetmeniz, ilgili Java nesnelerini geliştirmeniz, bir JSON serileştirme çerçevesi ve bir HTTP istemcisi seçmeniz gerekir. İkinci en iyi seçenek, Swagger (https://swagger.io/) veya Apiary (https://apiary.io/) gibi özel bir kod oluşturucu kullanmaktır. Bu, API sağlayıcısının modeli olası bir formatta sağlamasını gerektirir. Olumsuz yanı, ilgili araçları kullanmanız gerektiğidir. Bazen format, OpenAPI spesifikasyonu (https://swagger.io/specification/) gibi aşağı yukarı açıktır. Bu durumda, biçimi uygulayan araçlardan bir araç seçebilirsiniz. En iyi durumda, bağlama sağlanmış olabilir.

Kubernetes için durum budur: Proje, çeşitli diller için kendi bağlamalarını sağlar (https://kubernetes.io/docs/reference/using-api/client-libraries/). Sorun, dil sarmalayıcısının REST API'ye çok yakın olması ve bu da yazara çok aşina. Örneğin, tüm ad alanlarında tüm bölmeleri şu şekilde listeleyebilirsiniz:

ApiClient istemcisi = Config.defaultClient;

CoreV1Api core = new CoreV1Api (istemci);

V1PodList kapsülleri =

core.listPodForAllNamespaces (,,,,,,,);

Not: Tüm parametrelerin geçilmesi gerekir.

Bu, "sarmalayıcı kodu REST API'ye çok yakın" anlamına gelir. Neyse ki başka bir seçenek daha var. Fabric8 organizasyonu, Github'da sorunsuz bir Java API'si sağlar. Yukarıdaki koda eşdeğer kod:

KubernetesClient client = yeni DefaultKubernetesClient;

PodList pods = client.pods.inAnyNamespace.list;

Not: Gereksiz parametrelerin geçmesine gerek yoktur.

Fabric8 kuruluşu, Github'da sorunsuz bir Java API'si sağlar:

https://github.com/fabric8io/kubernetes-client)

Fabric8'e hızlı genel bakış

Basitçe ifade etmek gerekirse, Fabric8'in API'sini kullanarak tüm Kubernetes kaynakları KubernetesClient örneğinde kullanılabilir, örneğin:

  • client.namespaces

  • müşteri Hizmetleri

  • client.nodes

Kaynağın niteliğine göre, kapsamı bir ad alanı olabilir veya olmayabilir:

  • client.pods.inAnyNamespace

  • client.pods.inNamespace ("ns")

Bu noktada, bu eylemi adlandırabilirsiniz:

Tüm ad alanlarında tüm Bölmeleri listeleyin:

client.pods.inAnyNamespace.list;

Ns ad alanındaki tüm bölmeleri silin:

client.pods.delete (client.pods.inNamespace ("ns"). list.getItems);

Ns adında yeni bir ad alanı oluşturun:

client.namespaces .Yeni oluşturmak .withApiVersion ("v1") .withNewMetadata .withName ("ns") .endMetadata .done;

Kontrol döngüsünü uygulayın

Kubernetes denetleyicisinin yalnızca bir kontrol döngüsü olduğunu, kümenin durumunu izlediğini ve onu istenen durumla koordine ettiğini unutmayın. Olayları planlayabilmek / silebilmek için Gözlemci modu gereklidir. Uygulama bu tür olaylara abone olacak ve meydana geldiklerinde ilgili geri aramalar tetiklenecektir.

Aşağıdaki şekil çok basit bir API diyagramıdır:

Bir izleme programını gerçekten uygulamak için, yalnızca aşağıdaki kod satırlarını çalıştırmanız gerekir:

kamu sınıfı DummyWatcher Watcher'ı uygular < Bölme > {

@Override

public void eventReceived (Eylem eylemi, Kapsül kapsülü) {

switch (eylem) {

durum EKLENDİ: // Not 1

kırmak;

case MODIFIED: // Not 2

kırmak;

vaka SİLİNMİŞ: // Not 3

kırmak;

case ERROR: // Not 4

kırmak;

}

}

@Override

public void onClose (KubernetesClientException nedeni) {

// Not 5

}

}

client.pods

.inAnyNamespace

.watch (DummyWatcher);

Not:

  • Yeni bir bölme eklerken çalışır

  • Mevcut bölmeleri değiştirirken çalışır

  • Bölme silindiğinde çalışır

  • Bir hata oluştuğunda çalışır

  • Kaynakları temizleyin. Müşteri düzgün kapatılırsa, neden

  • detaylar

    Artık sepet modelini uygulamak için gereken her şeye sahibiz. Kodun tamamını göstermeyeceğim, GitHub'da bulunabilir: https://github.com/nfrankel/jvm-controller, ancak bazı önemli içeriğin vurgulanması gerekiyor.

    1) Sepeti işaretleyin

    Esasen, gözlemcinin yeni bir bölme eklerken bir sepet bölmesi eklemesi ve onu çıkarırken silmesi gerekir. Bu temel yöntem işe yaramaz: Bir sepet bölmesi planlanmışsa, gözlemci tetiklenecek ve sepete yeni bir sepet bölmesi eklenecektir. Ve bu durum devam edecek. Bu nedenle, sepet bölmesini işaretlemek çok önemlidir. Böyle bir bölme algılandığında, oluşturma mantığı tetiklenmemelidir.

    Sepet bölmelerini işaretlemenin birkaç yolu vardır:

    • Sepet bölmesinin adından sonra, sepet gibi belirli bir dize ekleyin

    • Aşağıdaki belirli etiketleri ekleyin:

    client.pods

    .inNamespace ("ns")

    .Yeni oluşturmak

    .withNewMetadata

    .addToLabels ("sepet", "doğru")

    .endMetadata

    .done;

    2) Sepeti bölmeyle birlikte çıkarın

    Bölmenin yalnızca bir sepeti olmalıdır. Yukarıda belirtildiği gibi, Bölme eklendiğinde oluşturulmalı ve ikincisi silindiğinde silinmelidir.

    Bu nedenle, sepete ana bölmeye bir referans eklenmelidir. Böylelikle pod silindiğinde eğer sepet değilse tahsis edilen sepetini bulup silmeliyiz.

    İlk basit yöntem, ana bölmeyi silerken sepeti açıkça silmektir. Ancak bu, çok zaman alan zorlu bir görevdir. Kubernetes, bir kapsülün yaşam döngüsünün başka bir kapsülün yaşam döngüsüne bağlanmasına izin verir. Ardından silme mantığı Kubernetes'in kendisi tarafından işlenir. Bu, ownerReference konseptiyle desteklenir.

    API, uygulamayı kolaylaştırır:

    client.pods

    .inNamespace ("ns")

    .Yeni oluşturmak

    .withNewMetadata

    .addNewOwnerReference

    .withApiVersion ("v1")

    .withKind ("Kapsül")

    .withName (podName)

    .withUid (pod.getMetadata.getUid)

    .endOwnerReference

    .endMetadata

    .done;

    3) Daima bir sepet bulundurun

    Bir sepet eklemek, sonsuza kadar bu şekilde kalacağı anlamına gelmez. Örneğin, dağıtıma ait olan bölmeleri silebilirsiniz. Konuşlandırmanın amacı, gerekli sayıda kopyayı elde etmek için bir bölmeyi yeniden oluşturmaktır.

    Benzer şekilde, sepet ana bölmeyi tutarken silinirse, doğru referansla yeni bir sepet oluşturulmalıdır.

    sonuç olarak

    Bu makalede, Java dilini kullanarak JVM üzerinde bir Kubernetes denetleyicisinin nasıl uygulanacağını açıklıyoruz. Fabric8 API'nin yardımıyla işlem çok basittir . Ana sorun, programlama / silme mantığındaki aşırı durumlardan kaynaklanmaktadır. Bu serinin bir sonraki (ve son) makalesinde, nihayet kodun nasıl dağıtılacağını ve çalıştırılacağını göreceğiz.

    Bu makalenin tam kaynak kodu Github'da Maven formatında bulunabilir:

    https://github.com/nfrankel/jvm-controller

    Umarım bu makale sizin için yararlıdır, yorum alanında bizimle görüşmeye hoş geldiniz.

    Orijinal: https://blog.frankel.ch/your-own-kubernetes-controller/2/

    Wechat, "dağıtım" işlevini küçük bir aralıkta başlattı; Luo Yonghao, Douyin ile özel bir sözleşme yaptığını duyurdu; Github sayfaları, ortadaki adam saldırısıyla karşılaşabilir | Geek Headlines
    önceki
    On milyonlarca ölçek kategorisi sınıflandırma teknolojisini destekleyen Baidu Feida, endüstriyel düzeyde bir derin öğrenme çerçevesi tanımlıyor
    Sonraki
    Biz programcılar yazılım geliştirmeyi neden ciddiye almıyoruz?
    Dürüstlük ve saygı: Profesyonel güçlerle salgınla mücadeleye yardımcı olmak
    Kar yağıyor! Liaocheng'in Guanxian İlçesindeki on bin dönüm armut çiçeği tarlaları kaplayarak tamamen çiçek açmış durumda (Fotoğraflar)
    Qingdao Havaalanındaki tıbbi araştırma kabinini 48 saat içinde inşa edin! Çin İnşaat Sekizinci Bürosu Dördüncü Şirket Demir Ordu Savaş Salgını
    Hava sınıfı "Binzhou Modu"! 150 milyon sayfa görüntülemenin arkasında bir dizi terleme sayısı var
    Dün gece "çizin"! 10 milyon! ilk! Jackpot burada ...
    İşe yeniden başladıktan sonra, yavaş yavaş "toparlandı" ve Xiangtan'daki iki kitapçı ve kitap pazarında dolaştı.
    Ulaştırma Bakanlığı: Ulaştırma ekonomik operasyonu Ocak ayından Şubat ayına kadar daha büyük bir düşüş baskısıyla karşılaşacak
    Qingming, "Vale Hizmeti" ni başlatmak için Nanning, Guangxi'ye geliyor.
    Tongling, Anhui: Doğru zamanda bahar çayı toplamak
    Komik: Vurmanın, düşürmenin ve yıkamanın anlamı nedir?
    Ödemek? reklam? Bağış? Açık kaynak yazılımı nasıl canlı tutabilirim?
    To Top