Debian 12 安装 Kubernetes(k8s) + docker ,配置主从节点

记录 Kubernetes 的安装与配置步骤。Kubernetes 有多种安装方式,本文使用 kubeadm。

#机器们

  • va, Master 节点
  • ca, Worker 节点
  • kr, Worker 节点

#准备工作

更新系统到最新,然后移除不再需要的软件,清理无用的安装包。

sudo apt update && sudo apt full-upgrade -y
sudo apt autoremove
sudo apt autoclean

如果更新了内核,重启。

Kubernetes 的机器不能有 swap 分区,所以要卸载 swap 分区。

sudo swapoff -a

然后编辑 /etc/fstab 文件,注释或删除 swap 那行(如有)。

开启转发等:

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

根据 kubernetes 官方文档,要安装官方版本的 docker,因此按照 docker 官方文档安装。

#安装 docker

删除非官方安装的 docker,如果你看过本站对于 docker 的介绍,那就需要卸载非官方 docker。对于 Docker 官方的版本 和 Debian 仓库中维护的版本的区别,Debian 仓库中的 Docker 版本低一些,有没有其区别不确定。

卸载非官方版本 Docker,因为会与官方版本冲突。

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

官方文档 安装

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

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

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动 docker 并设置开机自动运行

sudo systemctl enable docker --now

注意,官方 Docker 与 Debian 仓库里的 docker-compose 不同,官方 Docker 用 docker compose 来 compose,compose 作为一个插件,Debian 仓库中的 docker-compose 用 docker-compose 来 compose。

#安装 cri-dockerd

cli-dockerd 是 Kubernetes 控制 Docker 的中间层。cri: container runtime interface

git clone https://github.com/Mirantis/cri-dockerd.git
cd cri-dockerd
make cri-dockerd
sudo mkdir -p /usr/local/bin
sudo install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
sudo install packaging/systemd/* /etc/systemd/system
sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket

注意,自行编译 cri-dockerd 需要 golang,如果提示找不到 go,安装 goalng: sudo apt install golang

如果后面的命令遇到 socket 问题无法连接,重启服务器,暂时关闭防火墙等。

#安装 kubeadm, kubelet and kubectl

这部分依旧来自官方文档 注意虽然我们在 Debian 11/12 上安装,但是依旧是 xenial(Ubuntu 16.04 LTS) 的源。

sudo apt-get update
sudo apt-get install -y apt-transport-https
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
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
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 关闭这三个程序的自动更新

至此,Kubeadm 安装完成

#配置集群

官方文档

一个很重要的问题是网络,k8s 集群中有很多台计算机,但是对外只有一个网络接口,比如你在 k8s 上运行一个网站,那么只能通过一个 ip 地址访问这个网站,但是集群中的每一台计算机都需要一个 ip 地址来通信,这个地址可以是私有地址,也可以是公网地址。k8s 本身不提供网络解决方案,需要安装插件官方文档:installing addons

这里选用了 https://www.tigera.io/project-calico/,不同插件操作方法略有不同。

#设置 master 节点

初始化:

sudo kubeadm init --pod-network-cidr 192.168.0.0/16 --cri-socket unix:///var/run/cri-dockerd.sock --control-plane-endpoint master-node-01.acytoo.net

如果服务器本身没有公网 ip ,需要指定的 endpoint,可以是域名,也可以是 ip 地址。

如果一切正常,会得到下面这样的输出。

记下输出中的 kubeadm join 命令,接下来添加工作节点需要 Token,每个 Token 默认 24 小时后过期

Token 过期或者忘记,可以使用 kubeadm token create --print-join-command 直接生成一个新的。

根据提示,下一步操作。

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

然后,安装网络插件 calico.

#安装 Calico

目前版本 3.26.1,请到官网找最新版本 docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises

curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
kubectl apply -f calico.yaml

至此,主节点就设置好了,查看状态。

kubectl get node
kubectl get pod
kubectl get pods --all-namespaces

默认情况下,出于安全的考虑,不能在主节点上跑 pod。

#设置 worker 节点

使用 kubeadm join 命令,在一台已经安装了 kubeadm 等程序的服务器上,执行

sudo kubeadm join master-node-01.acytoo.net:6443 --token sluqvx.itdsjivbewuiinfx \
        --discovery-token-ca-cert-hash sha256:95669c834aa9e861aed6a08783d1f893223ec327ad2612aba016c2b457afb2345 \
        --cri-socket unix:///var/run/cri-dockerd.sock

worker 节点也需要安装 calico。

#可能的 error

我在配置时,遇到了很多问题,绝大多数通过命令行的 error 提示,都能明白哪里出问题了,比如,cri-socket 服务无法启动,看看是否安装正常,手动调用,然后重启;或者端口占用,指定 cri-socket 等等。

唯一困扰我较长的问题是,worker 遇到 socket 8080 连接不上的问题(使用 kubectl get nods 输出 8080 拒绝连接),使用 kuneadm join 是 NotReady 状态,网上有很多讨论,很多人说 worker 节点也要有 $HOME/.kube/config/admin.conf 文件,但我先 init,再 join 也不行。最后在主节点删除了出问题的 worker 节点,重新运行一次相同的命令就通了,没有 admin.conf 文件。

在主节点删除 worker node:

kubectl drain [node name] --ignore-daemonsets
kubectl delete node [node name]

#查看状态

回到主节点,查看 node。

#结语

Kubernetes 可配置项多,安装工具多,安装方法多,本文使用 kubeadm 方法安装,calico 做为网络插件。理论上支持 Debian 10/11/12 以及以 Debian 为基础的其他发行版,如 Ubuntu 等。

#参考

installing-kubeadm-kubelet-and-kubectl

create-cluster-kubeadm

installing addons