参考资料:https://cloud.tencent.com/developer/article/2347138
禁用Ubuntu Swap

ubuntu24.04这个swapfile配置文件略有调整

Ubuntu安装网桥工具
1
|
sudo apt-get install bridge-utils -y
|

添加k8sAPT镜像源
新版命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 1. 安装必要工具
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gpg
# 2. 创建 keyring 目录
sudo mkdir -p /etc/apt/keyrings
# 3. 下载官方 GPG 密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 4. 添加 APT 源(官方地址,支持 noble)
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 5. 更新并安装
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
# 6. 锁定版本(防止意外升级)
sudo apt-mark hold kubelet kubeadm kubectl
|
旧版命令
下面这个是旧版的命令,在Ubuntu24.04里已经不支持了。权且保留以作参考。
1
2
3
4
5
|
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo add-apt-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"
|
配置containerd
旧版命令
这里需要安装containerd,但是我在docker安装的时候已经装好了,相关命令为
1
|
sudo apt-get install containerd.io
|
(1)Containerd安装完成后,其自带的配置文件/etc/containerd/config.toml中的内容,需要用打印出的containerd默认配置替换。
(2)Containerd的Cgroup设为systemd,以和k8s默认的Cgroup保持一致。
(3)pause镜像路径改为国内源registry.aliyuncs.com/google_containers/pause:3.9。
1
2
3
4
5
|
sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.ori
sudo chmod 777 /etc/containerd/config.toml
sudo containerd config default > /etc/containerd/config.toml
|

1
|
sudo gedit /etc/containerd/config.toml
|


配置后,重启containerd服务,并保证containerd状态正确
1
2
|
sudo systemctl restart containerd.service
sudo systemctl status containerd.service
|

