What is Kubernetes?
Kubernetes is a container orchestration tool.
What is Docker?
Does Kubernetes offer features similar to Docker?
Kubernetes is an abstraction level higher than Docker. Roughly speaking, Kubernetes takes over the job of manually starting and stopping Docker containers.
How does Kubernetes work?
Kubernetes expects to receive the desired state of the system and you can express statements like “I need three nginx containers.” Kubernetes will then start these three containers. In addition, Kubernetes monitors the containers and restarts them if they crash. It can also display console output and monitor CPU usage, RAM usage and similar metrics.
What is a container?
A container is a simple Linux process that is restricted by Kernel functions (including chroot, setuid, cgroups) and is isolated in a way that from the process perspective, it is the only process in the system. Each container has its own file system and therefore only sees its own files.
What is the difference between containers and Docker?
Containers are a technology of the Linux kernel. Docker is a company that has built tools to create and manage Docker images and easily start and stop containers on a system. Docker also operates a large public registry, which is similar to the central Maven repository.
Is Docker mandatory for Kubernetes?
No. Kubernetes usually uses Docker, but can also use other container frameworks. The default case however is the combination of Kubernetes and Docker and it’s also what the vast majority uses.
Will Kubernetes stay in the market for at least the next five years?
Yes. All major cloud provider offer Kubernetes solutions or are currently working on providing one. For the cloud, Kubernetes is comparable to Spring or Jakarta EE in the Java eco system. Kubernetes was originally an internal Google tool, but now Microsoft (AKS) and Amazon (EKS) have also invested a lot to support an easy use of Kubernetes.
How do I run my application in Kubernetes?
If you want to run an application in Kubernetes, 12factor.net is extremely helpful! The essential points are:
- One artifact per application. That can be an EAR or WAR file or a single executable file, so anything that can run in a container
- No configuration in the artifact. So there should be no JDBC URLs hard coded in the Java file, for example. Instead, all configuration is provided from outside of the artifact, ideally via environment variables
- Disposability: The application should not cause any problems when it is restarted
Does a software developer have to master these technologies?
Yes. One of the ideas of the DevOps movement is that software development and operations should work more closely together to prevent information loss between departments.
So far, however, my feeling is that this is not the current practice in most companies. My impression is that some companies still have the classic departments for operations, which is responsible for maintaining servers and infrastructure. They cannot or don’t want to shut down these departments, so they try to transfer the support of Kubernetes to these departments.
Is there too much to learn for a single person?
Yes. Simple things can be done very quickly with Kubernetes, but if something doesn’t work or the workflows are more complex, it becomes very difficult for a single person to become familiar with all the parts. In this respect, Kubernetes is somewhat similar to the Spring Framework: It’s very powerful, but there are also a lot of modules and parts, each with a lot of depth. It’s very hard to understand the complete depth everywhere, but it’s possible to get a rough understanding of the most important parts.
Do you have the feeling that Kubernetes is worth the additional complexity?
Yes. My impression is that in the early days as a developer, you often had to take detours, like “we could actually use a Redis cache now, but it would take too much time to set up, so we will find another solution.” With the standardization that Kubernetes brings, adding additional infrastructure is almost as simple as adding another library to the project, which can increase development speed. It also allows developers to quickly try out new things, which helps in deciding which technology best fits their needs.
Another big advantage is that Kubernetes makes it easy to have parity between the stages, so that production and development environments are as similar as possible. This can help prevent bugs that only occur on production.
The standardization that Kubernetes brings should not be underestimated, either: It’s a bit like Maven, when you get into a project that uses Maven, you already know how the project is built, what dependencies it has and more. This allows new developers to quickly get an overview of the project.