<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="he"><script src="https://www.rss.style/js/atom-style.js" xmlns="http://www.w3.org/1999/xhtml"/><title>מגדל הקוביות</title><link rel="self" type="application/atom+xml" hreflang="he" href="https://www.towerofkubes.com/he/tags/homelab/feed.xml"/><link rel="alternate" type="application/atom+xml" hreflang="en" href="https://www.towerofkubes.com/tags/homelab/feed.xml"/><link rel="alternate" type="application/atom+xml" hreflang="x-default" href="https://www.towerofkubes.com/he/tags/homelab/feed.xml"/><link rel="alternate" type="text/html" hreflang="he" href="https://www.towerofkubes.com/he/tags/homelab/"/><link rel="alternate" type="application/rss+xml" hreflang="he" href="https://www.towerofkubes.com/he/tags/homelab/index.xml"/><id>/he</id><updated>2026-09-17T00:00:00Z</updated><author><name>רועי בנדל</name></author><generator>Hugo 0.165.0</generator><entry><title>המקרה המוזר של ה-DNS שנעלם בשעת לילה</title><link rel="alternate" type="text/html" hreflang="he" href="https://www.towerofkubes.com/he/articles/external-dns-incident/"/><id>https://www.towerofkubes.com/he/articles/external-dns-incident/</id><updated>2026-09-17T00:00:00Z</updated><summary type="html">כיצד שינוי שובר ב-external-dns מחק בין לילה את כל רשומות ה-DNS שלי ב-Cloudflare, איך איתרתי ותיקנתי את התקלה בהומלאב ה-GitOps שלי, ומדוע גרסאות סמנטיות (SemVer) הן כה קריטיות.</summary><content type="html"><![CDATA[<img src="https://www.towerofkubes.com/articles/external-dns-incident/featured_hu_e62c1cc6c84e4416.jpg" /><p>אני מריץ את ה-<a href="https://homelab.towerofkubes.com/"  target="_blank" rel="noreferrer"><strong>Homelab as Code</strong></a> מבוסס ה-Kubernetes שלי כבר שישה חודשים. זו חוויה מאתגרת אך מתגמלת. הפעלת הומלאב מהונדס-יתר (over-engineered) עלולה לא פעם להביא יותר צרות מתועלת, אך יחד עם זאת אני מוצא את עצמי לומד שיעורים יקרי ערך.</p>

<h2 class="relative group">התקרית
    <div id="התקרית" class="anchor"></div>
    
