معمای timeout در Kubernetes API؛ سه bug در سه لایه از GKE تا Linux kernel

چرا مهم است

اگر تو هم با timeout در Kubernetes API روبه‌رو بشی، این پرونده نشان می‌ده مشکل لزوماً از workload تو نیست. یک نشانه مشترک می‌تونه از چند لایه بیاد و حتی ابزارهای سیستمی و دسترسی بیرونی رو هم درگیر کنه.

قبل از خواندن، این‌ها را بدان۴ مفهوم
Control Plane

بخش مدیریتی Kubernetes که وضعیت cluster را مدیریت می‌کند و از طریق API امکان مشاهده و تغییر منابع را فراهم می‌کند.

بیشتر درباره این مفهوم

Conntrack

سازوکار Linux برای نگهداری وضعیت اتصال‌های شبکه؛ اطلاعات اتصال‌ها در جدولی با ظرفیت محدود ثبت می‌شود.

بیشتر درباره این مفهوم

Packet Capture

ثبت بسته‌های عبوری از یک نقطه شبکه برای بررسی مسیر ارتباط، پاسخ‌ها و خطاهای احتمالی.

بیشتر درباره این مفهوم

TCP Handshake

فرایند آغاز اتصال TCP که معمولاً با تبادل SYN، سپس SYN-ACK و در پایان ACK انجام می‌شود.

بیشتر درباره این مفهوم

گزارش Google Cloud از یک پرونده پشتیبانی در ژانویه ۲۰۲۶، با نشانه‌ای آشنا شروع می‌شود: pod‌ها گاهی نمی‌توانستند به Kubernetes API server وصل شوند و خطای timeout می‌گرفتند. این اختلال در محیط چندـcluster یک مشتری در europe-west، حدود ۸۰۰ توسعه‌دهنده را برای هفته‌ها از deploy در production بازداشت. به گفته گزارش، پشت این نشانه مشترک سه bug مستقل در سه لایه متفاوت قرار داشت و اصلاح نهایی به‌صورت patch در Linux kernel انجام شد.

محیط مشتری از Private Service Connect برای دسترسی خصوصی به Control Plane استفاده می‌کرد. ابزارهایی مانند Twistlock، External Secrets Operator و Cilium، همراه با operator‌های داخلی، در آن فعال بودند. نخستین خطاها در یک cluster آزمایشی دیده شد و چند روز بعد به cluster دوم رسید؛ تا روز دهم، خطاهای پراکنده به مشکلی مداوم تبدیل شده بودند.

تیم بررسی ابتدا سراغ تغییرهای اخیر رفت. یک operator سفارشی ساخته‌شده با kopf مظنون بود، اما خطاها هشت روز پیش از deployment آن شروع شده بودند و با خاموش‌کردنش هم ادامه یافتند. حذف External Secrets Operator و agent‌های امنیتی نیز نتیجه‌ای نداشت. فرضیه پرشدن Conntrack کنار گذاشته شد، چون جدول تقریباً نصف ظرفیت خود را مصرف می‌کرد. افزایش اندازه VM مربوط به Control Plane هم timeout را برطرف نکرد.

دامنه اختلال به پنج cluster می‌رسید و فقط workload‌های مشتری را درگیر نمی‌کرد؛ pod‌های سیستمی، لپ‌تاپ توسعه‌دهنده‌ها و runner‌های GitHub Actions نیز مشکل داشتند. در روز بیست‌ودوم، تیم به Packet Capture هم‌زمان در NIC ماشین Control Plane و داخل container مربوط به kube-apiserver روی آورد.

مسیر ارتباط از Private Service Connect، یک load balancer داخلی و Envoy عبور می‌کرد. بررسی‌ها نشان داد بسته SYN به NIC مقصد می‌رسد، اما به‌جای SYN-ACK مورد انتظار در TCP Handshake، پاسخ ACK متعلق به یک اتصال قدیمی برمی‌گردد. Wireshark نیز استفاده دوباره از شماره port را علامت می‌زد. بخش موجود از گزارش جزئیات سه علت نهایی را ارائه نمی‌کند؛ اما نشان می‌دهد چرا با کناررفتن فرضیه‌های اولیه، بررسی مستقیم بسته‌های شبکه برای ادامه عیب‌یابی تعیین‌کننده شد.

نکته کلیدی

قبل از مقصر دانستن آخرین deployment، زمان شروع خطا رو با زمان تغییرها مقایسه کن. اگر فرضیه‌های اولیه رد شدن، مثل این پرونده Packet Capture رو در چند نقطه مسیر بگیر تا ببینی ارتباط دقیقاً کجا از انتظار فاصله می‌گیره.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۶)