Kubernetes job really successful complete? | “set pipefail”

Kubernetes üzerinde cronjob oluşturuyor ve zamanı geldiğinde çalıştırıyoruz. Düşünün ki, mysql dump aldırıyorsunuz, dump gzipleniyor ve s3’e gönderiliyor. Fakat job içerisinde ” | ” kullandığımızda bir hata olsa da job complated oluyor. Sağlıklı bir backup alıyor muyuz sorusunu ararken basit bir çözümle ilerleyelim istedik.

Backuplar için cronjob kullanıyoruz ve backup to s3 veya tam tersi yönde restore işlemi gerçekleştiriyoruz. Bu süreçlerin makalelerini inceleyebilirsiniz;

Öncelikle genel yapıya bir göz atalım. Basit bir cronjob yaratalım;

k -n backup-restore create cronjob k8s-pipefail-job --image=busybox --schedule="*/1 1 1 * *" -- sh -c "echo test"

Oluşturulan cronjob’ı editlediğimizde içeriği aşağıdaki gibi;

        spec:
containers:
- command:
- sh
- -c
- echo test
image: busybox
imagePullPolicy: Always
name: k8s-pipefail-job
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: OnFailure

Cronjob’ı job olarak çalıştırdığımızda ise görev tamamlanıyor. Aynı zamanda logları incelerseniz başarılı çalıştığını gözlemleyebilirsiniz;

output;
backup-restore/k8s-pipefail-job2-bqkml[k8s-pipefail-job1]: test

Şimdi cronjob’ı editleyelim ve hata vermesini isteyelim. Sırası ile bir dosya oluşturacak, dosyayı kopyalayacak, olmayan bir dosyayı kopyalamaya çalışacak;

containers:
- command:
- sh
- -c
- echo test | touch dosya1 | cp dosya1 dosya1cp | cp dosya2 dosya2cp | echo done

Gördüğünüz gibi jobın oluşturduğu podun hata verdiğini görsek bile pod completed oldu. Bu durum iş akışında bizi yanıltabilir.

Çözüm;

Daha önce bash scriptlerde belki pipefail tanımlamasını görmüşsünüzdür; https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail

Biz cronjob’ı editleyip aşağıdaki gibi düzenlemeyi yapalım.

containers:
- command:
- sh
- -c
- |
set -euo pipefail

echo test | touch dosya1 | cp dosya1 dosya1cp | cp dosya2 dosya2cp | echo done

ve job oluşturalım;

Beklediğimiz gibi bir sonuçla karşılaştık. Artık aradaki pipe içerisinde bir işlem hata verirse job error olarak işaretleniyor. Bu da iş akış süreçlerinde doğruluğu sağlamada yardımcı oluyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.