Kubeadm

Prerequisites

  1. Disable SELinux
  2. Disable firewalld
  3. Disable swap
  4. Add lines below to /etc/sysctl.conf
    net.bridge.bridge-nf-call-iptables=1
    net.ipv4.ip_forward=1
    net.bridge.bridge-nf-call-ip6tables=1</code>
    
  5. Probe modules
    modprobe overlay
    modprobe br_netfilter
    
  6. Add docker-ce repository
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
  7. Copy kubernetes.repo to /etc/yum.repos.d/kubernetes.repo

Installation

  1. Install packages
    yum install -y yum-utils, device-mapper-persistent-data, lvm2
    yum install -y kubeadm kubelet kubectl docker-ce
    
  2. Copy daemon.json to /etc/docker/daemon.json
  3. Start services
    systemctl enable docker
    systemctl start docker
    systemctl enable kubelet
    systemctl start kubelet
    

Initialize cluster

kubeadm init --config cluster.yaml --upload-certs
curl https://docs.projectcalico.org/manifests/calico.yaml -O
sed -i 's/192.168.0.0/10.42.0.0/g' calico.yaml  # Replace 10.42.0.0 with what's in cluster.yaml
kubectl apply -f calico.yaml

Join cluster

# Join as control plane
kubeadm join k8s.local:6443 \
  --token TOKEN \
  --discovery-token-ca-cert-hash SHA256 \
  --control-plane --certificate-key CERTKEY

# Join as worker
kubeadm join k8s.local:6443 \
  --token TOKEN \
  --discovery-token-ca-cert-hash SHA256

Reset cluster

kubeadm reset  # Make sure all printed directories are deleted

daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

kubernetes.repo

[kubernetes]
baseurl = https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
gpgcheck = 1
gpgkey = https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
name = Kubernetes YUM repository
repo_gpgcheck = 1

cluster.yaml

---
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: "192.168.2.10"
  bindPort: 6443

---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: 1.17.2
clusterName: kubernetes
controlPlaneEndpoint: "k8s.local:6443"
apiServer:
  extraArgs:
    authorization-mode: Node,RBAC
  certSANs:
  - k8s
  - k8s.local
networking:
  dnsDomain: cluster.local
  podSubnet: "10.42.0.0/16"
  serviceSubnet: "10.43.0.0/16"