准备
准备两台主机
| 主机名 | IP | CPU架构 |
|---|---|---|
| mx-text-01 | 192.168.0.222 | ARM64 |
| mx-text-02 | 192.168.0.223 | ARM64 |
主机要求: 2Core 2G RAM
配置主机名映射
添加映射
192.168.0.222 mx-test-01
192.168.0.223 mx-test-02
cat /etc/hosts

关闭SELinux
setenforce 0

sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

允许IP数据包转发
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
cat /etc/sysctl.d/kubernetes.conf

配置生效
sysctl -p /etc/sysctl.d/kubernetes.conf

注意上述配置不要与 /etc/sysctl.conf 冲突。
关闭Swap交换分区 (kubelet在1.28 开始若存在swap则无法启动[1])
vi /etc/fstab
注释swap

该配置需要重启生效
若不重启,可以关闭运行时的交换分区
swapoff -a
检查是否关闭
free -h

卸载Docker,这里将使用contianerd作为CRI
yum remove docker \
containerd.io \
docker-runc \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-compose-plugin \
docker-buildx-plugin

准备安装包
安装containerd
创建安装包存放目录
mkdir -p /root/kubeadm-boot/containerd
cd /root/kubeadm-boot/containerd

这里按照 containerd官方方式 [8] 进行二进制安装,下载合适版本 https://github.com/containerd/containerd/releases

将安装包存放于 /root/kubeadm-boot/containerd 中。
解压
tar Cxzvf /usr/local containerd-1.7.16-linux-arm64.tar.gz

检查安装
containerd --version
如果提示containerd 没有找到,请重新连接SSH

配置 Containerd官方提供Systemd服务模板 containerd.service ,若下载困难也可以直接复制下面模板
cat > /usr/lib/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
EOF

创建镜像存储位置 /data/containerd/
mkdir -p /data/containerd/

创建containerd 默认配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

编辑 /etc/containerd/config.toml 文件各部分内容:
vi /etc/containerd/config.toml
修改 root 位置为 /data/containerd
root = "/data/containerd"

