How do I safely upgrade it without downtime? Ensuring that the new version starts up properly and can receive traffic before sending it requests and stopping the old one?
With k8s: kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1 (or just use kubectl apply -f)
With your nginx config: ????
At which point, sure, use Kubernetes.
Still A single service on a single machine, how do I safely upgrade it?
A rolling deployment in k8s does work the same way on a single host with minikube as it does on a 1000 node cluster, but I'm still just asking about the single host case.
Depending on your OS-package's provided init script (here Ubuntu), it's as simple as `service nginx reload`, (`service nginx upgrade` if upgrading nginx itself).
Or skip the init script entirely with `/usr/sbin/nginx -s reload`.
Or
kubectl apply -f app.yaml
Which is less complex?
At minimum it requires good-enough health checks so that k8s can detect if the new config doesn't work, and automatically rollback, otherwise you're looking at "no downtime except when there's a mistake" situation.
...and to really check that the health check and everything else in your .yaml file actually works, you will probably have to spin up another instance just so that you can verify your config, unless you like debugging broken configs on live. Well, of course you can always fix your mistake and go "kubectl reaplce -f", but that kinda goes against the requirement of "no downtime".
I grant that k8s makes it easier to spin up a new instance for testing.
Lets not make it more difficult than it has to be.
Let's not pretend that blindly upgrading a package is the same thing as safely rolling out the new version of a service.
Also we're talking simple projects, and simple projects are typically not distributed; typically don't need to be distributed.
That said, supporting multiple backends with different load balancing algorithms is also pretty simple to write as well.