Her sistemde olduğu gibi Kubernetes’te logları takip etmek oldukça önemlidir. Monitör etme, debug etme gibi çok temel işlevlerine yerine getirebiliyor olmak hayat kurtarıcıdır. Kubernetes’te log üretilen yapılar şöyledir:
- Pod
- Container
- Kubernetes bileşenleri
- Daemon Set
- Kubernetes servisleri
Oluşan loglara Kubernetes API ile erişilebiliyor.
Loglama Yapıları
Loglama yapıları ikiye ayrılır: Node Level ve Cluster Level.
Node Level Loglama
Node’larda container veya Pod’lardaki loglar stdout ve stderr dosyalarına yazılır. Bu loglar istenirse container engine’de konfigüre edilebilen bir yere (dosyaya) gönderilebilirler.
Node seviyesindeki loglara kubectl logs komutu kullanılarak Kubelet üzerinden ulaşılabilir. Ayrıca log rotation’a dikkat etmek önemlidir.
Cluster Level
Cluster içindeki tüm loglara erişim için Kubernetes tarafından sağlanan bir yöntem yok. Buna çözüm olarak Log Processor / Forwarder yapıları kullanılıyor.
Side-car Container Yapısı: Yancı olarak tabir ediliyor. Temelde bir pod içerisine bir container yerleştirildiğinde bununla birlikte Side-car Container da yerleştirilir ve bu container logları toplayarak merkezi bir sisteme logları yazar.
Node-level Logging Agent Yapısı: Bu yapıda Node üzerinde bir Agent Pod ayağa kaldırılır ve Pod’lardan stderr veya stdout dosyalarına yazılan logları toplar ve merkezi bir sisteme logları yazar.
Merkezi log toplama ve yazıldığı yapıda genelde ELK (ElasticSearch – Kibana – Logstash) veya Fluentd tercih ediliyor.
Loglama Örnek
Örnek bir loglama yapısı için şöyle bir YAML dosyası geliştirebilyoruz:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Pod metadata: name: logger-pod namespace: logging-ns spec: containers: - name: logger-container image: centos:7 command: - "bin/bash" - "-c" - "while true; do echo $(date) | tee /dev/stderr; sleep 1; done" |
Önce YAML dosyamızdaki logging-ns isimli namespace’imizi oluşturalım.
1 |
kubectl create ns logging-ns |
YAML dosyamızı kullanarak declarative şekilde Pod’umuzu yaratalım.
1 |
kubectl create -f logger.yaml |
Namespace’deki Pod’ları listeleyelim.
1 |
kubectl get pods --namespace=logging-ns |
Pod’umuzun detaylarına bakalım.
1 |
kubectl describe pod logger-pod --namespace=logging-ns |
Loglarını inceleyelim
1 2 |
kubectl logs -n logging-ns --tail=5 logger-pod -c logger-container kubectl logs -f -n logging-ns --since=10s logger-pod -c logger-container |
Burada tabii sadece date bilgisini yazdırıyoruz, ihtiyaca yönelik bunu ayarlamak gerekiyor.