Featured image of post Kubernetes 설치

Kubernetes 설치

Kubeadm으로 클러스터 생성하기


prerequisite

container runtime

  • Use containerd (containerd, CRI-O, docker)
sudo apt-get update
sudo apt-get install -y \\
    ca-certificates \\
    curl \\
    gnupg \\
    lsb-release

sudo mkdir -p /etc/apt/keyrings
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \\
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] <https://download.docker.com/linux/ubuntu> \\
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install containerd.io=1.6.14-1
sudo apt-mark hold containerd.io

# Disabled cri plugin such as below line in config.toml after installing containerd package
# disabled_plugins = ["cri"]
# So, set the config to default
# Use SystemdCgroup and restart daemon
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd

network

  • overlay enables networking between nods
  • br_netfilter enables networking between pods
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

swap off

  • swap memory support from v 1.22
# Check swap memory
"swapon -s" or "free -h"

# Disable swap
sudo swapoff -a

# Disable swap on startup
sudo sed -i '/ swap / s/^\\(.*\\)$/#\\1/g' /etc/fstab

# Implementation after reboot
(crontab -l 2>/dev/null; echo "@reboot /sbin/swapoff -a") | crontab - || true

setup cluster

caution

  • pod’s CIDR block overlap

control-plane node

  • TBD: use public/private IP for api server address

  • pod-cidr: set according to your environment

    e.g. Use 10.244.0.0/16 host: 192…, docker: 172…

# Install packages needed to use the Kubernetes apt repository
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

# Download the Google Cloud public signing key:
sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg <https://packages.cloud.google.com/apt/doc/apt-key.gpg>

# Add the Kubernetes apt repository
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] <https://apt.kubernetes.io/> kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# Install
sudo apt-get update
apt-cache madison kubeadm | head -20

sudo apt-get install -y kubelet=1.26.0-00 kubeadm=1.26.0-00 kubectl=1.26.0-00
sudo apt-mark hold kubelet kubeadm kubectl

# Check packages
kubelet --version
kubeadm version
kubectl version --client

# Pre-pull the required control-plane images
kubeadm config images list --kubernetes-version=v1.26.0
sudo kubeadm config images pull --kubernetes-version=v1.26.0

# Set up the Kubernetes control plane
sudo kubeadm init --apiserver-advertise-address=<private-ip> --apiserver-cert-extra-sans=<private-ip> --pod-network-cidr=<pod-cidr> --node-name $(hostname -s)

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

kubectl get nodes
kubectl get namespaces
kubectl get pods -n kube-system

network plugins

  • Use calico cni
  • flannel: ‘10.244.0.0/16’, calico: ‘192.168.0.0/16’ …
  • To avoid overlapping, modify cidr to ‘10.244.0.0/16’
curl <https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico.yaml> -O
# Edit 'CALICO_IPV4POOL_CIDR' in calico.yml, if CIDR block is changed from default for avoiding overlap.
kubectl apply -f calico.yaml

kubectl describe node | egrep '^Name|PodCIDR'

helm

install

curl -fsSL -o get_helm.sh <https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3>
chmod 700 get_helm.sh
./get_helm.sh

helm version

reference

Read references while following below guide step by step