前提

已安装 containerd 或 Docker(自带 containerd)。
本文已安装 Docker v28.5.1,自带 containerd v1.7.28。参考 ubuntu安装docker

一、安装 Kubernetes

1.安装需要的包

更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:

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

2.下载用于 Kubernetes 软件包仓库的公共签名密钥

curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

3.添加 Kubernetes apt 仓库

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main' | sudo tee /etc/apt/sources.list.d/kubernetes.list

4.安装 kubelet、kubeadm 和 kubectl

更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:

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

本文使用的版本是 v1.28.2 :
在这里插入图片描述

5.启用 kubelet 服务

sudo systemctl enable --now kubelet

kubelet 现在每隔几秒就会重启,在 CrashLoop 状态中等待 kubeadm 发布指令。CrashLoop 状态是正常现象,初始化控制平面后,kubelet 将正常运行。

二、初始化控制平面

1.配置 linux:禁用交换分区,启动 systemd,启用 cgroup v2

Ubuntu 22.04 WSL2 通过 .wslconfig 文件完成以上配置。在 Windows 目录 C:\Users<用户名> 下新建 .wslconfig 文件,添加配置:

[wsl2]
# 关闭交换分区
swap = 0
# 启用 cgroup v2
kernelCommandLine = cgroup_no_v1=all systemd.unified_cgroup_hierarchy=1
# 限制内存和 CPU
memory = 4GB
processors = 4

修改后,重启。

检查 systemd 是否启动。输出 systemd,说明 systemd 正在运行,输出 init 或其他内容,说明未正确启动:

ps -p 1 -o comm=

检查 cgroup v2 是否启用。对于 cgroup v2,输出为 cgroup2fs,对于 cgroup v1,输出为 tmpfs:

stat -fc %T /sys/fs/cgroup/

2.配置 containerd:配置 systemd cgroup 驱动,重载沙箱(pause)镜像

如果直接改 /etc/containerd/config.toml 可能不成功,因为这个文件不完整。首先重写原文件:

sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null

编辑 /etc/containerd/config.toml:

sudo vim /etc/containerd/config.toml

# 配置 systemd cgroup 驱动
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true # 改为true

# 重载沙箱(pause)镜像
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" # 改为阿里云源

修改后,重启 containerd:

sudo systemctl daemon-reload
sudo systemctl restart containerd

3.初始化控制平面

sudo kubeadm init \
	--image-repository=registry.aliyuncs.com/google_containers \
	--kubernetes-version=v1.28.2 \
	--pod-network-cidr=10.244.0.0/16

第一次 init 没成功,再次尝试可能失败,这时可以用下面的命令将节点恢复到安装前的状态:

sudo kubeadm reset -f

看到以下输出,就说明初始化成功了:
在这里插入图片描述

按照命令行输出的提示,执行以下命令:

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

4.安装 Pod 网络插件

选择最简单、最常用的 Flannel 进行安装:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

安装完成后,查看节点状态:

kubectl get nodes

首次查看,STATUS 显示 NotReady ,等待几十秒后再次查看,应该变成 Ready:
在这里插入图片描述

三、配置 containerd 镜像加速

1.修复 crictl 报错

crictl 是用于 Kubernetes 节点上与 containerd 交互的命令行工具。可以用以下命令查看镜像:

sudo crictl images

首次使用遇到报错:Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory.
执行以下命令可修复:

sudo crictl config runtime-endpoint unix:///run/containerd/containerd.sock

2.添加镜像加速器地址

未添加镜像加速器地址时,尝试拉取 nginx 镜像会报超时。

编辑 containerd 配置文件:

sudo vim /etc/containerd/config.toml

[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] #添加该行
    endpoint = ["https://docker.1ms.run"]                            #添加该行

重启 containerd:

sudo systemctl daemon-reload
sudo systemctl restart containerd

再次尝试拉取 nginx 镜像,成功:

sudo crictl pull nginx

在这里插入图片描述

四、测试(启动 nginx)

使用 Kubernetes 启动 nginx:

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

查看 pod 和 service:

kubectl get pod,svc

在这里插入图片描述

查看 nginx pod 信息,发现调度失败:

kubectl describe pod nginx-7854ff8877-9m66z #改为 kubectl get pod 命令查出的 nginx pod name

在这里插入图片描述

这是因为本文只配置了一台服务器,既作为控制平面节点,又作为工作节点,而 Kubernetes 默认会给控制平面节点添加一个污点(Taint),普通 Pod 不允许调度到这个节点上,除非配置了容忍(Toleration)。可以通过以下命令查看污点:

kubectl describe node <节点名> | grep Taint

通过以下命令移除污点:

kubectl taint nodes <节点名> node-role.kubernetes.io/control-plane:NoSchedule-

再查 nginx pod 信息,发现启动成功:
在这里插入图片描述

可以在浏览器中访问到 nginx 页面:

http://<自己的服务器IP>:<kubectl get svc 命令查出的 nginx 端口号>

删除 nginx 的命令:

kubectl delete deployment nginx

参考:
[1]:【最全】完整版Kubernetes(K8S)全套入门+微服务实战项目,带你一站式深入掌握K8S核心能力
[2]:Ubuntu安装K8S(1.28版本,基于containrd)
[3]:安装 kubeadm(k8s官方文档)
[4]:WSL 关闭swap
[5]:配置 cgroup 驱动(k8s官方文档)
[6]:failed to get sandbox image \\“registry.k8s.io/pause:3.6\\“: failed to pull image \\“registry.k8
[7]:容器运行时(k8s官方文档)
[8]:使用 kubeadm 创建集群(k8s官方文档)
[9]:GitHub - flannel-io/flannel
[10]:while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory 错误修复
[11]:Container 命令ctr、crictl 命令
[12]:ubuntu安装docker

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