</h2>
<p>מוקדם יותר השבוע, קראתי על סרט שרציתי לראות והחלטתי להוסיף אותו לרשימת הצפייה שלי ב-<a href="https://dannyvfilms.github.io/floppy/"  target="_blank" rel="noreferrer">Floppy</a>, אחד השירותים ש<a href="https://github.com/roib20/homelab-as-code/pull/1249"  target="_blank" rel="noreferrer">פרסתי לאחרונה</a> כדי לעקוב אחר מדיה.</p>
<p>כשניסיתי לגשת לדומיין שלי מהטלפון, קיבלתי את שגיאת ה-<code>ERR_CONNECTION_REFUSED</code> המאיימת. מה קרה כאן? זה יכול היה לנבוע ממגוון רחב של סיבות. ניהול הומלאב מבוסס Kubernetes מלמד אותך מהר מאוד את כל דפוסי הכשל המרתקים של פריסת עומסי עבודה ברמת enterprise על גבי מחשבי מיני-PC חלשים: nodes בעומס יתר, בעיות קישוריות, לולאות קריסה (crash loops), ועוד המון. בשלב זה, כבר ראיתי יותר ממה שהייתי רוצה להודות. עם זאת, התברר שהבעיה לא נבעה מאף אחד מאלה.</p>
<p>כשניגשתי למחשב הנייד שלי, הופתעתי לראות שכל השירותים פועלים ללא דופי: הקלאסטר היה בריא ב-100%, וכל הפודים (pods) רצו. בשלב זה, אם הניחוש הראשון שלכם לגבי הגורם לבעיה היה DNS, <a href="https://isitdns.com/"  target="_blank" rel="noreferrer">צדקתם לחלוטין</a>. הכל עבד במחשב הנייד שלי, אך לא בטלפון, הודות ל-split-horizon DNS, מה שאומר שהמחשב הנייד התחבר ישירות לרשת ההומלאב, בעוד שהטלפון שלי התחבר לדומיין הציבורי דרך ה-DNS הציבורי.</p>
<p>אני מנהל את כל הדומיינים ורשומות ה-DNS שלי דרך Cloudflare. כשנכנסתי ללוח הבקרה (dashboard) של Cloudflare, נחרדתי לגלות שכל רשומות ה-DNS נעלמו. זה הסביר את הבעיה, אך לא את הסיבה. מה גרם למחיקת רשומות ה-DNS? בדקתי את <a href="https://github.com/roib20/homelab-as-code/tree/main/kubernetes/cluster/active/addons/external-dns"  target="_blank" rel="noreferrer">פריסת ה-GitOps שלי עבור external-dns</a>. לא ביצעתי שום שינוי ברשומות ה-DNS הדקלרטיביות שלי לאחרונה, כך שזה לא יכול היה להיות הגורם, נכון? בדיוק אז נזכרתי ש<a href="https://github.com/roib20/homelab-as-code/pull/1321"  target="_blank" rel="noreferrer">מיזגתי עדכון chart של external-dns בלילה שלפני כן</a> (באמצעות Renovate).</p>
<figure><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="רשומות DNS חסרות עבור הדומיין בלוח הבקרה של Cloudflare"
    width="1354"
    height="706"
    src="/articles/external-dns-incident/missing-dns-records_hu_89b3b96bf98e9a69.png"
    srcset="/articles/external-dns-incident/missing-dns-records_hu_89b3b96bf98e9a69.png 800w, /articles/external-dns-incident/missing-dns-records_hu_4ef5898d3d6a3819.png 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="/articles/external-dns-incident/missing-dns-records.png"></figure>

<h2 class="relative group">האשם
    <div id="האשם" class="anchor"></div>
    
