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/