<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Martin Solev</title>
    <description>The latest articles on DEV Community by Martin Solev (@martinsolev).</description>
    <link>https://dev.to/martinsolev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F192383%2Fcc3c8845-5163-42da-94d3-61ab6aac473c.jpg</url>
      <title>DEV Community: Martin Solev</title>
      <link>https://dev.to/martinsolev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/martinsolev"/>
    <language>en</language>
    <item>
      <title>How to access micro-services (pods) in Kubernetes that are not publicly available</title>
      <dc:creator>Martin Solev</dc:creator>
      <pubDate>Fri, 31 Jan 2020 20:19:27 +0000</pubDate>
      <link>https://dev.to/martinsolev/how-to-access-micro-services-pods-in-kubernetes-that-are-not-publicly-available-2jjb</link>
      <guid>https://dev.to/martinsolev/how-to-access-micro-services-pods-in-kubernetes-that-are-not-publicly-available-2jjb</guid>
      <description>&lt;p&gt;Imagine this scenario: You are developing an API on your machine and everything works well, then you deploy it on a Kubernetes cluster. Now you want to test if the API works on Kubernetes, but without exposing it to the public.&lt;/p&gt;

&lt;p&gt;To demonstrate this, I have a fresh install of &lt;a href="https://kubernetes.io/docs/tasks/tools/install-minikube/"&gt;Minikube&lt;/a&gt; so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ kubectl get pods
No resources found.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I will deploy a simple &lt;strong&gt;echoserver&lt;/strong&gt; image to have something to make requests to.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;echoserver is like an API that returns (echoes) back what you sent it&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have a &lt;code&gt;yaml&lt;/code&gt; config in this &lt;a href="https://gist.github.com/solev/4ff8c43e0d003b99b76a99082196575c"&gt;gist&lt;/a&gt; for that&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://gist.githubusercontent.com/solev/4ff8c43e0d003b99b76a99082196575c/raw
deployment.apps/echoserver created
❯ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
echoserver-867b47487f-rhc62   1/1     Running   0          28s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The pod is running now and is configured to listen to port &lt;code&gt;8080&lt;/code&gt; as configured in the yaml. Now if we try to do a request, it will fail because the pod is not accessible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ curl localhost:8080?hello&lt;span class="o"&gt;=&lt;/span&gt;world
curl: &lt;span class="o"&gt;(&lt;/span&gt;7&lt;span class="o"&gt;)&lt;/span&gt; Failed to connect to localhost port 8080: Connection refused
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In order to access it, there is a command called &lt;code&gt;port-forward&lt;/code&gt; in &lt;strong&gt;kubectl&lt;/strong&gt; that lets you forward any request on your local machine to a specific deployment on kubernetes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ kubectl port-forward deployment/echoserver 3000:8080
Forwarding from 127.0.0.1:3000 -&amp;gt; 8080
Forwarding from &lt;span class="o"&gt;[&lt;/span&gt;::1]:3000 -&amp;gt; 8080
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;What this means is now every request on &lt;code&gt;localhost&lt;/code&gt; port &lt;code&gt;3000&lt;/code&gt; will be forwarded to the &lt;code&gt;echoserver&lt;/code&gt; pod on port &lt;code&gt;8080&lt;/code&gt;. So now if we try the same request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ curl localhost:3000?hello&lt;span class="o"&gt;=&lt;/span&gt;world
CLIENT VALUES:
&lt;span class="nv"&gt;client_address&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;, 56394&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;127.0.0.1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;GET
&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/?hello&lt;span class="o"&gt;=&lt;/span&gt;world
real &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/
&lt;span class="nv"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;world
&lt;span class="nv"&gt;request_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;HTTP/1.1

SERVER VALUES:
&lt;span class="nv"&gt;server_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;BaseHTTP/0.6
&lt;span class="nv"&gt;sys_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Python/3.5.0
&lt;span class="nv"&gt;protocol_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;HTTP/1.0

HEADERS RECEIVED:
&lt;span class="nv"&gt;Accept&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nv"&gt;Host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;localhost:3000
User-Agent&lt;span class="o"&gt;=&lt;/span&gt;curl/7.55.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And that's about it. Thanks for reading, catch ya in the next one.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
