Here, we’ll show the easiest way to create a single node Kubernetes cluster on Ubuntu 16.04. This can be dones in VMs or physical machines.
kubeadmis in alpha state and is not supposed to be used in production. This cluster should be used for tests/development.
- In production, it is recommended that the master node be exclusive for the k8s pods, and not for regular pods, as we’ll do here with
SSH to your machine. And preferrably run all the following commands as
root user. Just do:
sudo su -
Install some packages
Add some source repos and install packages such as
kubeadm itself. Just run the following lines:
apt-get update && apt-get install -y apt-transport-https curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y docker.io kubelet kubeadm kubectl kubernetes-cni
Wait a couple minutes and then your cluster is almost ready.
In most cases, the default configuration of
init should work. If you want to install a verstion different than the stable, you must provide the option
--kubernetes-version and provide a valid version. See releases page.
For example, to install the version
v1.8.0-alpha.3, just run it with:
kubeadm init --kubernetes-version='v1.8.0-alpha.3'
The output of
init should look like this:
Accessing the cluster
Once completed the
init, the cluster should be ready and accessible via
kubectl, the Kubernetes CLI. By default, it looks for credentials in
~/.kube/config file. If you don’t have anything in there, you should hit an error.
The easisest way to get a credentials file is copying the
admin.conf created by
kubeadm and place it in the default location. Do it with:
mkdir ~/.kube cp /etc/kubernetes/admin.conf ~/.kube/config
Now, you should be able to run commands such as
kubectl get pods --all-namespaces.
Tainting the Master node
As stated before, master node should not receive nothing but the main Kubernetes pods, such as
kube-dns and others. But as this is a dev environment, there should be no problem in marking this node as schedulable, so you can have a single node fully working cluster.
Enable scheduling of regular pods in the master with:
kubectl taint nodes --all node-role.kubernetes.io/master-
Installing a CNI plugin
Kubernetes needs a network controller, that is self-hosted and installed as a plugin. You must install a pod network add-on so that your pods can communicate with each other. Here, we’ll use Calico. To install it in a single command, just run:
kubectl apply -f https://docs.projectcalico.org/v2.5/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml
This command works for clusters of version >= 1.6. If your version is older, look for it in the calico page
If you want to see other Network plugins, look here.
Check if it works
Once you’ve installed the network plugin, you now only need to check whether all pods are running correctly. Monitor it with:
watch kubectl get pods --all-namespaces
And wait for all pods to be
Optional: Join other nodes
If you want more than one node in your cluster, join others after you finish the instalation of the master. In the output of
kubeadm init you should see the
join command. More info here.
And that’s it! You have a running Kubernetes cluster. To more details on this process, check the official documentation.
This tutorial is also avaiable here in my Github.