TL; DR
- Konteynerlerin ve mikro hizmetlerin yüksek gözlemlenebilirliğine ulaşmak için günlükler ve birincil ölçümler yeterli değildir.
- Daha hızlı kurtarma ve daha fazla esneklik için uygulamaların Yüksek Gözlenebilirlik İlkesini (HOP) uygulaması gerekir.
- Uygulama düzeyinde NOP şunları gerektirir: uygun günlük kaydı, yakın izleme, akıl sağlığı kontrolleri ve performans/geçiş takibi.
- NOR'un bir unsuru olarak çekleri kullanın hazırlıkSondası и canlılık Sondası Kubernet'ler.
Durum Denetimi Şablonu nedir?
Görev açısından kritik ve yüksek düzeyde kullanılabilir bir uygulama tasarlarken hata toleransı gibi bir hususu düşünmek çok önemlidir. Bir uygulama, hatadan hızlı bir şekilde kurtulursa hataya dayanıklı olarak kabul edilir. Tipik bir bulut uygulaması, her bileşenin ayrı bir konteynere yerleştirildiği bir mikro hizmet mimarisini kullanır. Ve bir küme tasarlarken k8s üzerindeki uygulamanın yüksek oranda kullanılabilir olduğundan emin olmak için belirli kalıpları takip etmeniz gerekir. Bunların arasında Sağlık Kontrolü Şablonu da bulunmaktadır. Uygulamanın k8'lere sağlıklı olduğunu nasıl bildireceğini tanımlar. Bu yalnızca bölmenin çalışıp çalışmadığına ilişkin bilgi değil, aynı zamanda istekleri nasıl alıp yanıtladığıyla da ilgilidir. Kubernetes, kapsülün durumu hakkında ne kadar çok şey bilirse, trafik yönlendirme ve yük dengeleme konusunda o kadar akıllı kararlar alır. Böylece Yüksek Gözlenebilirlik Prensibi, uygulamanın taleplere zamanında yanıt vermesini sağlar.
Yüksek Gözlemlenebilirlik Prensibi (HOP)
Yüksek gözlemlenebilirlik ilkesi aşağıdakilerden biridir:
İyi tasarlanmış bir bulut uygulaması, ana olaylarını standart I/O akışları STDERR ve STDOUT'u kullanarak günlüğe kaydeder. Daha sonra, günlükleri merkezi bir izleme sistemine (örneğin Prometheus) ve bir günlük toplama sistemine (ELK yazılım paketi) ileten filebeat, logstash veya fluentd gibi bir yardımcı hizmet gelir. Aşağıdaki şemada bir bulut uygulamasının Sağlık Testi Modeli ve Yüksek Gözlenebilirlik Prensibine göre nasıl çalıştığı gösterilmektedir.
Kubernetes'te Sağlık Kontrolü Deseni nasıl uygulanır?
Kutunun dışında k8s, denetleyicilerden birini kullanarak bölmelerin durumunu izler (
Örneğimizde k8s bunu yapar işlevsellik kontrolü. Bu doğrulama türünde kubelet, konteynerdeki sürecin durumunu sürekli olarak kontrol eder. Sürecin durduğunu anladığında yeniden başlatacaktır. Hata, uygulamanın yeniden başlatılmasıyla çözülebiliyorsa ve program herhangi bir hata durumunda kapatılacak şekilde tasarlanmışsa, NOP'u ve Sağlık Testi Modelini takip etmek için ihtiyacınız olan tek şey bir süreç sağlık kontrolüdür. Tek üzücü şey, yeniden başlatmayla tüm hataların ortadan kaldırılmamasıdır. Bu durumda k8s, bölmeyle ilgili sorunları tespit etmek için 2 daha derin yol sunar:
Canlılık Probu
Zamanı geldi canlılık Sondası kubelet 3 tür kontrol gerçekleştirir: yalnızca bölmenin çalışıp çalışmadığını belirlemekle kalmaz, aynı zamanda istekleri almaya ve bunlara yeterince yanıt vermeye hazır olup olmadığını da belirler:
- Pod'a bir HTTP isteği ayarlayın. Yanıt, 200 ila 399 aralığında bir HTTP yanıt kodu içermelidir. Bu nedenle, 5xx ve 4xx kodları, işlem çalışıyor olsa bile bölmenin sorun yaşadığının sinyalini verir.
- Bölmeleri HTTP dışı hizmetlerle (örneğin Postfix posta sunucusu) test etmek için bir TCP bağlantısı kurmanız gerekir.
- Bir bölme için (dahili olarak) isteğe bağlı bir komut yürütün. Komut tamamlama kodu 0 ise kontrol başarılı kabul edilir.
Bunun nasıl çalıştığına bir örnek. Bir sonraki pod tanımı, HTTP isteklerinde 500 hatası atan bir NodeJS uygulamasını içeriyor.Böyle bir hata alındığında konteynerin yeniden başlatıldığından emin olmak için livenessProbe parametresini kullanıyoruz:
apiVersion: v1
kind: Pod
metadata:
name: node500
spec:
containers:
- image: magalix/node500
name: node500
ports:
- containerPort: 3000
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 5
Bu diğer pod tanımlarından farklı değil ama bir nesne ekliyoruz .spec.containers.livenessProbe
... Parametre httpGet
HTTP GET isteğinin gönderildiği yolu kabul eder (örneğimizde bu /
, ancak savaş senaryolarında şöyle bir şey olabilir /api/v1/status
). Başka bir livenessProbe bir parametre kabul ediyor initialDelaySeconds
doğrulama işlemine belirli bir saniye kadar beklemesi talimatını verir. Gecikme gereklidir çünkü konteynerin başlaması için zamana ihtiyacı vardır ve yeniden başlatıldığında bir süreliğine kullanılamayacaktır.
Bu ayarı bir kümeye uygulamak için şunu kullanın:
kubectl apply -f pod.yaml
Birkaç saniye sonra aşağıdaki komutu kullanarak bölmenin içeriğini kontrol edebilirsiniz:
kubectl describe pods node500
Çıktının sonunda bulun
Gördüğünüz gibi livenessProbe bir HTTP GET isteği başlattı, kapsayıcı 500 hatası oluşturdu (bu, yapmaya programlandığı şeydi) ve kubelet bunu yeniden başlattı.
NideJS uygulamasının nasıl programlandığını merak ediyorsanız işte kullanılan app.js ve Dockerfile:
uygulama.js
var http = require('http');
var server = http.createServer(function(req, res) {
res.writeHead(500, { "Content-type": "text/plain" });
res.end("We have run into an errorn");
});
server.listen(3000, function() {
console.log('Server is running at 3000')
})
Dockerfile
FROM node
COPY app.js /
EXPOSE 3000
ENTRYPOINT [ "node","/app.js" ]
Şunu unutmamak önemlidir: livenessProbe yalnızca başarısız olursa kabı yeniden başlatır. Yeniden başlatma, konteynerin çalışmasını engelleyen hatayı düzeltmezse kubelet, sorunu düzeltmek için harekete geçemeyecektir.
hazırlıkSondası
readinessProbe, sorun giderme eylemleri dışında livenessProbes'a (GET istekleri, TCP iletişimleri ve komut yürütme) benzer şekilde çalışır. Arızanın tespit edildiği konteyner yeniden başlatılmaz ancak gelen trafikten izole edilir. Container'lardan birinin çok fazla hesaplama yaptığını veya ağır yük altında olduğunu, bunun da yanıt sürelerinin artmasına neden olduğunu düşünün. LivenessProbe durumunda, yanıt kullanılabilirliği kontrolü tetiklenir (timeoutSeconds kontrol parametresi aracılığıyla), ardından kubelet konteyneri yeniden başlatır. Konteyner başlatıldığında yoğun kaynak gerektiren görevleri gerçekleştirmeye başlar ve yeniden başlatılır. Bu, yanıt hızı gerektiren uygulamalar için kritik olabilir. Örneğin, bir araba yoldayken sunucudan yanıt bekler, yanıt gecikir ve araba kaza yapar.
GET isteği yanıt süresini iki saniyeyi geçmeyecek şekilde ayarlayacak ve uygulamanın GET isteğine 5 saniye sonra yanıt verecek bir redinessProbe tanımı yazalım. Pod.yaml dosyası şu şekilde görünmelidir:
apiVersion: v1
kind: Pod
metadata:
name: nodedelayed
spec:
containers:
- image: afakharany/node_delayed
name: nodedelayed
ports:
- containerPort: 3000
protocol: TCP
readinessProbe:
httpGet:
path: /
port: 3000
timeoutSeconds: 2
Kubectl ile bir pod konuşlandıralım:
kubectl apply -f pod.yaml
Birkaç saniye bekleyip, hazırlık Probunun nasıl çalıştığını görelim:
kubectl describe pods nodedelayed
Çıktının sonunda bazı olayların benzer olduğunu görebilirsiniz.
Gördüğünüz gibi kubectl, kontrol süresi 2 saniyeyi aştığında pod'u yeniden başlatmadı. Bunun yerine isteği iptal etti. Gelen iletişimler diğer çalışan bölmelere yönlendirilir.
Pod'un yükü kaldırıldığı için kubectl'in istekleri tekrar ona yönlendirdiğini unutmayın: GET isteklerine verilen yanıtlar artık gecikmez.
Karşılaştırma için değiştirilmiş app.js dosyasını aşağıda bulabilirsiniz:
var http = require('http');
var server = http.createServer(function(req, res) {
const sleep = (milliseconds) => {
return new Promise(resolve => setTimeout(resolve, milliseconds))
}
sleep(5000).then(() => {
res.writeHead(200, { "Content-type": "text/plain" });
res.end("Hellon");
})
});
server.listen(3000, function() {
console.log('Server is running at 3000')
})
TL; DR
Bulut uygulamalarının ortaya çıkmasından önce günlükler, uygulama sağlığını izlemenin ve kontrol etmenin birincil aracıydı. Ancak herhangi bir düzeltici önlem alma olanağı yoktu. Günlükler günümüzde hala kullanışlıdır; acil durumları analiz etmek ve karar vermek için toplanıp bir günlük toplama sistemine gönderilmeleri gerekir. [Bütün bunlar örneğin monit kullanan bulut uygulamaları olmadan yapılabilirdi, ancak k8s ile bu çok daha kolay hale geldi :) – editörün notu. ]
Günümüzde düzeltmelerin neredeyse gerçek zamanlı olarak yapılması gerekiyor, dolayısıyla başvuruların artık kara kutular olması gerekmiyor. Hayır, gerektiğinde anında yanıt verebilmeleri için izleme sistemlerinin süreçlerin durumu hakkında değerli verileri sorgulamasına ve toplamasına olanak tanıyan uç noktaları göstermeleri gerekir. Buna, Yüksek Gözlemlenebilirlik İlkesini (HOP) izleyen Performans Testi Tasarım Modeli adı verilir.
Kubernetes varsayılan olarak 2 tür durum denetimi sunar: readinessProbe ve livenessProbe. Her ikisi de aynı kontrol türlerini kullanır (HTTP GET istekleri, TCP iletişimleri ve komut yürütme). Bölmelerdeki sorunlara yanıt olarak aldıkları kararlarda farklılık gösterirler. livenessProbe, hatanın tekrarlanmayacağı umuduyla kapsayıcıyı yeniden başlatır ve readinessProbe, sorunun nedeni çözülene kadar bölmeyi gelen trafikten yalıtır.
Doğru uygulama tasarımı her iki kontrol türünü de içermeli ve özellikle bir istisna atıldığında yeterli veri toplandığından emin olmalıdır. Ayrıca izleme sistemine (Prometheus) önemli sağlık ölçümlerini sağlayan gerekli API uç noktalarını da göstermelidir.
Kaynak: habr.com