Install k8s cluster on debian

An step by step guide to install k8s cluster on debian 12

Machine initialization

1. Disable swap

Run sudo swapoff -a then configure /etc/fstab

2. Configure kernel parameters

1
2
3
4
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
1
2
sudo modprobe overlay
sudo modprobe br_netfilter
1
2
3
4
5
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
1
sudo sysctl --system

3. Install containerd

1
2
sudo apt update
sudo apt -y install containerd

4. Configure containerd

Config file is in /etc/containerd/config.toml

  1. Generate default containerd config file
1
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
  1. Set cgroup driver to systemd.
1
2
3
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
-   SystemdCgroup = false
+   SystemdCgroup = true
  1. Change pause image
1
2
3
  [plugins."io.containerd.grpc.v1.cri"]
-   sandbox_image = "registry.k8s.io/pause:3.6"
+   sandbox_image = "registry.k8s.io/pause:3.10"

In China use registry.aliyuncs.com/google_containers/pause:3.10 instead.

  1. Restart containerd
1
2
sudo systemctl restart containerd
sudo systemctl enable containerd

5. Install Kubernetes Tools

Follow Installing kubeadm, kubelet and kubectl

In China follow https://developer.aliyun.com/mirror/kubernetes to use mirror.

  1. Install prerequisite packages.
1
2
3
sudo apt update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt install -y apt-transport-https ca-certificates curl gpg
  1. Configure repository keyrings
1
2
export K8S_VERSION=v1.32
sudo mkdir -p -m 755 /etc/apt/keyrings
1
2
curl -fsSL "https://pkgs.k8s.io/core:/stable:/${K8S_VERSION}/deb/Release.key" | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${K8S_VERSION}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

In China use:

1
2
curl -fsSL "https://mirrors.aliyun.com/kubernetes-new/core/stable/${K8S_VERSION}/deb/Release.key" | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/${K8S_VERSION}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  1. Install tools
1
2
3
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
# sudo apt-mark hold kubelet kubeadm kubectl
  1. Enable service
1
sudo systemctl enable --now kubelet

In this time journalctl -f -u kubelet should failure by error: failed to load Kubelet config file /var/lib/kubelet/config.yaml, it’s ok, we will fix it later.

Install k8s cluster

0. Configure hostnames

Configure hostname

1
2
3
sudo hostnamectl set-hostname "k8s-master.local"    // Run on master node
sudo hostnamectl set-hostname "k8s-worker-01.local" // Run on 1st worker node
sudo hostnamectl set-hostname "k8s-worker-02.local" // Run on 2nd worker node

Configure /etc/hosts

1
2
3
192.168.5.100  k8s-master.local     k8s-master
192.168.5.101  k8s-worker-01.local  k8s-worker-01
192.168.5.102  k8s-worker-02.local  k8s-worker-02

1. Install k8s cluster with kubeadm (run on control panel node)

Create kubelet.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: '1.32.0' # Replace with your desired version
controlPlaneEndpoint: 'k8s-master' # Replace with your desired control plane endpoint
imageRepository: registry.k8s.io
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration

In China use imageRepository: registry.aliyuncs.com/google_containers.

Install control panel

1
sudo kubeadm init --config kubelet.yaml

Use sudo kubeadm reset if you want to reset k8s cluster.

Configure default kube config

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

2. Join k8s cluster with kubeadm (run on worker nodes)

1
2
sudo kubeadm join k8s-master:6443 --token 21nm87.x1lgd4jf0lqiiiau \
    --discovery-token-ca-cert-hash sha256:28b503f1f2a2592678724c482776f04b445c5f99d76915552f14e68a24b78009

3. Check k8s cluster status (run on control panel node)

1
sudo kubectl get nodes

Setup Pod Network

1. Install Calico (run on control panel node)

Install Calico

1
sudo kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/calico.yaml

In China:

1
2
curl -sSLO https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/calico.yaml
sed -i 's/docker.io/dockerhub.icu/g' calico.yaml

Verify

1
sudo kubectl get pods -n kube-system

When finished, you should see the calico-node pod running by sudo kubectl get pods -n kube-system and see all nodes ready by sudo kubectl get nodes.

Test

1
2
3
sudo kubectl create deployment nginx-app --image=nginx --replicas 2
sudo kubectl expose deployment nginx-app --name=nginx-web-svc --type NodePort --port 80 --target-port 80
sudo kubectl describe svc nginx-web-svc

Curl using either of worker node’s hostname

1
curl http://k8s-worker-01:32283

Reference

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计