新版命令
使用Ubuntu官方仓库的container(Ubuntu官方仓库叫containerd,不叫containerd.io,containerd.io是docder仓库的包)。安装命令如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
sudo apt install containerd
# 配置containrd
sudo mkdir -p /etc/containerd
# 创建/etc/containerd/config.yaml,修改镜像源和cgroup
sudo tee /etc/containerd/config.toml << 'EOF'
version = 2
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
EOF
|
创建/etc/containerd/certs.d目录,在这个目录填入docker.io和registry.k8s.io的镜像源。新版本的k8s在config.yaml改会有冲突问题,不能生效。
注意:k8s里修改镜像源之后,使用kubectl describe pod <pod_name> 查看时还是显示的docker.io和registry.k8s.io。配置镜像源只物理修改从哪里修改,不改镜像拉取的逻辑源。所以改好镜像源之后也不太好验证成功,随便拉个镜像sudo crictl pull nginx:1.14.2,能拉下来就是成了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# Docker Hub 加速
sudo mkdir -p /etc/containerd/certs.d/docker.io
sudo tee /etc/containerd/certs.d/docker.io/hosts.toml << 'EOF'
server = "https://registry-1.docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF
# K8s 镜像加速
sudo mkdir -p /etc/containerd/certs.d/registry.k8s.io
sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml << 'EOF'
server = "https://registry.k8s.io"
[host."https://registry.cn-hangzhou.aliyuncs.com/v2/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
|
重启containerd
1
2
|
sudo systemctl restart containerd
sudo systemctl status containerd
|
安装Kubernetes
安装k8s软件,这里会默认下载最新的kubernetes(阿里云镜像源上的),后面指定版本时需要根据自己的版本进行修改。这里也可以手动指定kubernetes版本。
1
|
sudo apt install kubelet kubeadm kubectl
|
此时k8s没有启动成功是正常的,因为kubelet服务成功启动的先决条件,需要kubelet的配置文件,所在目录/var/lib/kubelet还没有建立。
k8s配置单机节点
查看k8s版本
1
|
kubeadm config images list
|
将kubernetes的控制面的几个镜像拉到本地,为了保证镜像和安装的k8s软件版本严格一致,这里的镜像拉取时,显性指定版本。
1
|
sudo kubeadm config images pull --kubernetes-version v1.28.10 --image-repository registry.aliyuncs.com/google_containers
|

kubernetes初始化

1
|
sudo kubeadm init --control-plane-endpoint=192.168.146.111 --kubernetes-version v1.28.10 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
|
初始化成功如下图

克隆虚拟机作为从节点
关闭虚拟机,克隆虚拟机作为从节点。
右键虚拟机,克隆虚拟机。选择当前状态,创建完整克隆,完成克隆。
克隆完成后修改从节点的hosts、hostname和ip。
为了便于管理,修改主节点的hosts为k8s1,从节点分别取名k8s2和k8s3。对应ip指定为192.168.146.112和192.168.146.113。(这里的ip和host要根据自己的情况进行修改,主节点的名字也可以通过修改hotsname来改变)
创建hosts映射。

配置Kubernetes集群
在主节点上跟着初始化成功后的提示继续后续工作
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
|
查看集群状态
1
2
|
kubectl cluster-info
kubectl get nodes
|
在k8s1上创建永久token
1
|
kubeadm token create --print-join-command
|
如果在克隆虚拟机作为从节点之前就已经跟着k8s提示完成了上面几步,那么在从节点上执行提示的join命令,会遇见报错。
原因:拷贝虚拟机时已完成k8s集群配置文件创建,应该在初始化后,配置文件创建前进行克隆。
解决办法:在虚拟机重置节点后加入集群。这个重置节点的命令也可以在后续k8s出现问题时恢复默认设置重做时使用。
1
2
|
sudo rm -rf /etc/kubernetes/kubelet.conf /etc/kubernetes/pki/ca.crt
sudo kubeadm reset
|
重新加入集群(join命令为主节点创建永久token时回显的命令)
在k8s3上进行相同步骤。
在k8s1上查看集群节点,集群搭建成功。
细心的读者可能发现了我的1号机之前交VirtualClass,但是现在却叫k8s1,这是因为我在1号机初始化之前没有修改一号机的名字,导致集群建立后节点名字如下,但是这个看着不太舒服,我就把三台机都使用上面的重置命令重置后再重做了一遍上述步骤。

配置Kubernetes网络插件Calico
1
2
|
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
kubectl apply -f calico.yaml
|
成功截图如下(我这里因为网络问题没有成功,姑且偷一张图),如果失败可以使用另外一种手动方法如下(我的办法)。
手动解决办法:
打开链接(可能需要借助某些上网工具)
https://projectcalico.docs.tigera.io/manifests/calico.yaml
全选复制,粘贴到~/calico.yaml
重新执行
1
|
kubectl apply -f calico.yaml
|
成功截图,这里要看见所有的pod状态都为Running才是成功,如果是ContainerCreating则表明正在制作容器,需要稍等一会(可能会很慢,但也不会超过十分钟)。如果过了很久还没Running,可以通过kubectl describe pods <pod-name> -n kube-system 查看pod进度。 -n的意思是指定命名空间(namespace),默认的pod命名空间是default,所以使用kubectl get pods会得到defalut下的pods。
1
2
|
kubectl get pods -n kube-system
kubectl get nodes
|
k8s命名空间查看,更多命令及参数可以通过kubectl --help查看

如果应用calico.yaml后查看状态如下,pod的镜像一直拉取不下来(ImagePullBackOff)。查看pod情况,发现镜像用的是docker.io的,calico镜像拉不下来。解决办法就是自己手动拉取(用docker/nerdctl 拉下来,保存成tar包,再应用到k8s上)。没装docker建议用nerdctl,nerdctl是 containerd的官方CLI工具,功能和docker命令几乎一样,但它是为containerd设计的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
rust@k8s1:~$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-5b9b456c66-j54xc 0/1 Pending 0 4m43s
calico-node-4h4kb 0/1 Init:ImagePullBackOff 0 2m56s
calico-node-l7mrg 0/1 Init:ImagePullBackOff 0 2m56s
calico-node-psvnr 0/1 Init:ImagePullBackOff 0 2m56s
coredns-6d58d46f65-4gfzx 0/1 Pending 0 129m
coredns-6d58d46f65-hsl2c 0/1 Pending 0 129m
etcd-k8s1 1/1 Running 3 (120m ago) 129m
kube-apiserver-k8s1 1/1 Running 3 (120m ago) 129m
kube-controller-manager-k8s1 1/1 Running 3 (120m ago) 129m
kube-proxy-hd4sr 1/1 Running 2 (120m ago) 129m
kube-proxy-hpcdx 1/1 Running 0 108m
kube-proxy-trwf6 1/1 Running 0 108m
kube-scheduler-k8s1 1/1 Running 3 (120m ago) 129m
rust@k8s1:~$ kubectl describe pod -n kube-system calico-node-4h4kb
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 拉取镜像
docker pull calico/cni:v3.25.0
docker pull calico/node:v3.25.0
docker pull calico/kube-controllers:v3.25.0
docker pull calico/pod2daemon-flexvol:v3.25.0
# 打包成 tar
docker save \
calico/cni:v3.25.0 \
calico/node:v3.25.0 \
calico/kube-controllers:v3.25.0 \
calico/pod2daemon-flexvol:v3.25.0 \
-o calico-v3.25.0-images.tar
# 在每个k8s节点上应用calico镜像,ctr是containerd原生命令
sudo ctr -n k8s.io images import calico-v3.25.0-images.tar
# 删除旧pod,触发重建
kubectl delete pod -n kube-system -l k8s-app=calico-node
kubectl delete pod -n kube-system -l app=calico-kube-controllers
|