Bir sabah kubectl get nodes komutu Forbidden hatasıyla döndü. Cluster ayaktaydı ama API'ye hiçbir şekilde erişemiyordum. Sebep: cluster-admin ClusterRole ve ona bağlı ClusterRoleBinding bir şekilde kaybolmuştu.

Sorunun teşhisi

İlk olarak admin yetkisinin gerçekten gidip gitmediğini doğruladım. Normal kubeconfig ile her komut Forbidden veriyordu. Çözüm, control plane üzerindeki ham admin kimlik bilgisine doğrudan erişmekten geçti:

sudo kubectl --kubeconfig /etc/kubernetes/admin.kubeconfig get clusterrole cluster-admin

Bu komut da boş döndü — yani rol tamamen yoktu.

Sağlıklı cluster'dan kaynak çıkarma

Elimde aynı sürümde sağlıklı çalışan başka bir cluster vardı. Oradan ilgili kaynakları export ettim:

kubectl get clusterrole cluster-admin -o yaml > cluster-admin-role.yaml
kubectl get clusterrolebinding cluster-admin -o yaml > cluster-admin-binding.yaml

resourceVersion, uid ve creationTimestamp gibi cluster'a özgü alanları temizledim.

Bozuk cluster'a uygulama

Admin kubeconfig'i kullanarak ve şema doğrulamasını atlayarak kaynakları geri yükledim:

sudo kubectl --kubeconfig /etc/kubernetes/admin.kubeconfig \
  apply -f cluster-admin-role.yaml --validate=false
sudo kubectl --kubeconfig /etc/kubernetes/admin.kubeconfig \
  apply -f cluster-admin-binding.yaml --validate=false

Birkaç saniye sonra normal kubeconfig ile kubectl get nodes yeniden çalışmaya başladı.

Çıkarılan dersler

  • Control plane üzerindeki admin.kubeconfig her zaman bir kaçış yoludur; yerini bilmek krizde hayat kurtarır.
  • Kritik RBAC kaynaklarının düzenli yedeği alınmalı.
  • --validate=false yalnızca acil kurtarmada, ne yaptığını bilerek kullanılmalı.

Bu yazı gerçek bir olaydan damıtılmıştır. Kendi ortamınızda uygulamadan önce yedek aldığınızdan emin olun.