Install K8S with CRI-O and kadalu

In this post I will show you how to install cri-o container runtime and initialize a Kubernetes.

Parst of the Kubernetes series

What is CRI-O?

The Kubernetes project has defined a number of standards. One of them is cri. The Container Runtime Interface. This interface defines how Kubernetes talks with a high-level container runtime. CRI-O is an implementation of the Kubernetes CRI to enable using OCI (Open Container Initiative) compatible runtimes. It is a lightweight alternative of Docker as the runtime for kubernetes. t allows Kubernetes to use any OCI-compliant runtime as the container runtime for running pods. Today it supports runc and Kata Containers as the container runtimes but any OCI-conformant runtime can be plugged in principle.

Install CRI-O instad of Docker

sudo curl -L -o /etc/yum.repos.d/devel_kubic_libcontainers_stable.repo
sudo curl -L -o /etc/yum.repos.d/devel_kubic_libcontainers_stable_cri-o_${VERSION}.repo${VERSION}/CentOS_7/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo

yum install cri-o


modprobe overlay
modprobe br_netfilter

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1

sysctl --system
free -h
swapoff -a
swapoff -a
sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab
free -h

You nee the same cgroup manager in cri-o and kubeadm. The default for kubeadm is cgroupfs and for cri-o the default is systemd. In this example I configured cri-o for cgroupfs.

nano /etc/crio/crio.conf
cgroup_manager = "cgroupfs"
registries = [

If yo want to use systemd:

echo "KUBELET_EXTRA_ARGS=--cgroup-driver=systemd" | tee /etc/sysconfig/kubelet

Install kubernets

cat <<EOF > /etc/yum.repos.d/kubernetes.repo

CRIP_VERSION=$(crio --version | awk '{print $3}')
yum install kubelet-$CRIP_VERSION kubeadm-$CRIP_VERSION kubectl-$CRIP_VERSION
# for multi interface configuration
echo 'KUBELET_EXTRA_ARGS="--node-ip='$IP'"' > /etc/sysconfig/kubelet

systemctl enable kubelet.service
systemctl enable --now cri-o
kubeadm init --pod-network-cidr= --apiserver-advertise-address=$IP --cri-socket=unix:///var/run/crio/crio.sock

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

crictl info
kubectl get node -o wide
kubectl get po --all-namespaces

Inincialize network

kubectl aplly -f kube-flannel.yml
kubectl create -f
kubectl create -f /vagrant/scripts/custom-resources.yaml

Install tools

yum install git -y

sudo git clone /opt/kubectx
sudo ln -s /opt/kubectx/kubectx /usr/local/sbin/kubectx
sudo ln -s /opt/kubectx/kubens /usr/local/sbin/kubens

Deploy kadalu storage

sudo wipefs -a -t dos -f /dev/sdb
sudo mkfs.xfs /dev/sdb

yum install python3-pip -y
sudo pip3 install kubectl-kadalu

echo "export PATH=$PATH:/usr/local/bin/" >> /etc/profile
source /etc/profile

kubectl kadalu install

# k8s.mydomain.intra is the nod name in Kubernetes
# /dev/sdb is the disk

kubectl kadalu storage-add storage-pool-1 \
    --device k8s.mydomain.intra:/dev/sdb

# to delete object if you misconfigured kadalu
kubectl delete storage-pool-1

kubectl get pods -n kadalu

kubectl patch storageclass kadalu.replica1 -p '{"metadata": {"annotations":{"":"true"}}}'
nano test-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
  name: pv1
  storageClassName: kadalu.replica1
    - ReadWriteMany
      storage: 1Gi