</h2>
<p>בחודש שעבר, פרויקט external-dns שחרר את <a href="https://github.com/kubernetes-sigs/external-dns/releases/tag/v0.22.0"  target="_blank" rel="noreferrer">v0.22.0</a> עם השינוי השובר (breaking change) הבא:</p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <ul>
<li>
<p>⚠️ The default annotation prefix is now <code>external-dns.kubernetes.io/</code> with no fallback (<a href="https://github.com/kubernetes-sigs/external-dns/pull/6424"  target="_blank" rel="noreferrer">#6424</a>)</p>
<ul>
<li>🚨 This change can <em>delete</em> <strong>all</strong> your DNS records.</li>
</ul>
</li>
</ul>
      </div>
    </div><p>המקור של השינוי הזה היה <a href="https://github.com/kubernetes-sigs/external-dns/pull/6424"  target="_blank" rel="noreferrer">pull request ממאי</a>, ששינה את קידומת ברירת המחדל של annotations עבור external-dns. הבעיה היא שכאשר external-dns מוגדר עם מדיניות <code>sync</code>, הוא מאפשר מחיקה של רשומות DNS שאינן מנוהלות. ברגע שקידומת ברירת המחדל השתנתה, כל משאבי הקלאסטר שהחזיקו ב-annotations הישנות נחשבו כעת כבלתי מנוהלים, מה שגרם ל-external-dns למחוק את כל רשומות ה-DNS של המשאבים הללו.</p>

<h2 class="relative group">הפתרון
    <div id="הפתרון" class="anchor"></div>
    
</h2>
<p><a href="https://github.com/kubernetes-sigs/external-dns/pull/6424"  target="_blank" rel="noreferrer">ה-pull request של external-dns</a> הציע את הפתרון הבא:</p>
<blockquote><p>This change can be harmless for users that needs or want to stay with previous prefix. ExternalDNS can be configured to use it:</p>
<p><code>--annotation-prefix=external-dns.alpha.kubernetes.io/</code></p>
</blockquote><p>אמנם השינוי היה רחוק מלהיות נטול נזק, ולדעתי היה מקום לתקשר אותו בצורה טובה בהרבה, אך הפתרון הזה אכן עובד.</p>
<p>חלופה נוספת היא לעדכן את כל ה-annotations כך שישתמשו בקידומת החדשה, באמצעות החלפת <code>external-dns.alpha.kubernetes.io/</code> ב-<code>external-dns.kubernetes.io/</code>. בקלאסטר המנוהל ב-GitOps כמו ה-homelab-as-code שלי, מדובר בפתרון פשוט ברגע שיודעים מה לחפש. ואכן, זה הפתרון שבחרתי בו: <a href="https://github.com/roib20/homelab-as-code/pull/1341"  target="_blank" rel="noreferrer">fix(dns): migrate ExternalDNS annotation prefix by roib20 · Pull Request #1341 · roib20/homelab-as-code</a>.</p>
<p>ברגע שה-pull request מוזג, הבעיה נפתרה לחלוטין עבורי: רשומות ה-DNS הוגדרו מחדש במהירות על ידי external-dns שהתחבר ל-Cloudflare DNS, והגישה לדומיין שלי שוחזרה (לאחר השלמת ה-DNS propagation).</p>

<h2 class="relative group">תגובת הקהילה
    <div id="תגובת-הקהילה" class="anchor"></div>
    
</h2>
<p>ב-<a href="https://github.com/kubernetes-sigs/external-dns/pull/6424"  target="_blank" rel="noreferrer">pull request של external-dns</a>, תגובת הקהילה הייתה קשה (אך הוגנת). הנה כמה מהתגובות:</p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>In hindsight, I think the release that included this change should have been v1.0.0 by this logic and more importantly to draw more attention to the massive breaking change included in this that can wipe/misconfigure DNS, or leak sensitive info and IP addresses via misconfigured DNS entries. If the project wasn’t ready for v1.0.0 then the alpha annotation is (was) still very much necessary and this should not have been merged. Not much we can do now though, except incorporate the lessons learned for the future since the act of retracting the release would probably also cause harm as well.</p>
<hr>
<blockquote><p>how is this a minor? Not cool. ⚠️ The default annotation prefix is now external-dns.kubernetes.io/ with no fallback (<a href="https://github.com/kubernetes-sigs/external-dns/pull/6424"  target="_blank" rel="noreferrer">#6424</a>)</p>
<p>🚨 This change can delete all your DNS records.</p>
</blockquote><p>What a disaster.</p>
<hr>
<p>It seems extremely irresponsible to release this without a safe and easy-to-understand migration path. I’m glad I always read the release notes!</p>
      </div>
    </div><p>התגובה הרשמית הייתה:</p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>We hear you.
Please do not upgrade if you do not have done it already we discuss the best solution to move out of this.
Sorry that it happened, we are all human and can do errors (oh AI can also do errors).
Thanks for your understanding.</p>
      </div>
    </div>
<h2 class="relative group">עדכון ה-Helm Chart
    <div id="עדכון-ה-helm-chart" class="anchor"></div>
    
</h2>
<p>שלושה שבועות לאחר מכן, שוחרר <a href="https://github.com/kubernetes-sigs/external-dns/releases#release-external-dns-helm-chart-1.22.0"  target="_blank" rel="noreferrer">external-dns-helm-chart-1.22.0</a>. זה היה העדכון שמחק את רשומות ה-DNS שלי. עדכון ה-chart צירף בתוכו את עדכון האפליקציה <a href="https://github.com/kubernetes-sigs/external-dns/releases#release-v0.22.0"  target="_blank" rel="noreferrer">v0.22.0</a>. בנוסף, ל-chart היה שינוי שובר משל עצמו, שדרש הגדרת ערך policy שלא היה חובה בגרסאות קודמות של ה-chart.</p>

<h2 class="relative group">דעתי
    <div id="דעתי" class="anchor"></div>
    
</h2>
<p>לדעתי, מתחזקי external-dns היו צריכים לקדם את הגרסה הראשית (major version) הן של האפליקציה והן של ה-Helm chart. למרות שתמיד חשוב לקרוא release notes, מפתחים ומנהלי מערכות מסתמכים על פרויקטים שיפעלו לפי <a href="https://semver.org/lang/he/"  target="_blank" rel="noreferrer">גרסאות סמנטיות</a> ויקדמו את הגרסה הראשית כאשר ישנם שינויים שוברים. סייג לכך הוא שעד היום, תשע שנים לאחר שחרורו הראשוני, פרויקט external-dns עדיין נמצא בגרסה ראשית 0, שאינה נחשבת ליציבה ואינה מספקת ערבויות כלשהן. מאידך, ה-Helm chart נמצא בגרסה ראשית 1, והיה צריך לקדם בו את הגרסה הראשית עקב השינויים השוברים.</p>
<p>פרויקט external-dns הוא חלק מארגון <a href="https://github.com/kubernetes-sigs"  target="_blank" rel="noreferrer">Kubernetes SIGs</a>. קוברנטיס עצמה ספגה ביקורת בעבר על האופן שבו היא מיישמת גרסאות סמנטיות.</p>
<figure><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="הסבר על גרסאות ‘סמנטיות’ ב-Kubernetes"
    width="1200"
    height="630"
    src="/articles/external-dns-incident/k8s-semver_hu_fc18996420b232c7.webp"
    srcset="/articles/external-dns-incident/k8s-semver_hu_fc18996420b232c7.webp 800w, /articles/external-dns-incident/k8s-semver.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="/articles/external-dns-incident/k8s-semver.webp"></figure>
<p>בסופו של דבר, אני רואה בכך הזדמנות למידה חשובה. אני שמח שזה קרה לי בהומלאב ולא בסביבת אמת (production). במקום להרתיע אותי מלהשתמש ב-external-dns ב-production, הניסיון הזה עודד אותי להיות ערני במיוחד לקריאת release notes (בכל הפרויקטים). אני משתמש ב-external-dns כבר שנים. לדוגמה, <a href="https://github.com/roib20/terraform-provision-gke-cloudflare/tree/main"  target="_blank" rel="noreferrer">הנה דמו שיצרתי לפני ארבע שנים המציג external-dns דקלרטיבי</a>.</p>
<p>בסופו של דבר, החלק הכי מתסכל היה שעד שסיימתי לטפל בתקרית הזו, כבר שכחתי איזה סרט בכלל רציתי להוסיף ל-Floppy. אני מאשים את ה-DNS.</p>
<hr>
<p><em>תמונה מוצגת מאת <a href="https://unsplash.com/@choys_?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Conny Schneider</a> ב-<a href="https://unsplash.com/photos/a-blue-background-with-lines-and-dots-xuTJZ7uD7PI?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Unsplash</a>.</em></p>
]]></content><author><name>רועי בנדל</name></author><category term="kubernetes" label="Kubernetes" scheme="https://www.towerofkubes.com/he/tags/kubernetes/"/><category term="k8s" label="K8s" scheme="https://www.towerofkubes.com/he/tags/k8s/"/><category term="dns" label="Dns" scheme="https://www.towerofkubes.com/he/tags/dns/"/><category term="external-dns" label="External-Dns" scheme="https://www.towerofkubes.com/he/tags/external-dns/"/><category term="homelab" label="Homelab" scheme="https://www.towerofkubes.com/he/tags/homelab/"/><category term="cloudflare" label="Cloudflare" scheme="https://www.towerofkubes.com/he/tags/cloudflare/"/><category term="gitops" label="Gitops" scheme="https://www.towerofkubes.com/he/tags/gitops/"/><published>2026-09-17T00:00:00Z</published></entry></feed>