In this article we are going to cover How to Install Kubernetes Cluster on Ubuntu 20.04 LTS with kubeadm or any other cloud platform like Amazon EC2, Azure VM, Google Cloud Compute,etc. with preinstalled Ubuntu 20.04 LTS.
Table of Contents
Prerequisites
- 2 or 3 Ubuntu 20.04 LTS System with Minimal Installation
- Minimum 2 or more CPU, 3 GB RAM.
- Disable SWAP on All node
- SSH Access with sudo privileges
Firewall Ports/Inbound Traffic Ports for Kubernetes Cluster
Control-plane node(s)
Protocol | Direction | Port Range | Purpose | Used By |
---|---|---|---|---|
TCP | Inbound | 6443* | Kubernetes API server | All |
TCP | Inbound | 2379-2380 | etcd server client API | kube-apiserver, etcd |
TCP | Inbound | 10250 | Kubelet API | Self, Control plane |
TCP | Inbound | 10251 | kube-scheduler | Self |
TCP | Inbound | 10252 | kube-controller-manager | Self |
Worker node(s)
Protocol | Direction | Port Range | Purpose | Used By |
---|---|---|---|---|
TCP | Inbound | 10250 | Kubelet API | Self, Control plane |
TCP | Inbound | 30000-32767 | NodePort Services† | All |
Disable swap
swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
Also comment out the reference to swap in /etc/fstab. Start by editing the below file:
sudo nano /etc/fstab
Reboot the system to take effect
sudo reboot
Update the system Packages
sudo apt-get update
#1. Install Docker Container Runtime on All node (Master and Worker Nodes)
Install below packages if not installed
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
Add the Docker official GPG Key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Add the Docker APT repository
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Update the System Packages
sudo apt-get update -y
Install docker community edition and container runtime on both master and worker node
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
Add the Docker Daemon configurations to use systemd as the cgroup driver.
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
Check docker images
docker images
ERROR:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json: dial unix /var/run/docker.sock: connect: permission denied
Solution:
Add the docker user in group and give permission for docker.sock
sudo usermod -aG docker $USER
Change the docker.sock permission
sudo chmod 666 /var/run/docker.sock
Start the Docker service if not started
sudo systemctl start docker.service
To check the docker service status
sudo systemctl status docker.service
Enable Docker service at startup
sudo systemctl enable docker.service
Restart the Docker service
sudo systemctl restart docker
#2. Add Kubernetes GPG Key on All node
Add Kubernetes GPG key in all node.
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
#3. Add Kubernetes APT Repository on All node
Add Kubernetes apt repository on all node for Ubuntu.
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
update the system packages
sudo apt-get update
#4. Install Kubeadm,Kubelet and Kubectl on All Node
Install kubeadm,kubelet and kubectl using below command.
sudo apt-get install -y kubelet kubeadm kubectl
Hold the packages to being upgrade
sudo apt-mark hold kubelet kubeadm kubectl
How to Install Kubernetes Cluster on Ubuntu 20.04 LTS with kubeadm
#5. Initialize the Master node using kubeadm (on Master Node)
Next initialize the master node using kubeadm.
sudo kubeadm init --pod-network-cidr 10.0.0.0/16
Output:
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 172.31.6.177:6443 --token vr5rat.seyprj6jvw4xy43m \ --discovery-token-ca-cert-hash sha256:4c9b53eb03744b4cf21c5bdacd712024eb09030561714cc5545838482c8017b3
As above output mentioned copy the token in your notepad, we will need to join worker/slave to master node
Create new ‘.kube’ configuration directory and copy the configuration ‘admin.conf’ from ‘/etc/kubernetes’ directory.
sudo mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
To check kubeadm version.
kubeadm version
To check master node status
kubectl get nodes
#6. Configure Pod Network and Verify Pod namespaces
Install the Weave network plugin to communicate master and worker nodes.
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
Output:
serviceaccount/weave-net created clusterrole.rbac.authorization.k8s.io/weave-net created clusterrolebinding.rbac.authorization.k8s.io/weave-net created role.rbac.authorization.k8s.io/weave-net created rolebinding.rbac.authorization.k8s.io/weave-net created daemonset.apps/weave-net created Check node status
#7. Join Worker Node to the Cluster
Next Join two worker nodes to master.
sudo kubeadm join 172.31.6.177:6443 --token vr5rat.seyprj6jvw4xy43m --discovery-token-ca-cert-hash sha256:4c9b53eb03744b4cf21c5bdacd712024eb09030561714cc5545838482c8017b3
Output:
This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Check the All node status
sudo kubectl get nodes
Output:
Status: NAME STATUS ROLES AGE VERSION ip-172-31-16-180 Ready master 3m19s v1.20.5 ip-172-31-16-86 Ready worker1 6m15s v1.20.5 ip-172-31-21-34 Ready worker2 3m23s v1.20.5
To Verify Pod namespaces
sudo kubectl get pods --all-namespaces
Output:
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-6955765f44-7sw4r 1/1 Running 0 6m46s kube-system coredns-6955765f44-nwwx5 1/1 Running 0 6m46s kube-system etcd-ip-172-31-16-86 1/1 Running 0 6m53s kube-system kube-apiserver-ip-172-31-16-86 1/1 Running 0 6m53s kube-system kube-controller-manager-ip-172-31-16-86 1/1 Running 0 6m53s kube-system kube-proxy-b5vht 1/1 Running 0 4m5s kube-system kube-proxy-cm6r4 1/1 Running 0 4m1s kube-system kube-proxy-jxr9z 1/1 Running 0 6m45s kube-system kube-scheduler-ip-172-31-16-86 1/1 Running 0 6m53s kube-system weave-net-99tsd 2/2 Running 0 93s kube-system weave-net-bwshk 2/2 Running 0 93s kube-system weave-net-g8rg8 2/2 Running 0 93s
We have covered Install Kubernetes cluster on Ubuntu.
#8. Deploy Sample Nginx microservice on Kubernetes
Lets create a deployment on master node named “nginx-deploy” using YAML.
sudo nano nginx-deploy.yaml
Deployment YAML file should like below
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx-app spec: replicas: 1 selector: matchLabels: app: nginx-app template: metadata: labels: app: nginx-app spec: containers: - name: nginx-container image: nginx:latest ports: - containerPort: 80
Lets create a pod using kubectl command
kubectl apply -f nginx-deploy.yaml
Output:
deployment.apps/nginx-deployment created
Lets check Pod status
kubectl get pods
To check Pods all information
kubectl describe pods
To check pods IP address and its states
kubectl get pods -o wide
Expose the Nginx deployment using kubernetes nodeport (32001) service
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Service metadata: name: nginx-app spec: selector: app: nginx-app type: NodePort ports: - port: 80 targetPort: 80 nodePort: 32001 EOF
Now access the nginx service by using worked node IP and port 32001
To delete pod
kubectl delete pod fosstechnix-web-pod(pod name)
OR
kubectl delete -f fosstechnix-web-pod.yml
Conclusion:
In this article, We have covered How to Install Kubernetes Cluster on Ubuntu 20.04 LTS with kubeadm, Initializing master node, creating pod network,join worker/slave node to master, creating pod using YAML , checking the status of node,pod,namespace and deleting pod.
Troubleshooting:
[preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR DirAvailable--etc-kubernetes-manifests]: /etc/kubernetes/manifests is not empty [ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists [ERROR Port-10250]: Port 10250 is in use [ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher
Solution:
Reset the kubeadm and join again
sudo kubeadm reset
We have covered How to Install Kubernetes Cluster on Ubuntu 20.04 LTS.
Wonderful steps and process ,very helpful .Thank you very much .
Thanks for your feedback.
when i trying to install kubeadm [ kubeadm init]
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”. Please follow the guide at https://kubernetes.io/docs/setup/cri/
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR DirAvailable–etc-kubernetes-manifests]: /etc/kubernetes/manifests is not empty
[ERROR FileAvailable–etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists
[ERROR Port-10250]: Port 10250 is in use
[ERROR FileAvailable–etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists
[preflight] If you know what you are doing, you can make a check non-fatal with `–ignore-preflight-errors=…`
To see the stack trace of this error execute with –v=5 or higher
[init] Using Kubernetes version: v1.26.0
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR CRI]: container runtime is not running: output: E1227 02:44:45.846458 9982 remote_runtime.go:948] “Status from runtime service failed” err=”rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService”
time=”2022-12-27T02:44:45Z” level=fatal msg=”getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService”
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `–ignore-preflight-errors=…`
To see the stack trace of this error execute with –v=5 or higher
I have deployed the document and cannot launch step “Initialize the Master node using kubeadm (on Master Node)”
Hi,
please check this link is not working.getting 500 error
https://packages.cloud.google.com/apt/doc/apt-key.gpg
Thanks for update, I will update.