{"id":32183,"date":"2022-12-06T08:35:01","date_gmt":"2022-12-06T08:35:01","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=32183"},"modified":"2022-12-23T05:44:42","modified_gmt":"2022-12-23T05:44:42","slug":"minikube-tutorials-minikube-tunnel-explained","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/minikube-tutorials-minikube-tunnel-explained\/","title":{"rendered":"Minikube Tutorials: minikube tunnel explained"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"907\" height=\"488\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-0.png\" alt=\"\" class=\"wp-image-32189\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-0.png 907w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-0-300x161.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-0-768x413.png 768w\" sizes=\"auto, (max-width: 907px) 100vw, 907px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"987\" height=\"513\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-2.png\" alt=\"\" class=\"wp-image-32190\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-2.png 987w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-2-300x156.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-2-768x399.png 768w\" sizes=\"auto, (max-width: 987px) 100vw, 987px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How to access applications running within minikube<\/h2>\n\n\n\n<p>There are two major categories of services in Kubernetes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>NodePort<\/li>\n\n\n\n<li>LoadBalancer<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">NodePort access with Minikube<\/h2>\n\n\n\n<p>A NodePort service is the most basic way to get external traffic directly to your service. NodePort, as the name implies, opens a specific port, and any traffic that is sent to this port is forwarded to the service.<\/p>\n\n\n\n<p>Getting the NodePort using the service command: We also have a shortcut for fetching the minikube IP and a service\u2019s NodePort:<br>$ minikube service &#8211;url<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Example <span class=\"hljs-keyword\">of<\/span> NodePort\n\nStep - <span class=\"hljs-number\">1<\/span>: Create a Kubernetes deployment\n$ kubectl create deployment hello-minikube1 --image=k8s.gcr.io\/echoserver:<span class=\"hljs-number\">1.4<\/span>\n\nStep - <span class=\"hljs-number\">2<\/span>: Create a Kubernetes service type NodePort\n$ kubectl expose deployment hello-minikube1 --type=NodePort --port=<span class=\"hljs-number\">8080<\/span>\n\nStep - <span class=\"hljs-number\">3<\/span>: Check Node Port\n$ kubectl <span class=\"hljs-keyword\">get<\/span> svc\nNAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE\nhello-minikube1   NodePort    10.100.238.34   &lt;none&gt;        8080:31389\/TCP   3s\n\nStep - 4: Run service tunnel\n$ minikube service hello-minikube1 --url\n\nStep - 5: To determine the NodePort for your service, you can use a kubectl command like this (note that nodePort begins with lowercase n in JSON output):\n$ kubectl <span class=\"hljs-keyword\">get<\/span> service &lt;service-name&gt; --output='jsonpath=\"{.spec.ports&#91;<span class=\"hljs-number\">0<\/span>].nodePort}<span class=\"hljs-string\">\"'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"330\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-3.png\" alt=\"\" class=\"wp-image-32191\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-3.png 640w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-3-300x155.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"577\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-4.png\" alt=\"\" class=\"wp-image-32193\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-4.png 800w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-4-300x216.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2022\/12\/minikub-tunnel-4-768x554.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Connect to LoadBalancer services with Minikube<\/h2>\n\n\n\n<p>A LoadBalancer service is the standard way to expose a service to the internet. With this method, each service gets its own IP address.<\/p>\n\n\n\n<p>Using minikube tunnel<br>Services of type LoadBalancer can be exposed via the minikube tunnel command. It must be run in a separate terminal window to keep the LoadBalancer running. Ctrl-C in the terminal can be used to terminate the process at which time the network routes will be cleaned up<\/p>\n\n\n\n<p>minikube tunnel creates a network route on the host to the service using the cluster\u2019s IP address as a gateway. The tunnel command exposes the external IP directly to any program running on the host operating system.<\/p>\n\n\n\n<p>Note: The command requires root rights (sudo) because it creates a network configuration.<\/p>\n\n\n\n<p>Tunnel is used to expose the service from inside of VM where minikube is running to the host machine&#8217;s network. Works with LoadBalancer service type.<\/p>\n\n\n\n<p>Example of LoadBalancer with Minikube tunnel<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Step <span class=\"hljs-number\">1<\/span> - Run the tunnel <span class=\"hljs-keyword\">in<\/span> a separate terminal\n\nIt will ask <span class=\"hljs-keyword\">for<\/span> a password.\n$ minikube tunnel\nminikube tunnel runs <span class=\"hljs-keyword\">as<\/span> a process, creating a network route on the host to the service CIDR <span class=\"hljs-keyword\">of<\/span> the cluster using the cluster\u2019s IP address <span class=\"hljs-keyword\">as<\/span> a gateway. The tunnel command exposes the external IP directly to any program running on the host operating system.\n\ntunnel output example\n\n <span class=\"hljs-attr\">Password<\/span>:\n Status:\n machine: minikube\n <span class=\"hljs-attr\">pid<\/span>: <span class=\"hljs-number\">39087<\/span>\n <span class=\"hljs-attr\">route<\/span>: <span class=\"hljs-number\">10.96<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>\/<span class=\"hljs-number\">12<\/span> -&gt; <span class=\"hljs-number\">192.168<\/span><span class=\"hljs-number\">.64<\/span><span class=\"hljs-number\">.194<\/span>\n <span class=\"hljs-attr\">minikube<\/span>: Running\n <span class=\"hljs-attr\">services<\/span>: &#91;hello-minikube]\n     <span class=\"hljs-attr\">errors<\/span>:\n   minikube: no errors\n   <span class=\"hljs-attr\">router<\/span>: no errors\n   loadbalancer emulator: no errors\n\n\nStep <span class=\"hljs-number\">2<\/span> - Create a Kubernetes deployment\n$ kubectl create deployment hello-minikube1 --image=k8s.gcr.io\/echoserver:<span class=\"hljs-number\">1.4<\/span>\n\nStep <span class=\"hljs-number\">3<\/span> - Create a Kubernetes service <span class=\"hljs-keyword\">with<\/span> type LoadBalancer\n\nkubectl expose deployment hello-minikube1 --type=LoadBalancer --port=<span class=\"hljs-number\">8080<\/span>\n\nStep <span class=\"hljs-number\">4<\/span> - Check the external IP\n$ kubectl <span class=\"hljs-keyword\">get<\/span> svc\n$ kc <span class=\"hljs-keyword\">get<\/span> svc\n NAME              TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE\n hello-minikube1   LoadBalancer   10.96.184.178   10.96.184.178   8080:30791\/TCP   40s\n \nNote that without minikube tunnel, Kubernetes will show the external IP as \u201cpending\u201d.\n\nStep 5 - Try in your browser\n\nOpen in your browser (ensure there is no proxy <span class=\"hljs-keyword\">set<\/span>)\n\nhttp:&#47;&#47;REPLACE_WITH_EXTERNAL_IP:8080\nEach service will <span class=\"hljs-keyword\">get<\/span> its own external IP.<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"<p>How to access applications running within minikube There are two major categories of services in Kubernetes: NodePort access with Minikube A NodePort service is the most basic way to get external traffic directly to your service. NodePort, as the name implies, opens a specific port, and any traffic that is sent to this port is&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-32183","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/32183","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=32183"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/32183\/revisions"}],"predecessor-version":[{"id":32194,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/32183\/revisions\/32194"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=32183"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=32183"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=32183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}