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.kubeconfigher zaman bir kaçış yoludur; yerini bilmek krizde hayat kurtarır. - Kritik RBAC kaynaklarının düzenli yedeği alınmalı.
--validate=falseyalnı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.