设置 [plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true

设置 [plugins.“io.containerd.grpc.v1.cri”]
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"

重新加载服务,设置开机启动,启动containerd服务
systemctl daemon-reload
systemctl enable containerd
systemctl restart containerd

查看运行状态
systemctl status containerd

安装RUNC
在安装前请检查你的libseccomp版本 是否大于 2.5.0,若低于2.5.0 请升级。
rpm -qa | grep libseccomp

项目release页面下载 https://github.com/opencontainers/runc/releases

将安装包存放于 /root/kubeadm-boot/containerd 中。
安装 runc
install -m 755 runc.arm64 /usr/local/sbin/runc

检查
runc --version

安装CNI 网络插件
项目release页面下载 https://github.com/containernetworking/plugins/releases 下载合适版本

将安装包存放于 /root/kubeadm-boot/containerd 中。
创建cni安装目录
mkdir -p /opt/cni/bin

解压cni安装包
tar Cxzvf /opt/cni/bin cni-plugins-linux-arm64-v1.4.1.tgz

下载k8s安装包
删除已经存在的版本。
yum remove -y kubelet kubeadm kubectl cri-tools

创建 kubernetes YUM仓库
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

yum clean all
yum makecache

创建安装包存储目录
mkdir -p /root/kubeadm-boot/kubernetes-rpm
cd /root/kubeadm-boot/kubernetes-rpm

下载 kubelet、kubeadm 和 kubectl:
yum install --downloadonly --downloaddir=/root/kubeadm-boot/kubernetes-rpm \
kubelet kubeadm kubectl \
--disableexcludes=kubernetes
当前最新版本为 1.30.0

ls -l /root/kubeadm-boot/kubernetes-rpm

执行离线安装
rpm -Uvh --nodeps *.rpm

验证安装是否成功
kubectl version
kubeadm version

设置开机启动,并立刻启动kubelet
systemctl enable --now kubelet

这个阶段启动的kubelet由于没有配置,将不断重启。
准备kubeadm初始化文件
生成集群启动文件
mkdir -p /root/kubeadm-boot
cd /root/kubeadm-boot

生成默认配置:
kubeadm config print init-defaults > kubeadm-init.yaml

vi kubeadm-init.yaml
修改配置中的 localAPIEndpoint.advertiseAddress 为当前主机的IP

修改 nodeRegistration.name 节点名称为当前节点的名称,注意这里是主节点

修改 imageRepository
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers

初始化集群
kubeadm init --config kubeadm-init.yaml
注意首次启动将会拉取镜像会消耗一段时间

镜像拉取完成后生成证书和相关配置文件,之后启动control-plane。

接下来提示创建相关配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

检查集群
kubectl get node
可以看到当前集群中已经一个节点,但是处于 NotReady状态,这是应为没有安装CNI的原因。

安装网络插件flannel
下载flannel启动文件 https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
cd /root/kubeadm-boot
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

查看 kubeadm中的服务网络IP,默认值为 10.96.0.0/12
cat kubeadm-init.yaml |grep serviceSubnet

修改flannel配置文件
vi kube-flannel.yml
找到net-conf.json 配置,修改Network 为 kubeadm-init.yaml 中的 serviceSubnet。

部署flannel
kubectl apply -f kube-flannel.yml

再次查看节点状态时,可以发现节点状态已经变为 Ready
kubectl get node

可以查看一下当前节点上启动的pods
crictl pods

导出K8S相关镜像
创建镜像保存目录
mkdir -p /root/kubeadm-boot/img
cd /root/kubeadm-boot/img

查看k8s需要所有需要的镜像列表
echo "$(crictl image ls)" | awk 'NR>1 {print $1 ":" $2}'

导入这些镜像
ctr -n k8s.io image export flannel-cni-plugin-v1.4.0-flannel1.tar docker.io/flannel/flannel-cni-plugin:v1.4.0-flannel1
ctr -n k8s.io image export flannel-v0.25.1.tar docker.io/flannel/flannel:v0.25.1
ctr -n k8s.io image export pause-3.9.tar registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
ctr -n k8s.io image export coredns-v1.11.1.tar registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1
ctr -n k8s.io image export etcd-3.5.12-0.tar registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.12-0
ctr -n k8s.io image export kube-apiserver-v1.30.0.tar registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.30.0
ctr -n k8s.io image export kube-controller-manager-v1.30.0.tar registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0
ctr -n k8s.io image export kube-proxy-v1.30.0.tar registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.30.0
ctr -n k8s.io image export kube-scheduler-v1.30.0.tar registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.30.0

ls -l

确认离线安装包内容
tree /root/kubeadm-boot

离线安装
TODO
参考文献
[1]. kubernetes . Installing kubeadm . 2024 . https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
[2]. 知乎 . Kubernetes 教程之跟着官方文档从零搭建 K8S . 玩java的草鸡 . 2020 . https://zhuanlan.zhihu.com/p/321795209
[3]. 清华大学. Kubernetes 软件仓库镜像使用帮助 . 2024 . https://help.mirrors.cernet.edu.cn/kubernetes/
[4]. 博客园 . K8S初始化报错:CRI v1 runtime API is not implemented for endpoint “unix:///var/run/containerd/containerd.sock” . Boom__Clap . 2023.7 . https://www.cnblogs.com/yourstars/p/17572125.html
[5]. kubernetes . registry.k8s.io . 2024 . https://github.com/kubernetes/registry.k8s.io
[6]. 博客园 . K8S(kubernetes)镜像源 . HackerVirus . 2022.1 . https://www.cnblogs.com/Leo_wl/p/15775077.html
[7]. kubernetes . kubeadm-init . https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file
[8]. containerd . 2024 . https://github.com/containerd/containerd/blob/main/docs/getting-started.md
[9]. 博客园 . 基于containerd 部署 kubernetes 1.28集群 . linuxk . 2024.3 . https://www.cnblogs.com/linuxk/p/18104028
[10]. flannel . 2024 . https://github.com/flannel-io/flannel







![[华为OD]C卷 给定一个数组,数组中的每个元素代表该位置的海拔高度 山脉的个数 200](https://img-blog.csdnimg.cn/direct/e3c2152747a149aca749e7bf199860cf.png)










