Deploying squid 🦑 in k3s on an RPI4B

Senthil Raja Chermapandian - Mar 7 '22 - - Dev Community

Author: Leon. A Devops Engineer. Loves Contributing to Opensource. Python and Golang Developer.

What is k3s?

K3s is lightweight Kubernetes which is easy to install and is a single binary under 100 MB by Rancher. One can read more about it here.

Installing K3s?

K3s provides an installation script that is a convenient way to install it as a service on systemd or openrc based systems. This script is available at https://get.k3s.io. To install K3s using this method, just run:

curl -sfL https://get.k3s.io | sh -

Enter fullscreen mode Exit fullscreen mode

After running this installation:

The K3s service will be configured to automatically restart after node reboots or if the process crashes or is killed
Additional utilities will be installed, including kubectl, crictl, ctr, k3s-killall.sh, and k3s-uninstall.sh
A kubeconfig file will be written to /etc/rancher/k3s/k3s.yaml and the kubectl installed by K3s will automatically use it

Why Squid?

Well I've been using Squid Proxy on my Raspberry Pi 2B for quite some time and I really wanted to get my hands dirty with Kubernetes.

What is Squid?

Taken from the ArchWiki Squid is a caching proxy for HTTP, HTTPS and FTP, providing extensive access controls.

Let's begin

I couldn't find a squid proxy container for my raspberry pi so I had to roll out my own Containerfile.

Now we can build this image with the version tag, this is important if you wish to rollout new changes to your application, having the latest flag is good having a version tag in your deployment is better, this is what I've observed and it's also a deployment strategy.

podman build squid-proxy:v1 .
Enter fullscreen mode Exit fullscreen mode

The problem now is how do I get Kubernetes to recognize this image that I've built? Since it's not on Docker Hub. I could, well deploy this to Docker Hub too, but, I didn't I instead spun up a docker registry container.

podman run -d -p 5000:5000 --restart on-failure --name registry registry:2

Enter fullscreen mode Exit fullscreen mode

Then I ran the following

podman build -t localhost:5000/squid-proxy:v1 .
podman push --tls-verify=false localhost:5000/squid-proxy:v1

Enter fullscreen mode Exit fullscreen mode

Note: The --tls-verify=false is required as we don't have TLS and the image push fails, since this is for learning purposes I've done it without TLS.

Deploying Squid🦑 to Kubernetes.

I'm still pretty new to Kubernetes, the basic unit of Kubernetes is a pod, a pod is something that can hold multiple containers within it. While I can deploy this within a pod directly I didn't, Kubernetes will do that for me via the deployment file.

If you want to get an overview of how Kubernetes works you can watch this video by @techworld_with_nana, Kubernetes Course

I decided to go this way, Create a LoadBalancer Service and a Deployment that would deploy SQUID to Kubernetes.

There is a volume folder that is common for both the containers since SQUID doesn't send logs to STDOUT

To run this you can simply do

$ kubectl apply -f squid-deployment.yml
deployment.apps/squid-dployment unchanged
service/squid-service unchanged

Enter fullscreen mode Exit fullscreen mode

This will create a Service and Deployment will create a pod

$ kubectl get service
$ kubectl get service

Enter fullscreen mode Exit fullscreen mode

Output

$ kubectl get svc
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
kubernetes      ClusterIP      10.43.0.1       <none>           443/TCP          48d
squid-service   LoadBalancer   10.43.114.127   192.168.31.151   3128:32729/TCP   3d14h

Enter fullscreen mode Exit fullscreen mode

To get the deployments

$ kubectl get deploy
$ kubectl get deployment

Enter fullscreen mode Exit fullscreen mode

Which will show the following

NAME              READY   UP-TO-DATE   AVAILABLE   AGE
squid-deployment   1/1     1            1           7d19h

Enter fullscreen mode Exit fullscreen mode

The last thing is to get the pods.

$ kubectl get po OR kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
squid-dployment-86bfc8d664-swwzj   2/2     Running   0          4d14h
svclb-squid-service-54nrc          1/1     Running   0          4d1h

Enter fullscreen mode Exit fullscreen mode

Once everything is up and running you can see the following in the curl headers.

Image description

To see the logs and follow them you can do the following.

kubectl logs service/squid-service -c tailer -f

Enter fullscreen mode Exit fullscreen mode

That's all.

This is a simple and easy deployment using Kubernetes, if I've made any mistakes or you would like to suggest any changes please drop a comment below <3

Join us

Register for Kubernetes Community Days Chennai 2022 at kcdchennai.in

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .