Introduction to Kubernetes Networking¶
Estimated time to read: 4 minutes
- Originally Written: February, 2020
With every new technology comes a learning curve and Kubernetes is no exception. In this four-blog series we will look inside the blackbox that is Kubernetes networking to address the following topics:
- Container-to-Container communications
- 2. Pod-to-Pod communications (CNI Plugin)
- 3. How we can track pods and provide external access (Kubernetes Service)
- 4. Rule based routing (Kubernetes Ingress)
1. Container to Container Communications¶
The smallest object we can deploy in Kubernetes is the pod, however within each pod you may want to run multiple containers. A common usecase for this is a helper where a secondary container helps a primary container with tasks such as pushing and pulling data.
Container to container communication within a K8s pod uses either the shared file system or the localhost network interface.
We can test this by using the K8s provided example, two-container-pod, and modifying it slightly.
https://k8s.io/examples/pods/two-container-pod.yaml
When we deploy this pod we can see two containers, nginx-container
and debian-container
. I’ve created two separate options to test, one with a shared volume, and one without a shared volume but using localhost instead.
Shared Volume Communication¶
When we use the shared volume, Kubernetes will create a volume in the pod which will be mapped to both containers. In the nginx-container
, files from the shared volume will map to the /usr/share/nginx/html
directory, while in the debian-container
files will map to the /pod-data
directory. When we update the index.html
file from the Debian container, this change will also be reflected in our Nginx container, thereby providing a mechanism for our helper (Debian) to push and pull data to and from Nginx.
Localhost Communication¶
In the second scenario shared volume has been removed from the pod and a message has been written in the index.html
file which only resides in the Nginx container. As previously mentioned, the other method for multiple containers to communicate within a pod is through the localhost
interface and the port number to which they’re listening.
In this example Nginx is listening on port 80
, therefore when we run the curl https://localhost
command from the Debian container we can see that the index.html
page is served back to us from Nginx.
Here’s the nginx-container
showing the contents of the index.html
file.
Confirmation that we’re receiving the file when we Curl from the debian-container
References¶
- https://kubernetes.io/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/
- https://kubernetes.io/docs/concepts/storage/volumes/
- https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/