Through Hackernews I found out about the recent release of Rancher Desktop and I was curious if this would be a good alternative to Docker desktop for the develop of web applications on my local machine. I don’t really have a problem with Docker desktop, just good to try something new every now and then and it is open-source. Running some containers really gets some steam out of my Mac so hopefully it has some improvement there. Also I like the idea of using Kubernetes, bringing the dev environment way closer to the production environment.
After installation the k3s “cluster” is available through kubectl:
$ k get nodes NAME STATUS ROLES AGE VERSION lima-rancher-desktop Ready builder,control-plane,master 4m48s v1.21.5+k3s2
To build images locally we’ll use kim; the build command is identical to docker build:
$ kim build -t hello-fastapi:0.1 .
When done we can find our image in the available images:
$ kim images IMAGE TAG IMAGE ID SIZE hello-fastapi 0.1 6f2734b232193 363MB moby/buildkit v0.8.3 cf14c5e88c0eb 56.5MB rancher/kim v0.1.0-beta.6 fef914df5da89 13.8MB
From the Kim registry, this image is directly available to our local Kubernetes cluster. So in this case we can deploy it to local with the following deployment file:
apiVersion: v1 kind: Service metadata: name: hello-fastapi spec: selector: app: hello-fastapi ports: - protocol: "TCP" port: 3000 targetPort: 80 type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: hello-fastapi spec: selector: matchLabels: app: hello-fastapi replicas: 2 template: metadata: labels: app: hello-fastapi spec: containers: - name: hello-fastapi image: hello-fastapi:latest imagePullPolicy: Never ports: - containerPort: 80
k apply -f local-deploy.yaml and the application is available on http://localhost:3000.
Keep reload capabilities for development
Running FastAPI with Uvicorn enables to auto-reload with the
--reload flag. We can map our local project as a volume to the container to keep auto-reload functionality for local development. Simply add the following lines to your
... command: [ "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80", "--reload" ] volumeMounts: - name: app-dev mountPath: /app volumes: - name: app-dev hostPath: path: /Users/<USERNAME>/path-to-app
Changing the files on your machine will trigger the reload and the update is directly available.