Kubernetes(K8s)集群安装
1禁用Ubuntu Swap
sudo gedit /etc/fstab

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

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

3添加k8sAPT源
新版命令
# 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里已经不支持了。权且保留以作参考。
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"
4配置containerd
旧版命令
这里需要安装containerd,但是我在docker安装的时候已经装好了,相关命令为
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。
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

sudo gedit /etc/containerd/config.toml


使用Ubuntu官方仓库的container(Ubuntu官方仓库叫containerd,不叫containerd.io)。安装命令如下:
sudo apt install containerd
# 配置containrd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
编辑 /etc/containerd/config.toml,找到以下行:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options],修改SystemdCgroup = true。
配置后,重启containerd服务,并保证containerd状态正确
sudo systemctl restart containerd.service
sudo systemctl status containerd.service

新版命令
使用Ubuntu官方仓库的container(Ubuntu官方仓库叫containerd,不叫containerd.io,containerd.io是docder仓库的包)。安装命令如下:
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,能拉下来就是成了。
# 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.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
重启containerd
sudo systemctl restart containerd
sudo systemctl status containerd
5 安装Kubernetes
安装k8s软件,这里会默认下载最新的kubernetes(阿里云镜像源上的),后面指定版本时需要根据自己的版本进行修改。这里也可以手动指定kubernetes版本。
sudo apt install kubelet kubeadm kubectl

此时k8s没有启动成功是正常的,因为kubelet服务成功启动的先决条件,需要kubelet的配置文件,所在目录/var/lib/kubelet还没有建立。
6 k8s配置单机节点
查看k8s版本
kubeadm config images list

将kubernetes的控制面的几个镜像拉到本地,为了保证镜像和安装的k8s软件版本严格一致,这里的镜像拉取时,显性指定版本。
sudo kubeadm config images pull --kubernetes-version v1.28.10 --image-repository registry.aliyuncs.com/google_containers

kubernetes初始化

sudo kubeadm init --control-plane-endpoint=192.168.146.111 --kubernetes-version v1.28.10 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers

初始化成功如下图

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


创建hosts映射。

8配置Kubernetes集群
在主节点上跟着初始化成功后的提示继续后续工作
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看集群状态
kubectl cluster-info
kubectl get nodes

在k8s1上创建永久token
kubeadm token create --print-join-command

如果在克隆虚拟机作为从节点之前就已经跟着k8s提示完成了上面几步,那么在从节点上执行提示的join命令,会遇见报错。

原因:拷贝虚拟机时已完成k8s集群配置文件创建,应该在初始化后,配置文件创建前进行克隆。
解决办法:在虚拟机重置节点后加入集群。这个重置节点的命令也可以在后续k8s出现问题时恢复默认设置重做时使用。
sudo rm -rf /etc/kubernetes/kubelet.conf /etc/kubernetes/pki/ca.crt
sudo kubeadm reset

重新加入集群(join命令为主节点创建永久token时回显的命令)

在k8s3上进行相同步骤。
在k8s1上查看集群节点,集群搭建成功。

细心的读者可能发现了我的1号机之前交VirtualClass,但是现在却叫k8s1,这是因为我在1号机初始化之前没有修改一号机的名字,导致集群建立后节点名字如下,但是这个看着不太舒服,我就把三台机都使用上面的重置命令重置后再重做了一遍上述步骤。

9配置Kubernetes网络插件Calico
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
重新执行
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。
kubectl get pods -n kube-system
kubectl get nodes

k8s命名空间查看,更多命令及参数可以通过kubectl --help查看
kubectl get namespace

如果应用calico.yaml后查看状态如下,pod的镜像一直拉取不下来(ImagePullBackOff)。查看pod情况,发现镜像用的是docker.io的,calico镜像拉不下来。解决办法就是自己手动拉取(用docker/nerdctl/ 拉下来,保存成tar包,再应用到k8s上)。没装docker建议用nerdctl,nerdctl是 containerd的官方CLI工具,功能和docker命令几乎一样,但它是为containerd设计的。
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
# 拉取镜像
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

浙公网安备 33010602011771号