内容适用的情况:多台实体机器(内网互联)。

使用 docker 作为容器运行时。

系统使用:debian。

安装 kubelet kubeadm kubectl

一次运行以下命令即可。

安装所需的工具

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

下载 k8s 仓库的谷歌公钥

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

将 k8s 仓库添加到 apt 中

echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

使用 apt 安装

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

docker 作为容器运行时

按照另一篇博客中方法:k8s 使用 docker 作为容器引擎 (kicey.site)

代理

k8s 的容器仓库在国内访问不到,需要设置代理或者镜像仓库,这里为了避免麻烦直接使用了代理(这里设置的是 docker 的代理)。

编辑文件 /usr/lib/systemd/system/docker.service

[Service]
Type=notify
Environment="HTTP_PROXY=http://ip:port" # http代理
Environment="HTTPS_PROXY=http://ip:port" # https代理
#Environment="NO_PROXY=ip/dns"  # 不需要走代理的地址

(改为自己的代理地址,可以使用 v2ray 在容器中启动一个代理客户端,提一下不展开。)

关闭 swap

编辑文件 /etc/fstab

注释掉 swap 挂载的语句

检查并拉取镜像

现在可以执行 `sudo kubeadm init phase preflight --

sudo kubeadm init phase preflight --apiserver-advertise-address=192.168.x.x --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock

注意 apiserver-advertise-address 设置为当前主机网卡的 ip (k8s 之后将使用这个命令生成加入其他节点的命令,其他节点使用这个地址与主节点通信)。

这个操作会提前检查镜像并拉取,在之后启动时就不需要等待拉取容器镜像。

加载 cni 插件

curl --insecure -sfL https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml | kubectl apply -f -

国内存在访问问题,可以提前下载文件指定本地文件(注意版本问题 k8s 1.24 和 2.6.0 对应)。

cni 插件将自动的在其他节点上加载。

加入其他 node

如果创建集群成功,将活得一个主节点,以及一个用于加入其他节点的 join 命令。

类似

kubeadm join 192.168.x.x:x --token myt3ue.fyn46edqx4oqqtox \
        --discovery-token-ca-cert-hash sha256:<sha256>

如果你使用 docker,需要指定容器运行时的 socker 描述符

使用这样的命令

kubeadm join 192.168.x.x:x --token myt3ue.fyn46edqx4oqqtox \
        --discovery-token-ca-cert-hash sha256:<sha256> \
        --cri-socket=unix:///var/run/cri-dockerd.sock

查看节点

在主节点上使用命令

kubectl get nodes (可能需要使用 sudo)

将得到类似下面的结果


问题可提评论。