Symfony4 Kubernetes Local Development Environment #3 Ksync

UPDATE: because of volume speed issues on OSX (and ksync not always smoothly working) and high CPU usage (1 2 3 …) when running Kubernetes locally I sadly cannot recommend k8s for local development atm. This article series was my exploration into if it’s feasible. If you have tips or suggestions please let me know. I’m running again on a docker-compose and Kubernetes combination.

Because of the investigated speed issued in part2 we will now install Ksync and set it up.

You can checkout git@github.com:wuestkamp/kubernetes-local-dev.git branch part2 and apply the steps in this article yourself or checkout branch part3 where this has already been done and just play around.

These steps now are based on branch part2. Make sure our infrastructure is loaded using run/up.sh. We should see something like this:

curl https://vapor-ware.github.io/gimme-that/gimme.sh | bash
ksync init # will install the necessary cluster server components

Now we run ksync watch in a separate terminal. I like to leave this open to see the output for debugging. We could also run ksync watch -d for daemon mode.

With ksync get we see configured sync processes and with ksync delete we can delete a single one or do ksync delete --all. Right now ksync get should show nothing, so let’s create one.

The following command will show the last 20 logs and new ones coming in, so while configuring I like to leave this running.

kubectl logs `kubectl get pods -n kube-system | grep ksync | awk '{print $1;}'` -c syncthing -n kube-system -f --tail 20
ksync create --selector=id=sf -c php $(pwd)/symfony /var/www/symfony

This will synchronize the local folder $(pwd)/symfony with the remote folder /var/www/symfony on the container php of each pod with label id=sf.

We see in the Ksync logs that a lot is happening, but if we ssh into our pod and php container we aren’t actually seeing any files. This is because Ksync and volumes sadly do not work together. So let’s remove the folder sync for now with ksync delete --all.

Apparently Ksync can’t sync if the remove directory is a Kubernetes volume, which we have currently configured. So we change our sf-deployment.yaml to something like this where I just commented out our volume handling:

Now we run run/down.sh and run/up.sh and create our folder sync again with:

ksync create --selector=id=sf -c php $(pwd)/symfony /var/www/symfony

Let’s check ksync get:

Nice. Watching at the Ksync log (as written above) there seems to be a lot of initial file syncing happening which might take some time to finish.

But calling http://localhost:80 in our browser results in the assets not being loaded and it looks like this:

To solve this we need to create a second sync of the public folder to our nginx container.

ksync create --selector=id=sf -c nginx $(pwd)/symfony/public /var/www/symfony/public

Once this run through ksync get should show:

Then our browser should show (maybe do a hard refresh):

I mean that’s why we do this in the first place! Let’s change something in the template main.html.twig , then check out logs and finally our browser.

For me it takes like ~one second to transfer the change. This is workable with. And we have almost local request times of ~20ms. Nice!

(optional) We can also use the Ksync visualizer instead of checking the logs. For this run:

kubectl create -f https://vapor-ware.github.io/ksync/example/frontend/frontend.yaml

Wait for the container to be created, check for example with our run/info.sh command. This might take a minute. Then run:

kubectl get po \
--selector=app=frontend \
-o=custom-columns=:metadata.name \
--no-headers \
| xargs -IPOD kubectl port-forward POD 8081:80 &

And finally open http://localhost:8081/ in your browser. I am just seeing an empty page of a React App here though :) Maybe it works for you! Till then, I’ll stick to console logs!

You can remove it again like so:

kubectl delete -f https://vapor-ware.github.io/ksync/example/frontend/frontend.yaml

I know. Firstly there are so many commands to run! Let’s create a script for those at run/ksync.sh:

Then we changed our Kubernetes infrastructure (removed the shared volume from our containers) just so we can run Ksync? Not cool! We will fix this in the next part when configuring Helm.

I can say it’s working and speed is ok. We have a script run/ksync.sh which sets up synchronization.

But there is still a long initial sync which could be annoying. And we did have to change our Kubernetes config to make this running locally. We will solve this *hopefully* in the next part by using Helm.

PART FOUR

wuestkamp.com | killer.sh (CKS CKA CKAD Simulator) | Software Engineer, Infrastructure Architect, Certified Kubernetes, Certified Symfony