<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Inspektor Gadget Blog</title>
        <link>https://www.inspektor-gadget.io/use-cases</link>
        <description>Inspektor Gadget Blog</description>
        <lastBuildDate>Tue, 11 Aug 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Troubleshoot DNS in a Kubernetes cluster]]></title>
            <link>https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes</link>
            <guid>https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes</guid>
            <pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Follow DNS requests from application pods through CoreDNS to upstream servers and find failures, latency, and incorrect answers.]]></description>
            <content:encoded><![CDATA[<p>An application reports timeouts when calling another service. Its logs show
only <code>no such host</code>, <code>SERVFAIL</code>, or a generic connection error. CoreDNS looks
healthy, and the same name might resolve successfully from another pod or node.
The difficult question is not simply whether DNS works, but <strong>where a particular
request stops working</strong>.</p>
<p>The <code>trace_dns</code> gadget gives you a live, cluster-wide view of DNS requests and
responses. It traces events in the kernel and enriches them with Kubernetes
context, so you can follow a lookup from an application pod to the <code>kube-dns</code>
Service, into a CoreDNS pod, and on to an upstream DNS server without modifying
the application or enabling verbose logging in CoreDNS.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-kubernetes-dns-is-difficult-to-troubleshoot">Why Kubernetes DNS is difficult to troubleshoot<a href="https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes#why-kubernetes-dns-is-difficult-to-troubleshoot" class="hash-link" aria-label="Direct link to Why Kubernetes DNS is difficult to troubleshoot" title="Direct link to Why Kubernetes DNS is difficult to troubleshoot">​</a></h2>
<p>A DNS lookup in Kubernetes crosses several components:</p>
<p><img decoding="async" loading="lazy" alt="A DNS request crossing Kubernetes nodes while Inspektor Gadget observes and enriches the traffic at each node." src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNjAwIDg4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsbGVkYnk9InRpdGxlIGRlc2MiPgogIDx0aXRsZSBpZD0idGl0bGUiPkROUyBvYnNlcnZhYmlsaXR5IGFjcm9zcyBhIEt1YmVybmV0ZXMgY2x1c3RlcjwvdGl0bGU+CiAgPGRlc2MgaWQ9ImRlc2MiPkEgRE5TIHJlcXVlc3QgZmxvd3MgZnJvbSBhbiBhcHBsaWNhdGlvbiBwb2QgdGhyb3VnaCBOb2RlTG9jYWwgRE5TLCB0aGUga3ViZS1kbnMgc2VydmljZSwgYW5kIENvcmVETlMgdG8gYW4gdXBzdHJlYW0gcmVzb2x2ZXIuIEluc3Bla3RvciBHYWRnZXQgb2JzZXJ2ZXMgdHJhZmZpYyBvbiBib3RoIHdvcmtlciBub2RlcyBhbmQgcHJvdmlkZXMgZW5yaWNoZWQgZXZlbnRzIHRvIGt1YmVjdGwgZ2FkZ2V0LjwvZGVzYz4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iY2x1c3RlckJhY2tncm91bmQiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmFmNWY5Ii8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2VlZjRmZiIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iaWdCYWNrZ3JvdW5kIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMCI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzJmMDUyYSIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM1ODIwNGYiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8ZmlsdGVyIGlkPSJzaGFkb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVEcm9wU2hhZG93IGR4PSIwIiBkeT0iNiIgc3RkRGV2aWF0aW9uPSI4IiBmbG9vZC1jb2xvcj0iIzJmMDUyYSIgZmxvb2Qtb3BhY2l0eT0iLjEyIi8+CiAgICA8L2ZpbHRlcj4KICAgIDxtYXJrZXIgaWQ9InJlcXVlc3RBcnJvdyIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgcmVmWD0iNiIgcmVmWT0iMy41IiBvcmllbnQ9ImF1dG8iPgogICAgICA8cGF0aCBkPSJNMCAwIDcgMy41IDAgN1oiIGZpbGw9IiNlNjFkNGIiLz4KICAgIDwvbWFya2VyPgogICAgPG1hcmtlciBpZD0icmVzcG9uc2VBcnJvdyIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgcmVmWD0iNiIgcmVmWT0iMy41IiBvcmllbnQ9ImF1dG8iPgogICAgICA8cGF0aCBkPSJNMCAwIDcgMy41IDAgN1oiIGZpbGw9IiM0Mzg1ZjUiLz4KICAgIDwvbWFya2VyPgogICAgPG1hcmtlciBpZD0iZXZlbnRBcnJvdyIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgcmVmWD0iNiIgcmVmWT0iMy41IiBvcmllbnQ9ImF1dG8iPgogICAgICA8cGF0aCBkPSJNMCAwIDcgMy41IDAgN1oiIGZpbGw9IiM3NjUzNmYiLz4KICAgIDwvbWFya2VyPgogIDwvZGVmcz4KCiAgPHJlY3Qgd2lkdGg9IjE2MDAiIGhlaWdodD0iODgwIiByeD0iMzIiIGZpbGw9IiNmZmYiLz4KCiAgPGcgZm9udC1mYW1pbHk9InN5c3RlbS11aSwgc2Fucy1zZXJpZiI+CiAgICA8dGV4dCB4PSI2MCIgeT0iNjIiIGZpbGw9IiMyZjA1MmEiIGZvbnQtc2l6ZT0iMzYiIGZvbnQtd2VpZ2h0PSI3NTAiPgogICAgICBPYnNlcnZlIGEgRE5TIHJlcXVlc3QgYWNyb3NzIHRoZSBjbHVzdGVyCiAgICA8L3RleHQ+CiAgICA8dGV4dCB4PSI2MCIgeT0iMTAxIiBmaWxsPSIjNmY2MDcwIiBmb250LXNpemU9IjIxIj4KICAgICAgSW5zcGVrdG9yIEdhZGdldCB0cmFjZXMga2VybmVsIHRyYWZmaWMgb24gZWFjaCBub2RlIGFuZCBhZGRzIEt1YmVybmV0ZXMgY29udGV4dAogICAgPC90ZXh0PgoKICAgIDxyZWN0IHg9IjQ1IiB5PSIxNDUiIHdpZHRoPSIxMjM1IiBoZWlnaHQ9IjYyNSIgcng9IjMwIiBmaWxsPSJ1cmwoI2NsdXN0ZXJCYWNrZ3JvdW5kKSIgc3Ryb2tlPSIjOGFhOWRjIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1kYXNoYXJyYXk9IjEwIDgiLz4KICAgIDxyZWN0IHg9Ijc4IiB5PSIxMjQiIHdpZHRoPSIyNTAiIGhlaWdodD0iNDQiIHJ4PSIyMiIgZmlsbD0iIzMyNmNlNSIvPgogICAgPHRleHQgeD0iMjAzIiB5PSIxNTMiIGZpbGw9IiNmZmYiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI3MDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPkt1YmVybmV0ZXMgY2x1c3RlcjwvdGV4dD4KCiAgICA8ZyBmaWx0ZXI9InVybCgjc2hhZG93KSI+CiAgICAgIDxyZWN0IHg9IjkwIiB5PSIyMDUiIHdpZHRoPSI0MjUiIGhlaWdodD0iNDg1IiByeD0iMjUiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2Q4Y2JkNiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICAgIDxyZWN0IHg9Ijc1NSIgeT0iMjA1IiB3aWR0aD0iNDI1IiBoZWlnaHQ9IjQ4NSIgcng9IjI1IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNkOGNiZDYiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPC9nPgoKICAgIDx0ZXh0IHg9IjMwMiIgeT0iMjQ4IiBmaWxsPSIjMmYwNTJhIiBmb250LXNpemU9IjI0IiBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5Xb3JrZXIgbm9kZSBBPC90ZXh0PgogICAgPHRleHQgeD0iOTY3IiB5PSIyNDgiIGZpbGw9IiMyZjA1MmEiIGZvbnQtc2l6ZT0iMjQiIGZvbnQtd2VpZ2h0PSI3MDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPldvcmtlciBub2RlIEI8L3RleHQ+CgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY1IDI5MCkiPgogICAgICA8cmVjdCB3aWR0aD0iMjc1IiBoZWlnaHQ9IjExNSIgcng9IjIwIiBmaWxsPSIjZWVmNGZmIiBzdHJva2U9IiM0Mzg1ZjUiIHN0cm9rZS13aWR0aD0iMyIvPgogICAgICA8cmVjdCB4PSIyNyIgeT0iMjciIHdpZHRoPSI4MiIgaGVpZ2h0PSI1MSIgcng9IjkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iIzQzODVmNSIgc3Ryb2tlLXdpZHRoPSIzIi8+CiAgICAgIDxwYXRoIGQ9Ik00NCA2Mmg0OE01MyA0NmgzMCIgc3Ryb2tlPSIjNDM4NWY1IiBzdHJva2Utd2lkdGg9IjYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogICAgICA8dGV4dCB4PSIxOTAiIHk9IjQ2IiBmaWxsPSIjMjQzYjYzIiBmb250LXNpemU9IjE5IiBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5BcHBsaWNhdGlvbjwvdGV4dD4KICAgICAgPHRleHQgeD0iMTkwIiB5PSI3MCIgZmlsbD0iIzI0M2I2MyIgZm9udC1zaXplPSIxOSIgZm9udC13ZWlnaHQ9IjcwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9kPC90ZXh0PgogICAgICA8dGV4dCB4PSIxOTAiIHk9Ijk0IiBmaWxsPSIjNjA3Mzk0IiBmb250LXNpemU9IjE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5zdGFydHMgdGhlIGxvb2t1cDwvdGV4dD4KICAgIDwvZz4KCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjUgNDYwKSI+CiAgICAgIDxyZWN0IHdpZHRoPSIyNzUiIGhlaWdodD0iOTAiIHJ4PSIxOCIgZmlsbD0iI2ZmZjhlOSIgc3Ryb2tlPSIjZjE5YjI0IiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1kYXNoYXJyYXk9IjcgNiIvPgogICAgICA8Y2lyY2xlIGN4PSI0OCIgY3k9IjQ1IiByPSIyMiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZjE5YjI0IiBzdHJva2Utd2lkdGg9IjciLz4KICAgICAgPHBhdGggZD0iTTQ4IDI4djM0TTMxIDQ1aDM0IiBzdHJva2U9IiNmMTliMjQiIHN0cm9rZS13aWR0aD0iNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgICAgIDx0ZXh0IHg9IjE3OCIgeT0iNDEiIGZpbGw9IiM3YTRkMGYiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI3MDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPk5vZGVMb2NhbCBETlM8L3RleHQ+CiAgICAgIDx0ZXh0IHg9IjE3OCIgeT0iNjYiIGZpbGw9IiM4ZjZlNDIiIGZvbnQtc2l6ZT0iMTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiPm9wdGlvbmFsIGNhY2hlPC90ZXh0PgogICAgPC9nPgoKICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU2NSAzNjApIj4KICAgICAgPHJlY3Qgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiIHJ4PSIyMiIgZmlsbD0iI2ZjZThlZSIgc3Ryb2tlPSIjZTYxZDRiIiBzdHJva2Utd2lkdGg9IjMiLz4KICAgICAgPGNpcmNsZSBjeD0iNzAiIGN5PSI0NyIgcj0iMjciIGZpbGw9IiNmZmYiLz4KICAgICAgPHBhdGggZD0iTTcwIDMwdjM0TTUzIDQ3aDM0IiBzdHJva2U9IiNlNjFkNGIiIHN0cm9rZS13aWR0aD0iOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgICAgIDx0ZXh0IHg9IjcwIiB5PSIxMDEiIGZpbGw9IiM3ZjE4MzIiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPmt1YmUtZG5zPC90ZXh0PgogICAgICA8dGV4dCB4PSI3MCIgeT0iMTI0IiBmaWxsPSIjN2YxODMyIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5TZXJ2aWNlPC90ZXh0PgogICAgPC9nPgoKICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgzMCAzMjUpIj4KICAgICAgPHJlY3Qgd2lkdGg9IjI3NSIgaGVpZ2h0PSIxMTUiIHJ4PSIyMCIgZmlsbD0iI2ZmZjhlOSIgc3Ryb2tlPSIjZjE5YjI0IiBzdHJva2Utd2lkdGg9IjMiLz4KICAgICAgPGNpcmNsZSBjeD0iNjQiIGN5PSI0OCIgcj0iMjciIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2YxOWIyNCIgc3Ryb2tlLXdpZHRoPSI4Ii8+CiAgICAgIDxwYXRoIGQ9Ik00MyA2NiA2MyA2MiA1OSA0MyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZjE5YjI0IiBzdHJva2Utd2lkdGg9IjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgogICAgICA8dGV4dCB4PSIxODYiIHk9IjUzIiBmaWxsPSIjN2E0ZDBmIiBmb250LXNpemU9IjIxIiBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5Db3JlRE5TIHBvZDwvdGV4dD4KICAgICAgPHRleHQgeD0iMTg2IiB5PSI4MCIgZmlsbD0iIzhmNmU0MiIgZm9udC1zaXplPSIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cmVzb2x2ZXMgb3IgZm9yd2FyZHM8L3RleHQ+CiAgICA8L2c+CgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTUwIDU5NSkiPgogICAgICA8cmVjdCB3aWR0aD0iMzA1IiBoZWlnaHQ9IjY2IiByeD0iMTgiIGZpbGw9InVybCgjaWdCYWNrZ3JvdW5kKSIvPgogICAgICA8Y2lyY2xlIGN4PSIzNyIgY3k9IjMzIiByPSIxNyIgZmlsbD0iI2U2MWQ0YiIvPgogICAgICA8cGF0aCBkPSJNMjkgMzNoMTZNMzcgMjV2MTYiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KICAgICAgPHRleHQgeD0iMTgwIiB5PSIyOSIgZmlsbD0iI2ZmZiIgZm9udC1zaXplPSIxOSIgZm9udC13ZWlnaHQ9IjcwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+SW5zcGVrdG9yIEdhZGdldDwvdGV4dD4KICAgICAgPHRleHQgeD0iMTgwIiB5PSI1MCIgZmlsbD0iI2RmY2ZkZSIgZm9udC1zaXplPSIxNCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+b2JzZXJ2ZXMgbm9kZSBBPC90ZXh0PgogICAgPC9nPgoKICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgxNSA1OTUpIj4KICAgICAgPHJlY3Qgd2lkdGg9IjMwNSIgaGVpZ2h0PSI2NiIgcng9IjE4IiBmaWxsPSJ1cmwoI2lnQmFja2dyb3VuZCkiLz4KICAgICAgPGNpcmNsZSBjeD0iMzciIGN5PSIzMyIgcj0iMTciIGZpbGw9IiNlNjFkNGIiLz4KICAgICAgPHBhdGggZD0iTTI5IDMzaDE2TTM3IDI1djE2IiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgICAgIDx0ZXh0IHg9IjE4MCIgeT0iMjkiIGZpbGw9IiNmZmYiIGZvbnQtc2l6ZT0iMTkiIGZvbnQtd2VpZ2h0PSI3MDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPkluc3Bla3RvciBHYWRnZXQ8L3RleHQ+CiAgICAgIDx0ZXh0IHg9IjE4MCIgeT0iNTAiIGZpbGw9IiNkZmNmZGUiIGZvbnQtc2l6ZT0iMTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiPm9ic2VydmVzIG5vZGUgQjwvdGV4dD4KICAgIDwvZz4KCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMzI1IDI2MCkiIGZpbHRlcj0idXJsKCNzaGFkb3cpIj4KICAgICAgPHJlY3Qgd2lkdGg9IjIyNSIgaGVpZ2h0PSIxNTUiIHJ4PSIyMiIgZmlsbD0iI2VlZjRmZiIgc3Ryb2tlPSIjNDM4NWY1IiBzdHJva2Utd2lkdGg9IjMiLz4KICAgICAgPGNpcmNsZSBjeD0iMTEyIiBjeT0iNTUiIHI9IjMzIiBmaWxsPSJub25lIiBzdHJva2U9IiM0Mzg1ZjUiIHN0cm9rZS13aWR0aD0iNyIvPgogICAgICA8cGF0aCBkPSJNNzkgNTVoNjZNMTEyIDIyYzE0IDEyIDIxIDIzIDIxIDMzcy03IDIxLTIxIDMzTTExMiAyMmMtMTQgMTItMjEgMjMtMjEgMzNzNyAyMSAyMSAzMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNDM4NWY1IiBzdHJva2Utd2lkdGg9IjUiLz4KICAgICAgPHRleHQgeD0iMTEyIiB5PSIxMjAiIGZpbGw9IiMyNDNiNjMiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI3MDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPlVwc3RyZWFtIEROUzwvdGV4dD4KICAgIDwvZz4KCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMzI1IDU0NSkiIGZpbHRlcj0idXJsKCNzaGFkb3cpIj4KICAgICAgPHJlY3Qgd2lkdGg9IjIyNSIgaGVpZ2h0PSIxNTUiIHJ4PSIyMiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjNzY1MzZmIiBzdHJva2Utd2lkdGg9IjMiLz4KICAgICAgPHJlY3QgeD0iMzciIHk9IjI1IiB3aWR0aD0iMTUxIiBoZWlnaHQ9IjYxIiByeD0iMTAiIGZpbGw9IiMyNDEyMjAiLz4KICAgICAgPHBhdGggZD0ibTU3IDQ1IDE2IDExLTE2IDExTTgzIDY5aDQwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmN2Q5ZWYiIHN0cm9rZS13aWR0aD0iNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiAgICAgIDx0ZXh0IHg9IjExMiIgeT0iMTE2IiBmaWxsPSIjMmYwNTJhIiBmb250LXNpemU9IjE5IiBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5rdWJlY3RsIGdhZGdldDwvdGV4dD4KICAgICAgPHRleHQgeD0iMTEyIiB5PSIxMzkiIGZpbGw9IiM2ZjYwNzAiIGZvbnQtc2l6ZT0iMTUiIHRleHQtYW5jaG9yPSJtaWRkbGUiPmVucmljaGVkIGV2ZW50czwvdGV4dD4KICAgIDwvZz4KCiAgICA8cGF0aCBkPSJNMzAyIDQwNVY0NjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2U2MWQ0YiIgc3Ryb2tlLXdpZHRoPSI0IiBtYXJrZXItZW5kPSJ1cmwoI3JlcXVlc3RBcnJvdykiLz4KICAgIDxwYXRoIGQ9Ik00NDAgNTA1QzUwMCA1MDUgNTE1IDQzMCA1NjUgNDMwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlNjFkNGIiIHN0cm9rZS13aWR0aD0iNCIgbWFya2VyLWVuZD0idXJsKCNyZXF1ZXN0QXJyb3cpIi8+CiAgICA8cGF0aCBkPSJNNzA1IDQzMEM3NjAgNDMwIDc4MCAzODMgODMwIDM4MyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTYxZDRiIiBzdHJva2Utd2lkdGg9IjQiIG1hcmtlci1lbmQ9InVybCgjcmVxdWVzdEFycm93KSIvPgogICAgPHBhdGggZD0iTTExMDUgMzgzSDEzMjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2U2MWQ0YiIgc3Ryb2tlLXdpZHRoPSI0IiBtYXJrZXItZW5kPSJ1cmwoI3JlcXVlc3RBcnJvdykiLz4KICAgIDx0ZXh0IHg9IjEyMTUiIHk9IjM2NyIgZmlsbD0iI2IzMTYzYyIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjcwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+ZXh0ZXJuYWwgbmFtZTwvdGV4dD4KCiAgICA8cGF0aCBkPSJNMTMyNSA0MTVIMTEwNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNDM4NWY1IiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1kYXNoYXJyYXk9IjkgNyIgbWFya2VyLWVuZD0idXJsKCNyZXNwb25zZUFycm93KSIvPgogICAgPHBhdGggZD0iTTgzMCA0MTVDNzgwIDQxNSA3NjAgNDY1IDcwNSA0NjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzQzODVmNSIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtZGFzaGFycmF5PSI5IDciIG1hcmtlci1lbmQ9InVybCgjcmVzcG9uc2VBcnJvdykiLz4KICAgIDxwYXRoIGQ9Ik01NjUgNDY1QzUxMCA0NjUgNTAwIDUzNSA0NDAgNTM1IiBmaWxsPSJub25lIiBzdHJva2U9IiM0Mzg1ZjUiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWRhc2hhcnJheT0iOSA3IiBtYXJrZXItZW5kPSJ1cmwoI3Jlc3BvbnNlQXJyb3cpIi8+CiAgICA8cGF0aCBkPSJNMzYwIDQ2MFY0MDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzQzODVmNSIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtZGFzaGFycmF5PSI5IDciIG1hcmtlci1lbmQ9InVybCgjcmVzcG9uc2VBcnJvdykiLz4KICAgIDx0ZXh0IHg9IjEyMTUiIHk9IjQ0NiIgZmlsbD0iIzM0NmRiZCIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjcwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cmVzcG9uc2UgcmV0dXJucyB0byB0aGUgcG9kPC90ZXh0PgoKICAgIDxwYXRoIGQ9Ik0zMDIgNTUwVjU5NSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNzY1MzZmIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1kYXNoYXJyYXk9IjYgNiIvPgogICAgPHBhdGggZD0iTTk2NyA0NDBWNTk1IiBmaWxsPSJub25lIiBzdHJva2U9IiM3NjUzNmYiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWRhc2hhcnJheT0iNiA2Ii8+CgogICAgPHBhdGggZD0iTTMwMiA2NjFWNzMwSDEyNjBWNjI1SDEzMjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzc2NTM2ZiIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtZGFzaGFycmF5PSI4IDciIG1hcmtlci1lbmQ9InVybCgjZXZlbnRBcnJvdykiLz4KICAgIDxwYXRoIGQ9Ik05NjcgNjYxVjcwMEgxMjYwIiBmaWxsPSJub25lIiBzdHJva2U9IiM3NjUzNmYiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWRhc2hhcnJheT0iOCA3Ii8+CiAgICA8dGV4dCB4PSI3OTAiIHk9Ijc1MyIgZmlsbD0iIzc2NTM2ZiIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjcwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAgICAgIEROUyBwYWNrZXRzIGVucmljaGVkIHdpdGggcG9kLCBuYW1lc3BhY2UsIG5vZGUsIFNlcnZpY2UsIHJlc3BvbnNlIGNvZGUsIGFuZCBsYXRlbmN5CiAgICA8L3RleHQ+CgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODUgODI1KSI+CiAgICAgIDxwYXRoIGQ9Ik0wIDBoNjUiIHN0cm9rZT0iI2U2MWQ0YiIgc3Ryb2tlLXdpZHRoPSI0IiBtYXJrZXItZW5kPSJ1cmwoI3JlcXVlc3RBcnJvdykiLz4KICAgICAgPHRleHQgeD0iODMiIHk9IjciIGZpbGw9IiM2ZjYwNzAiIGZvbnQtc2l6ZT0iMjAiPkROUyByZXF1ZXN0PC90ZXh0PgogICAgICA8cGF0aCBkPSJNMjUwIDBoNjUiIHN0cm9rZT0iIzQzODVmNSIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtZGFzaGFycmF5PSI5IDciIG1hcmtlci1lbmQ9InVybCgjcmVzcG9uc2VBcnJvdykiLz4KICAgICAgPHRleHQgeD0iMzMzIiB5PSI3IiBmaWxsPSIjNmY2MDcwIiBmb250LXNpemU9IjIwIj5ETlMgcmVzcG9uc2U8L3RleHQ+CiAgICAgIDxwYXRoIGQ9Ik01MzAgMGg2NSIgc3Ryb2tlPSIjNzY1MzZmIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1kYXNoYXJyYXk9IjcgNiIgbWFya2VyLWVuZD0idXJsKCNldmVudEFycm93KSIvPgogICAgICA8dGV4dCB4PSI2MTMiIHk9IjciIGZpbGw9IiM2ZjYwNzAiIGZvbnQtc2l6ZT0iMjAiPk9ic2VydmVkIGV2ZW50PC90ZXh0PgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==" width="1600" height="880" class="img_ev3q"></p>
<p>Inspektor Gadget observes the DNS packets in the kernel on each node and
enriches them with the pod, namespace, container, node, and Service involved.
This turns packets from different parts of the path into one Kubernetes-aware
view of the request.</p>
<p>The exact path depends on the cluster's DNS policy, CNI, service routing,
NodeLocal DNS configuration, CoreDNS plugins, and cache state. A failure can
therefore have several very different causes:</p>
<ul>
<li>The application requests the wrong or unexpectedly expanded name.</li>
<li>A NetworkPolicy, firewall, or node rule blocks DNS traffic.</li>
<li>The <code>kube-dns</code> Service does not route the request to CoreDNS.</li>
<li>CoreDNS rejects, drops, or delays the request.</li>
<li>An upstream DNS server is slow, unavailable, or returns an error.</li>
<li>The response succeeds but contains stale or unexpected addresses.</li>
</ul>
<p>Traditional packet capture can expose the packets, but correlating captures
across nodes and mapping IP addresses back to pods and Services takes time.
CoreDNS logs cover only the part of the path handled by CoreDNS. The DNS gadget
combines packet-level visibility with pod, namespace, container, node, Service,
query, response code, answer, and latency information.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-this-workflow-answers">What this workflow answers<a href="https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes#what-this-workflow-answers" class="hash-link" aria-label="Direct link to What this workflow answers" title="Direct link to What this workflow answers">​</a></h2>
<p>Use this workflow when you need to answer one or more of these questions:</p>
<ol>
<li>Which workloads are receiving unsuccessful DNS responses?</li>
<li>Which queries are slow, and where is the delay introduced?</li>
<li>Does a request leave the application pod and reach CoreDNS?</li>
<li>Does CoreDNS forward an external lookup to the expected upstream server?</li>
<li>Can each query be matched with a response?</li>
</ol>
<p>You can confirm its available fields
and filters before starting:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl gadget run trace_dns </span><span class="token parameter variable" style="color:#257c7a">-h</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it-generate-and-trace-dns-traffic">Try it: generate and trace DNS traffic<a href="https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes#try-it-generate-and-trace-dns-traffic" class="hash-link" aria-label="Direct link to Try it: generate and trace DNS traffic" title="Direct link to Try it: generate and trace DNS traffic">​</a></h2>
<p>Create a temporary pod that repeatedly looks up an in-cluster Service, an
external domain, and a deliberately nonexistent domain:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl create namespace dns-demo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl </span><span class="token parameter variable" style="color:#257c7a">-n</span><span class="token plain"> dns-demo run dns-client </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--image</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">busybox:1.36 </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--restart</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Never </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--labels</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">app</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">dns-client </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--command</span><span class="token plain"> -- </span><span class="token function" style="color:#cc3745">sh</span><span class="token plain"> </span><span class="token parameter variable" style="color:#257c7a">-c</span><span class="token plain"> </span><span class="token string" style="color:#d71066">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#d71066">    while true; do</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#d71066">      nslookup kubernetes.default.svc.cluster.local &gt;/dev/null 2&gt;&amp;1</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#d71066">      nslookup example.com &gt;/dev/null 2&gt;&amp;1</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#d71066">      nslookup does-not-exist.inspektor-gadget.invalid &gt;/dev/null 2&gt;&amp;1</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#d71066">      sleep 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#d71066">    done'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">kubectl </span><span class="token parameter variable" style="color:#257c7a">-n</span><span class="token plain"> dns-demo </span><span class="token function" style="color:#cc3745">wait</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--for</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">condition</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">Ready pod/dns-client </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--timeout</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">90s</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Trace <code>A</code> record requests and responses from that pod:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl gadget run trace_dns </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">-n</span><span class="token plain"> dns-demo </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">-p</span><span class="token plain"> dns-client </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--timeout</span><span class="token plain"> </span><span class="token number" style="color:#257c7a">10</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--filter</span><span class="token plain"> </span><span class="token string" style="color:#d71066">"qtype==A"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--fields</span><span class="token plain"> k8s.podName,id,qr,qtype,name,rcode,addresses,latency_ns</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>A sample captured from a minikube cluster looks like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">K8S.PODNAME  ID    QR  QTYPE  NAME                                         RCODE      ADDRESSES                     LATENCY_NS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dns-client   b8e1  Q   A      kubernetes.default.svc.cluster.local.                                                 0ns</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dns-client   b8e1  R   A      kubernetes.default.svc.cluster.local.       Success    10.96.0.1                      714.03µs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dns-client   3d30  Q   A      example.com.                                                                          0ns</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dns-client   3d30  R   A      example.com.                                Success    104.20.23.154,104.20.24.154    411.53µs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dns-client   8f50  Q   A      does-not-exist.inspektor-gadget.invalid.                                              0ns</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dns-client   8f50  R   A      does-not-exist.inspektor-gadget.invalid.    NameError                                 252.93µs</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The matching <code>ID</code> values connect each query (<code>Q</code>) with its response (<code>R</code>).
The first lookup returns the Kubernetes API Service address, the second returns
external addresses, and the deliberately invalid name returns <code>NameError</code>.
Addresses and latency values will differ between clusters and runs.</p>
<p>Remove the test workload when you are finished:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl delete namespace dns-demo</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-1-find-unsuccessful-responses-across-the-cluster">Scenario 1: Find unsuccessful responses across the cluster<a href="https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes#scenario-1-find-unsuccessful-responses-across-the-cluster" class="hash-link" aria-label="Direct link to Scenario 1: Find unsuccessful responses across the cluster" title="Direct link to Scenario 1: Find unsuccessful responses across the cluster">​</a></h2>
<p>Start broad when users report failures from multiple workloads or the affected
namespace is not yet known:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl gadget run trace_dns </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --all-namespaces </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--timeout</span><span class="token plain"> </span><span class="token number" style="color:#257c7a">120</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--fields</span><span class="token plain"> k8s.node,src,dst,name,qtype,rcode </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--filter</span><span class="token plain"> </span><span class="token string" style="color:#d71066">"qr==R,rcode!=Success"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This shows only DNS responses whose response code is not <code>Success</code>. Use the
Kubernetes-enriched source and destination to identify the affected workload
and the DNS component returning the error.</p>
<p>The response code helps direct the next investigation:</p>
<table><thead><tr><th>Observation</th><th>Likely direction</th></tr></thead><tbody><tr><td><code>NameError</code></td><td>Check spelling, search-domain expansion, and whether the record should exist.</td></tr><tr><td><code>ServerFailure</code></td><td>Inspect CoreDNS configuration and the health of its upstream servers.</td></tr><tr><td><code>Refused</code></td><td>Check whether CoreDNS or the upstream server permits the query.</td></tr><tr><td>No response event</td><td>Trace the complete path to find where the query disappears.</td></tr></tbody></table>
<p>An unsuccessful response does not always mean the DNS infrastructure is
broken. For example, <code>NameError</code> is expected for a name that does not exist.
Correlate the name and requesting workload before treating it as an incident.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-2-find-slow-dns-responses">Scenario 2: Find slow DNS responses<a href="https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes#scenario-2-find-slow-dns-responses" class="hash-link" aria-label="Direct link to Scenario 2: Find slow DNS responses" title="Direct link to Scenario 2: Find slow DNS responses">​</a></h2>
<p>An application timeout can be caused by DNS even when every query eventually
succeeds. The following trace shows responses slower than 5 milliseconds:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl gadget run trace_dns </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --all-namespaces </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--timeout</span><span class="token plain"> </span><span class="token number" style="color:#257c7a">120</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--fields</span><span class="token plain"> k8s.node,src,dst,name,qtype,rcode,latency_ns </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --filter-expr </span><span class="token string" style="color:#d71066">"latency_ns_raw &gt; 5 * 1000 * 1000"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>latency_ns_raw</code> is measured in nanoseconds, so the expression converts 5
milliseconds using <code>1,000 microseconds per millisecond * 1,000 nanoseconds per microsecond</code>. Change the leading <code>5</code> to a threshold that reflects the
application's latency budget. Compare the source and destination of slow
events:</p>
<ul>
<li>Slow responses from <code>kube-dns</code> to an application pod can indicate congestion
or delay anywhere behind the Service.</li>
<li>Slow responses from an upstream server to CoreDNS point toward the upstream
resolver or the network path to it.</li>
<li>Slow responses concentrated on one node suggest a node-specific networking,
conntrack, or NodeLocal DNS issue.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-3-follow-one-lookup-end-to-end">Scenario 3: Follow one lookup end to end<a href="https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes#scenario-3-follow-one-lookup-end-to-end" class="hash-link" aria-label="Direct link to Scenario 3: Follow one lookup end to end" title="Direct link to Scenario 3: Follow one lookup end to end">​</a></h2>
<p>After identifying an affected pod and name, narrow the trace to reconstruct the
request flow. This example follows <code>example.com.</code> from <code>mypod</code> through CoreDNS:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl gadget run trace_dns </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">-n</span><span class="token plain"> demo,kube-system </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--timeout</span><span class="token plain"> </span><span class="token number" style="color:#257c7a">120</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--filter</span><span class="token plain"> </span><span class="token string" style="color:#d71066">"k8s.podName~mypod|coredns-.*"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--filter</span><span class="token plain"> </span><span class="token string" style="color:#d71066">"name==example.com."</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--fields</span><span class="token plain"> k8s.node,k8s.namespace,k8s.podname,id,src,dst,qr,name,rcode,latency_ns,timestamp</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Use a trailing dot in the filter because the DNS name in the packet is a fully
qualified domain name. Read the events in timestamp order and use <code>ID</code> and <code>QR</code>
to correlate each query (<code>Q</code>) with its response (<code>R</code>).</p>
<p>A healthy external lookup normally produces these stages:</p>
<ol>
<li>The application pod sends a query to the <code>kube-dns</code> Service.</li>
<li>The query reaches a CoreDNS pod.</li>
<li>CoreDNS creates a new query ID and sends the request to an upstream server.</li>
<li>The upstream server responds to CoreDNS.</li>
<li>CoreDNS responds to the application pod.</li>
</ol>
<p>The last visible stage localizes the problem:</p>
<table><thead><tr><th>Last observed event</th><th>What to investigate</th></tr></thead><tbody><tr><td>Query leaves the application but never appears at CoreDNS</td><td>Service routing, NetworkPolicy, CNI, node firewall, or NodeLocal DNS.</td></tr><tr><td>Query reaches CoreDNS but is not forwarded upstream</td><td>CoreDNS configuration, plugins, policy, or an intentional cached response.</td></tr><tr><td>Query leaves CoreDNS but no upstream response arrives</td><td>Upstream resolver health, routes, firewall rules, or packet loss.</td></tr><tr><td>CoreDNS receives an upstream response but the pod does not</td><td>CoreDNS processing, Service routing, NetworkPolicy, or the return path.</td></tr></tbody></table>
<p>CoreDNS may answer from its cache, so the absence of an upstream query is not
by itself evidence of a failure. NodeLocal DNS also adds another caching and
forwarding stage. Interpret the trace according to the DNS components enabled
in your cluster.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-4-check-the-upstream-dns-server">Scenario 4: Check the upstream DNS server<a href="https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes#scenario-4-check-the-upstream-dns-server" class="hash-link" aria-label="Direct link to Scenario 4: Check the upstream DNS server" title="Direct link to Scenario 4: Check the upstream DNS server">​</a></h2>
<p>When failures affect external names, isolate traffic between CoreDNS and the
configured upstream resolver. Replace the address below with the nameserver
used by your nodes or CoreDNS:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">kubectl gadget run trace_dns </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --all-namespaces </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--timeout</span><span class="token plain"> </span><span class="token number" style="color:#257c7a">120</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--fields</span><span class="token plain"> src,dst,id,qr,name,nameserver,rcode,latency_ns </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token parameter variable" style="color:#257c7a">--filter</span><span class="token plain"> </span><span class="token string" style="color:#d71066">"nameserver.addr==192.0.2.53"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>For each query ID, check for a matching response:</p>
<ul>
<li>A query without a response suggests packet loss, a blocked path, or an
unavailable resolver.</li>
<li>A response with high latency identifies the resolver or its network path as
the source of delay.</li>
<li><code>ServerFailure</code> or <code>Refused</code> indicates that the upstream server received the
query but could not or would not answer it.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="from-symptom-to-root-cause">From symptom to root cause<a href="https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes#from-symptom-to-root-cause" class="hash-link" aria-label="Direct link to From symptom to root cause" title="Direct link to From symptom to root cause">​</a></h2>
<p>The most effective investigation moves from broad evidence to a narrow trace:</p>
<ol>
<li>Find unsuccessful or slow responses across the cluster.</li>
<li>Identify the affected namespace, pod, node, and DNS name.</li>
<li>Trace that name through the application, CoreDNS, and upstream resolver.</li>
<li>Correlate queries and responses by DNS ID.</li>
<li>Validate the response code, latency, answer count, and returned addresses.</li>
</ol>
<p>This approach avoids changing the application, restarting workloads, or
enabling cluster-wide verbose DNS logs. It also distinguishes a DNS failure
from service routing, policy, upstream resolver, and endpoint problems that
present the same symptoms to the application.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>In this guide, we explored how to troubleshoot DNS issues in Kubernetes using Inspektor Gadget. By following a structured approach, you can isolate the root cause of DNS failures without disrupting your applications. While this guide focused on getting events in terminal output, you can also export the data to OpenTelemetry, Prometheus, Logs, or other observability tools for further analysis and visualization.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="related-documentation">Related documentation<a href="https://www.inspektor-gadget.io/use-cases/troubleshoot-dns-in-kubernetes#related-documentation" class="hash-link" aria-label="Direct link to Related documentation" title="Direct link to Related documentation">​</a></h2>
<ul>
<li><a href="https://inspektor-gadget.io/docs/latest/gadgets/trace_dns" target="_blank" rel="noopener noreferrer">Trace DNS requests with Inspektor Gadget</a></li>
<li><a href="https://inspektor-gadget.io/docs/latest/reference/export-metrics" target="_blank" rel="noopener noreferrer">Export metrics with the OpenTelemetry metrics operator</a></li>
<li><a href="https://inspektor-gadget.io/docs/latest/reference/export-logs" target="_blank" rel="noopener noreferrer">Export events with the OpenTelemetry logs exporter</a></li>
<li><a href="https://inspektor-gadget.io/docs/latest/spec/operators/logs" target="_blank" rel="noopener noreferrer">Configure the logs operator</a></li>
<li><a href="https://www.containerdays.io/blog/debugging-dns-request-flows-in-kubernetes-clusters/" target="_blank" rel="noopener noreferrer">Debugging DNS request flows in Kubernetes clusters</a></li>
</ul>]]></content:encoded>
            <category>Kubernetes</category>
            <category>DNS</category>
            <category>CoreDNS</category>
            <category>Networking</category>
            <category>Troubleshooting</category>
        </item>
        <item>
            <title><![CDATA[Use case placeholder]]></title>
            <link>https://www.inspektor-gadget.io/use-cases/placeholder</link>
            <guid>https://www.inspektor-gadget.io/use-cases/placeholder</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <description><![CDATA[Internal placeholder used to generate the empty use-case collection.]]></description>
            <content:encoded><![CDATA[<p>This internal entry keeps the collection route available before the first use
case is published.</p>]]></content:encoded>
        </item>
    </channel>
</rss>