Kubernetes installation. (Not finished)
In this post I describe the installation process of a simple Kubernetes cluster. This post has not been finished yet.
Cluster concists from 3 nodes: 1 master node, 2 worker nodes, based on Fedora 35 and all VMs are running at Proxmox.
Node configuration
Following steps should be proceeded on the all hosts of the futere cluster:
Disable swap:
swapoff -a
Additionally, in order to avoid some issues during settin up I disabled Selinux.
swapoff -a
vim /etc/selinux/config # Set SELINUX=disabled
Created kubernetes.conf and kubernetes.conf files:
cat /etc/modules-load.d/kubernetes.conf
# networking
bridge
br_netfilter
# kata
vhost
vhost_net
vhost_vsock
Create kubernetes repo file. But, do not activate it.
vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=0
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
Installation
I am going to use cri-o as a container engine for kubernetes. Following steps should be perform for all hosts.
Check available versions of cri-o
dnf module list cri-o
And enable the last available version. In my case it is 1.22:
dnf module enable cri-o:1.22
Install necessary packages:
dnf install podman skopeo buildah runc cri-o cri-tools containernetworking-plugins bridge-utils telnet jq
Install kubectl,kubeadm,kubelet from the kubernetes repository.
dnf install --enablerepo=kubernetes {kubectl,kubeadm,kubelet}
Create /etc/sysconfig/kubelet
with the following content:
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd --fail-swap-on=false
Start and enable crio and kubelet services:
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now crio
$ sudo systemctl enable --now kubelet
I stopped and disabled firewalld service in order to quite the local firewall.
$ sudo systemctl disable --now firewalld
Nevertheless, disabling the local firewall is not an option in many cases. Therefore, following ports should be opened on the firewall if you do not want to quite the local firewall.
on master node:
$ firewall-cmd --add-port={6443,2379-2380,10250,10251,10252,5473,179,5473}/tcp --permanent
$ firewall-cmd --add-port={4789,8285,8472}/udp --permanent
$ firewall-cmd --reload
on worker nodes:
$ firewall-cmd --add-port={10250,30000-32767,5473,179,5473}/tcp --permanent
$ firewall-cmd --add-port={4789,8285,8472}/udp --permanent
$ firewall-cmd --reload
Initialize master (control) node:
Initialize an application subnet for the cluster
sudo kubeadm init --pod-network-cidr=10.85.0.0/16
.........
.........
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 192.168.11.71:6443 --token 44ph3l.4g2dyf2w1zlhsfea --discovery-token-ca-cert-hash sha256:44cbeb23b7d600e02c42690c6de03d5aa3cbad3dfec356fbb9afcb7c89e30574
Run suggested steps:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Check results on the master node:
[admin@kube-master1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-master1.ocp.home.lab Ready control-plane,master 14m v1.23.5
[admin@kube-master1 ~]$ kubectl describe node kube-master1.ocp.home.lab | grep NoSchedule
Taints: node-role.kubernetes.io/master:NoSchedule
[admin@kube-master1 ~]$ kubectl taint nodes --all node-role.kubernetes.io/master-
node/kube-master1.ocp.home.lab untainted
[admin@kube-master1 ~]$ kubectl describe node kube-master1.ocp.home.lab | grep NoSchedule
Initialize worker nodes
Run suggested steps from control plane initialization from the previous step.
sudo kubeadm join 192.168.11.71:6443 --token 44ph3l.4g2dyf2w1zlhsfea --discovery-token-ca-cert-hash sha256:44cbeb23b7d600e02c42690c6de03d5aa3cbad3dfec356fbb9afcb7c89e30574
And check result on the control node:
[admin@kube-master1 files]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-master1.ocp.home.lab Ready control-plane,master 3m32s v1.23.5
kube-worker2.ocp.home.lab Ready <none> 13s v1.23.5
Initialize cluster network.
I order to manage communication between clusters we need to install network operator. For these purpose I applied kube-flannel
.
Download kube-flannel.yml and edit it. Change network and type fields:
.....
net-conf.json: |
{
"Network": "10.85.0.0/16",
"Backend": {
"Type": "host-gw"
}
}
.....
And apply the file. This will install flannel.
kubectl apply -f kube-flannel.yaml
And check, if pod has been started:
[admin@kube-master1 files]$ kubectl get pods -n kube-system
....
kube-flannel-ds-slmth 1/1 Running 0 56s
......
Network i configured.
Let’s check node info:
[admin@kube-master1 ~]$ kubectl get node kube-master1.ocp.home.lab -o json | jq -r .status.nodeInfo
{
"architecture": "amd64",
"bootID": "f2e99e5f-fb80-4a43-874c-c453a7718acc",
"containerRuntimeVersion": "cri-o://1.22.3",
"kernelVersion": "5.16.18-200.fc35.x86_64",
"kubeProxyVersion": "v1.23.5",
"kubeletVersion": "v1.23.5",
"machineID": "e155c9da8fb44c0d9d39f78b8091257f",
"operatingSystem": "linux",
"osImage": "Fedora Linux 35 (Server Edition)",
"systemUUID": "95f225e2-3e81-4282-9a95-f3eee6ee12ac"
}
This post is not finished.