{"id":45221,"date":"2026-06-24T15:14:15","date_gmt":"2026-06-24T13:14:15","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=45221"},"modified":"2026-06-24T18:25:53","modified_gmt":"2026-06-24T16:25:53","slug":"expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/","title":{"rendered":"Expose your Kubernetes pods to your Tailnet using Tailscale operator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In one of my previous blogs, I explained how to <a href=\"https:\/\/www.dbi-services.com\/blog\/access-your-kubernetes-pods-via-tailscale-using-a-sidecar-container\/\">use a Tailscale sidecar container into an existing pod<\/a> to expose it to your Tailnet. Even though this works fine, it can be tedious to set up and not very convenient for every use case and not scalable at all. Another solution is to use the Tailscale Kubernetes Operator. <br>Rather than going through all that manual configuration, you can simply add some annotations on your Kubernetes services and call it a day.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, there&#8217;s a bit of upfront setup involved but once that&#8217;s out of the way, day-to-day management becomes significantly less painful, especially for the workloads. The operator sits inside your cluster and keeps an eye on things, picking up on any Kubernetes resource changes and making sure your Tailscale network reflects those changes accordingly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My use case is as follows: I&#8217;ve installed ArgoCD at home and want to access it through my Tailnet. In this blog, the example will focus on an Nginx pod, but the principle is exactly the same. We&#8217;re not making any changes whatsoever to the pods or deployments; only the Services matter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let me guide you through the configuration of the Tailscale Operator and see how convenient it is. You&#8217;ll love it, I swear!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"h-step-1-set-up-an-acl-policy\" class=\"wp-block-heading\">Step 1: Set up an ACL policy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before anything else, you&#8217;ll need to set up some new ACL policy rules in Tailscale, this allows any tailnet devices that the operator spins up to be identified as belonging to your Tailnet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Login to your Tailscale admin section &#8211;&gt; Access Controls &#8211;&gt; Tags<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"460\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23-1024x460.png\" alt=\"\" class=\"wp-image-45230\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23-1024x460.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23-300x135.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23-768x345.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23.png 1157w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 id=\"h-create-the-2-tags\" class=\"wp-block-heading\">Create the 2 tags:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;ll need to define 2 tags: <strong>k8s-operator<\/strong> and <strong>k8s<\/strong>. <br>Make sure <strong>k8s-operator<\/strong> is set as an owner of <strong>k8s<\/strong><\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"472\" height=\"342\" data-id=\"45238\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-31.png\" alt=\"\" class=\"wp-image-45238\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-31.png 472w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-31-300x217.png 300w\" sizes=\"auto, (max-width: 472px) 100vw, 472px\" \/><\/figure>\n<\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"470\" height=\"342\" data-id=\"45239\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-32.png\" alt=\"\" class=\"wp-image-45239\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-32.png 470w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-32-300x218.png 300w\" sizes=\"auto, (max-width: 470px) 100vw, 470px\" \/><\/figure>\n<\/figure>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">If you open the JSON editor tab, the equivalent in JSON format should be this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"tagOwners\": {\n\t\"tag:k8s-operator\": &#091;],\n\t\"tag:k8s\": &#091;\"tag:k8s-operator\"]\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"h-step-2-create-an-oauth-client\" class=\"wp-block-heading\">Step 2: Create an OAuth client<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your operator needs an OAuth client to authenticate to your Tailnet and register new pods and services.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Navigate to the admin console&#8217;s Settings &#8211;&gt; Trust credentials &#8211;&gt; Add Credential :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"467\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-45-1024x467.png\" alt=\"\" class=\"wp-image-45266\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-45-1024x467.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-45-300x137.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-45-768x350.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-45.png 1160w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Choose OAuth, give your auth key a name, click continue.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"593\" height=\"368\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-39.png\" alt=\"\" class=\"wp-image-45257\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-39.png 593w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-39-300x186.png 300w\" sizes=\"auto, (max-width: 593px) 100vw, 593px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Give <strong>Read+Write<\/strong> permissions under the &#8220;<strong>Devices<\/strong>&#8221; section.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Deploy the Keys section and add <strong>Read+Write<\/strong> permissions to the <strong>Auth Keys<\/strong> parameters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Select the&nbsp;<code>tag:k8s-operator<\/code>&nbsp;tag created earlier from the dropdown to ensure devices created by the operator will have the tag assigned.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"612\" height=\"795\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-40.png\" alt=\"\" class=\"wp-image-45259\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-40.png 612w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-40-231x300.png 231w\" sizes=\"auto, (max-width: 612px) 100vw, 612px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"619\" height=\"877\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-41.png\" alt=\"\" class=\"wp-image-45260\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-41.png 619w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-41-212x300.png 212w\" sizes=\"auto, (max-width: 619px) 100vw, 619px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"518\" height=\"353\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-42.png\" alt=\"\" class=\"wp-image-45261 size-full\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-42.png 518w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-42-300x204.png 300w\" sizes=\"auto, (max-width: 518px) 100vw, 518px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"wp-block-paragraph\">Once you click &#8220;Generate credential&#8221;, a pop-up window displays the key. Make sure to copy it in a safe place as it won&#8217;t be shown again.<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"h-step-3-install-the-operator-on-your-kubernetes-cluster\" class=\"wp-block-heading\">Step 3: Install the Operator on your Kubernetes cluster<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add the helm repository<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># Add the repository\n$ helm repo add tailscale https:\/\/pkgs.tailscale.com\/helmcharts\n\n# Update your client\u2019s package list\n$ helm repo update<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run the helm install command to install the tailscale-operator<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ helm upgrade --install tailscale-operator tailscale\/tailscale-operator \\\n  --namespace=tailscale \\\n  --create-namespace \\\n  --set-string oauth.clientId=&lt;oauth_client_id&gt; \\\n  --set-string oauth.clientSecret=&lt;oauth_client_secret&gt; \\\n  --wait\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Replace the <strong><code>&lt;oauth_client_id&gt;<\/code><\/strong> and <strong><code>&lt;oauth_client_secret&gt;<\/code><\/strong> placeholders with the actual values you copied down at the end of the previous step.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>After a few seconds, check that the operator&#8217;s pod is up:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>rancher:~ # kubectl get pods -n tailscale\nNAME                        READY   STATUS    RESTARTS       AGE\noperator-7699b5555b-v6wgw   1\/1     Running   20 (16h ago)   55d<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Log into your Tailscale account and you should see the operator as a machine:<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"345\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-37-1024x345.png\" alt=\"\" class=\"wp-image-45249\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-37-1024x345.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-37-300x101.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-37-768x259.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-37.png 1142w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"h-step-4-expose-your-kubernetes-services-easily\" class=\"wp-block-heading\">Step 4: Expose your Kubernetes services easily<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For the purpose of this article, we&#8217;ll keep things simple: we&#8217;re just going to walk through a basic example that exposes an nginx service in your tailnet.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: nginx\n  labels:\n    app: nginx\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: nginx\n  template:\n    metadata:\n      labels:\n        app: nginx\n    spec:\n      containers:\n        - name: nginx\n          image: nginx:latest\n          ports:\n            - containerPort: 80\n\n---\n\napiVersion: v1\nkind: Service\nmetadata:\n  name: nginx\n  annotations:\n    tailscale.com\/expose: \"true\"\nspec:\n  selector:\n    app: nginx\n  ports:\n    - port: 80\n      targetPort: 80<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Take a closer look at the Service part of the YAML file. The key element here is the <code>tailscale.com\/expose<\/code> annotation, sitting under the service&#8217;s <code>metadata.annotations<\/code> field. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That single annotation is all it takes to automatically expose the service in your Tailnet. <br>Once you apply it to your cluster, the Tailscale Operator picks it up on its own and takes care of setting up the appropriate route behind the scenes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Set it to &#8220;true&#8221; if you want to expose the service and to &#8220;false&#8221; if not, it&#8217;s that easy!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Log back into your Tailscale account, you should see the service as a new device and your nginx pod should be exposed and reachable via its Tailscale IP address !<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"342\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-38-1024x342.png\" alt=\"\" class=\"wp-image-45252\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-38-1024x342.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-38-300x100.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-38-768x257.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-38.png 1140w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"813\" height=\"543\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-43.png\" alt=\"\" class=\"wp-image-45263\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-43.png 813w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-43-300x200.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-43-768x513.png 768w\" sizes=\"auto, (max-width: 813px) 100vw, 813px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s it. <br>From now on, whatever you deploy in your Kubernetes cluster, and as long as it has the right annotation, will be detected by the Tailscale operator and exposed to your tailnet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cool, no?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In one of my previous blogs, I explained how to use a Tailscale sidecar container into an existing pod to expose it to your Tailnet. Even though this works fine, it can be tedious to set up and not very convenient for every use case and not scalable at all. Another solution is to use [&hellip;]<\/p>\n","protected":false},"author":83,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1320,1522],"tags":[2667,2634,3802,4130],"type_dbi":[],"class_list":["post-45221","post","type-post","status-publish","format-standard","hentry","category-devops","category-kubernetes","tag-devops-2","tag-kubernetes-2","tag-tailscale","tag-tailscale-operator"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.8 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Expose your Kubernetes pods to your Tailnet using Tailscale operator - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Expose your Kubernetes pods to your Tailnet using Tailscale operator\" \/>\n<meta property=\"og:description\" content=\"In one of my previous blogs, I explained how to use a Tailscale sidecar container into an existing pod to expose it to your Tailnet. Even though this works fine, it can be tedious to set up and not very convenient for every use case and not scalable at all. Another solution is to use [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-24T13:14:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-24T16:25:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1157\" \/>\n\t<meta property=\"og:image:height\" content=\"520\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"R\u00e9my Gaudey\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"R\u00e9my Gaudey\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/\"},\"author\":{\"name\":\"R\u00e9my Gaudey\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/fcee587f8949b463b8deef8a03f1a4e1\"},\"headline\":\"Expose your Kubernetes pods to your Tailnet using Tailscale operator\",\"datePublished\":\"2026-06-24T13:14:15+00:00\",\"dateModified\":\"2026-06-24T16:25:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/\"},\"wordCount\":690,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/image-23-1024x460.png\",\"keywords\":[\"devops\",\"kubernetes\",\"tailscale\",\"tailscale-operator\"],\"articleSection\":[\"DevOps\",\"Kubernetes\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/\",\"name\":\"Expose your Kubernetes pods to your Tailnet using Tailscale operator - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/image-23-1024x460.png\",\"datePublished\":\"2026-06-24T13:14:15+00:00\",\"dateModified\":\"2026-06-24T16:25:53+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/fcee587f8949b463b8deef8a03f1a4e1\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/image-23.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/06\\\/image-23.png\",\"width\":1157,\"height\":520},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Expose your Kubernetes pods to your Tailnet using Tailscale operator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/fcee587f8949b463b8deef8a03f1a4e1\",\"name\":\"R\u00e9my Gaudey\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5306e0ba7080fbbd90f039442ffbef577ef354978cd14eaed1e338a28694e16f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5306e0ba7080fbbd90f039442ffbef577ef354978cd14eaed1e338a28694e16f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5306e0ba7080fbbd90f039442ffbef577ef354978cd14eaed1e338a28694e16f?s=96&d=mm&r=g\",\"caption\":\"R\u00e9my Gaudey\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/remygaudey\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Expose your Kubernetes pods to your Tailnet using Tailscale operator - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/","og_locale":"en_US","og_type":"article","og_title":"Expose your Kubernetes pods to your Tailnet using Tailscale operator","og_description":"In one of my previous blogs, I explained how to use a Tailscale sidecar container into an existing pod to expose it to your Tailnet. Even though this works fine, it can be tedious to set up and not very convenient for every use case and not scalable at all. Another solution is to use [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/","og_site_name":"dbi Blog","article_published_time":"2026-06-24T13:14:15+00:00","article_modified_time":"2026-06-24T16:25:53+00:00","og_image":[{"width":1157,"height":520,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23.png","type":"image\/png"}],"author":"R\u00e9my Gaudey","twitter_card":"summary_large_image","twitter_misc":{"Written by":"R\u00e9my Gaudey","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/"},"author":{"name":"R\u00e9my Gaudey","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/fcee587f8949b463b8deef8a03f1a4e1"},"headline":"Expose your Kubernetes pods to your Tailnet using Tailscale operator","datePublished":"2026-06-24T13:14:15+00:00","dateModified":"2026-06-24T16:25:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/"},"wordCount":690,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23-1024x460.png","keywords":["devops","kubernetes","tailscale","tailscale-operator"],"articleSection":["DevOps","Kubernetes"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/","url":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/","name":"Expose your Kubernetes pods to your Tailnet using Tailscale operator - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23-1024x460.png","datePublished":"2026-06-24T13:14:15+00:00","dateModified":"2026-06-24T16:25:53+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/fcee587f8949b463b8deef8a03f1a4e1"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/06\/image-23.png","width":1157,"height":520},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/expose-your-kubernetes-pods-to-your-via-tailnet-using-tailscale-operator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Expose your Kubernetes pods to your Tailnet using Tailscale operator"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/fcee587f8949b463b8deef8a03f1a4e1","name":"R\u00e9my Gaudey","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5306e0ba7080fbbd90f039442ffbef577ef354978cd14eaed1e338a28694e16f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5306e0ba7080fbbd90f039442ffbef577ef354978cd14eaed1e338a28694e16f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5306e0ba7080fbbd90f039442ffbef577ef354978cd14eaed1e338a28694e16f?s=96&d=mm&r=g","caption":"R\u00e9my Gaudey"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/remygaudey\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/83"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=45221"}],"version-history":[{"count":39,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45221\/revisions"}],"predecessor-version":[{"id":45302,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/45221\/revisions\/45302"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=45221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=45221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=45221"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=45221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}