准备
准备两台主机
主机名 | 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
下载nerdctl https://github.com/containerd/nerdctl/releases full 类型二进制压缩包,该压缩包中包含了所有containerd相关的内容包括:Containerd、CNI、runc、BuildKit 等完整组件。
创建安装包存放目录,将下载的安装包放置于该目录中。
mkdir -p /root/kubeadm-boot/containerd
cd /root/kubeadm-boot/containerd
解压 nerdctl-full
tar Cxzvvf /usr/local nerdctl-full-2.0.0-beta.5-linux-arm64.tar.gz
创建软连接
ln -s /usr/local/bin/runc /usr/local/sbin/runc
mkdir -p /opt/cni/
ln -s /usr/local/libexec/cni/ /opt/cni/bin
设置开机自启并启动服务
systemctl daemon-reload
systemctl enable --now buildkit.service
systemctl enable --now containerd.service
systemctl enable --now stargz-snapshotter.service
查看各个服务状态
systemctl status buildkit.service
systemctl status containerd.service
systemctl status stargz-snapshotter.service
检查命令是否可用
containerd -v
nerdctl -v
runc -v
buildkitd -v
配置containerd
创建containerd 默认配置文件
containerd config default > /root/kubeadm-boot/containerd/config.toml
编辑 config.toml 文件各部分内容:
vi /root/kubeadm-boot/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
创建镜像存储位置 /data/containerd/
mkdir -p /data/containerd/
放置配置文件
mkdir -p /etc/containerd
cp /root/kubeadm-boot/containerd/config.toml /etc/containerd/
重启containerd服务
systemctl restart containerd
查看运行状态
systemctl status containerd
镜像加速 私有仓库
编辑containerd配置文件
vi /root/kubeadm-boot/containerd/config.toml
修改 [plugins."io.containerd.grpc.v1.cri".registry]
中的 config_path 为 /etc/containerd/certs.d
创建docker.io 镜像加速
mkdir -p /root/kubeadm-boot/containerd/certs.d/docker.io/
cat > /root/kubeadm-boot/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
[host."https://registry.docker-cn.com"]
capabilities = ["pull", "resolve"]
EOF
创建k8s 镜像加速
mkdir -p /root/kubeadm-boot/containerd/certs.d/registry.k8s.io
cat > /root/kubeadm-boot/containerd/certs.d/registry.k8s.io/hosts.toml << EOF
server = "https://registry.k8s.io"
[host."https://k8s.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF
添加 私有仓库 192.168.0.221:5000
mkdir -p /root/kubeadm-boot/containerd/certs.d/192.168.0.221:5000
cat > /root/kubeadm-boot/containerd/certs.d/192.168.0.221:5000/hosts.toml << EOF
server = "http://192.168.0.221:5000"
[host."http://192.168.0.221:5000"]
capabilities = ["pull", "resolve", "push"]
skip_verify = true
EOF
查看结果
tree /root/kubeadm-boot/containerd/certs.d/
复制到指定目录内
cp -r /root/kubeadm-boot/containerd/certs.d/ /etc/containerd/
重启containerd
注意只有第一次配置时需要重启,后面的配置直接在/etc/containerd/certs.d 中添加和修改就可以。
systemctl restart containerd
验证加速效果
ctr -n k8s.io images pull --hosts-dir "/etc/containerd/certs.d" -k registry.k8s.io/pause:3.8
下载k8s安装包
删除已经存在的版本。
yum remove -y kubelet kubeadm kubectl cri-tools
创建 kubernetes YUM仓库
cd /root/kubeadm-boot
cat <<EOF | sudo tee 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
cp kubernetes.repo /etc/yum.repos.d/
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 节点名称为当前节点的名称,注意这里是主节点
配置pod子网,在networking中加入 podSubnet
podSubnet: 10.244.0.0/16
注意:这里的子网与flannel调整为同一个网段,否则flannel将启动失败,详见:
初始化集群
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中的Pod网络IP
cat kubeadm-init.yaml |grep podSubnet
如果没有输出请参考 准备kubeadm初始化文件 章节。
检查 flannel配置文件中的网络配置
cat kube-flannel.yml | grep Network
若与 kubeadm-init.yaml
配置文件中的podSubnet不一致请手动修改。
部署flannel
kubectl apply -f kube-flannel.yml
再次查看节点状态时,可以发现节点状态已经变为 Ready
kubectl get node
可以查看flannel 的pod是否启动
kubectl get pod --all-namespaces
若看到所有pod都正常运行,那么可以认为配置已经生效。
若Pod不正常可以使用下面命令查看Pod
kubectl describe pod [pod名称] -n [命名空间]
例如:
kubectl describe pod kube-flannel-ds-ngxvb -n kube-flannel
[可选] 下载Kuboard
下载static-pod 安装脚本 https://addons.kuboard.cn/kuboard/kuboard-static-pod.sh
cd /root/kubeadm-boot
curl -fsSL https://addons.kuboard.cn/kuboard/kuboard-static-pod.sh -o kuboard.sh
修改服务端口,默认kuboard服务端口为80,这里修改为20080。
cd /root/kubeadm-boot
vi kuboard.sh
下载k8s启动配置文件
cd /root/kubeadm-boot
curl -fsSL https://addons.kuboard.cn/kuboard/kuboard-v3.yaml -o kuboard-v3.yaml
查看配置文件中使用的镜像
cat kuboard-v3.yaml |grep -E 'image|IMG*|IMAGE'
下载涉及到的各个镜像
ctr -n k8s.io images pull --hosts-dir "/etc/containerd/certs.d" eipwork/kuboard-agent:v3
ctr -n k8s.io images pull --hosts-dir "/etc/containerd/certs.d" docker.io/questdb/questdb:6.0.5
ctr -n k8s.io images pull --hosts-dir "/etc/containerd/certs.d" docker.io/eipwork/etcd-host:3.4.16-2
ctr -n k8s.io images pull --hosts-dir "/etc/containerd/certs.d" eipwork/kuboard:v3
若在下载镜像的阶段遇到了 unexpected commit digest 请删除
/data/containerd/io.containerd.content.v1.content/ingest/*
后重试 [16]
查看下载的镜像
crictl images list
导出镜像
创建镜像保存目录
mkdir -p /root/kubeadm-boot/img
cd /root/kubeadm-boot/img
查看需要导出的镜像
crictl images list
导出docker.io 和k8s的镜像
mkdir -p /root/kubeadm-boot/img/registry.k8s.io/
mkdir -p /root/kubeadm-boot/img/docker.io/
cd /root/kubeadm-boot/img/
while IFS= read -r line; do
image_repo=$(echo "$line" | awk '{print $1}');
image_tag=$(echo "$line" | awk '{print $2}');
image_name=$(echo "$image_repo" | awk -F'/' '{print $NF}')
ctr image pull --hosts-dir "/etc/containerd/certs.d" $image_repo:$image_tag;
if [[ "$image_repo" == "registry.k8s.io/"* ]]; then
ctr -n k8s.io image export /root/kubeadm-boot/img/registry.k8s.io/$image_name-$image_tag.tar $image_repo:$image_tag;
else
ctr image export /root/kubeadm-boot/img/docker.io/$image_name-$image_tag.tar $image_repo:$image_tag;
fi
done <<< "$(crictl images | awk 'NR>1 {print $1,$2,$3}')"
查看导出镜像
tree /root/kubeadm-boot/img
离线打包
tree /root/kubeadm-boot
压缩
cd /root
tar -cvf kubeadm-boot.tar ./kubeadm-boot
[可选] 重置节点
若不需要重置节点,请不要执行该章节内容!!!
若不需要重置节点,请不要执行该章节内容!!!
若不需要重置节点,请不要执行该章节内容!!!
停止集群
kubeadm reset
停止containerd
systemctl stop containerd
清理资源
rm -rf $HOME/.kube
rm -rf /etc/containerd
rm -rf /data/containerd
mkdir -p /etc/containerd
mkdir -p /data/containerd
离线安装
基础安装
将 kubeadm-boot.tar 拷贝到待安装主机上/root目录,解压。
cd /root
tar -xvf kubeadm-boot.tar
安装Containerd及其组件
进入安装包所在目录,解压
cd /root/kubeadm-boot/containerd
tar Cxzvvf /usr/local nerdctl-full-2.0.0-beta.5-linux-arm64.tar.gz
创建软连接
ln -s /usr/local/bin/runc /usr/local/sbin/runc
mkdir -p /opt/cni/
ln -s /usr/local/libexec/cni/ /opt/cni/bin
设置开机自启并启动服务
systemctl daemon-reload
systemctl enable --now buildkit.service
systemctl enable --now containerd.service
systemctl enable --now stargz-snapshotter.service
查看各个服务状态
systemctl status buildkit.service
systemctl status containerd.service
systemctl status stargz-snapshotter.service
检查命令是否可用
containerd -v
nerdctl -v
runc -v
buildkitd -v
配置containerd
cd /root/kubeadm-boot/containerd
mkdir -p /data/containerd/
mkdir -p /etc/containerd
cp -f config.toml /etc/containerd/config.toml
cp -r /root/kubeadm-boot/containerd/certs.d/ /etc/containerd/
重启containerd
systemctl restart containerd && systemctl status containerd
安装Kubelet
删除已经存在的版本。
yum remove -y kubelet kubeadm kubectl cri-tools
进入安装包存储目录
cd /root/kubeadm-boot/kubernetes-rpm
执行离线安装
rpm -Uvh --nodeps *.rpm
验证安装是否成功
kubectl version
kubeadm version
设置开机启动,并启动kubelet
systemctl daemon-reload
systemctl enable --now kubelet
导入镜像
导入docker.io镜像
cd /root/kubeadm-boot/img/docker.io/
for img in $(ls); do ctr -n k8s.io images import --platform=linux/arm64 $img; done
导入k8s镜像
cd /root/kubeadm-boot/img/registry.k8s.io/
for img in $(ls); do ctr -n k8s.io images import --platform=linux/arm64 $img; done
查看导入的镜像
crictl images list
主节点
cd /root/kubeadm-boot
ls -l
使用预置的配置文件使用 kubeadm 初始化集群
kubeadm init --config kubeadm-init.yaml
注意按照实际调整 kubeadm-init.yaml 中的
localAPIEndpoint.advertiseAddress
、nodeRegistration.name
初始化完成后将提示控制平面初始化完成, Your Kubernetes control-plane has initialized successfully!
按照操作设置相关配置文件
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
保持提示中节点加入命令,该命令将在其它节点上使用用于加入集群。
查看节点状态
kubectl get node
应用网络插件flannel
cd /root/kubeadm-boot
kubectl apply -f kube-flannel.yml
查看k8s所有pod的状态是否正常
kubectl get pods --all-namespaces
若Pod不正常可以使用命令查看Pod故障原因和详情
kubectl describe pod [pod名称] -n [命名空间]
取消主节点不可调度标记 [17]
kubectl taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule-
工作节点
如果在主节点初始化完成后你未保存加入集群的命令或超过了12小时,可在主节点上生成新的token
kubeadm token create --print-join-command
在完成基础安装后,使用主节点中打印的集群加入指令加入集群。
kubeadm join 192.168.0.222:6443 --token y0ch4s.p1brdhr3orlvn9p7 --discovery-token-ca-cert-hash sha256:5a9ceba8200a0ed132e6a9604d5b3ae5ff7882b418487ffb66af465196a7fac9
当提示 This node has joined the cluster: 说明集群加入成功。
在主节点上 检查集群中的节点情况
kubectl get nodes
查看各个pod是否正常运行
kubectl get pods --all-namespaces
可以发现 coredns 与 flannel 都增加了一个实例。
Kuboard 启动
下面使用 static-pod 的方式启动 kuboard kuboard 将使用该节点的 80 端口暴露服务,并且将数据存储在 /usr/share/kuboard 目录下。
若你需要 调整端口、修改存储目录、修改登录口令 等,请在启动前修改 kuboard.sh
文件。
在主节点上进入安装目录,启动脚本
cd /root/kubeadm-boot/
sh kuboard.sh
查看启动状态
kubectl get pods -n kuboard -o wide
查看服务端口
kubectl describe pod kuboard-v3-mx-test-01 -n kuboard
已经改为之前的修改之后的服务端口 20080
使用浏览器访问 主节点IP:20080 进入登录页。
- 用户名:
admin
- 口令:
Kuboard123
进入主页
参考文献
[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
[11]. 博客园 .【云原生】Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )
. 大数据老司机 . 2022.08 . https://www.cnblogs.com/liugp/p/16633732.html
[12]. kubesphere . 2024 . https://kubesphere.io/zh/docs/v3.4/quick-start/minimal-kubesphere-on-k8s/
[13]. CSDN . GousterCloud . [containerd] 镜像加速 . 2023.08 . https://blog.csdn.net/IOT_AI/article/details/131975562
[14]. 小灰灰的碎碎念 . containerd 配置私有仓库 . 2023.11 . https://h2c.tech/p/containerd-%E9%85%8D%E7%BD%AE%E7%A7%81%E6%9C%89%E4%BB%93%E5%BA%93/
[15]. 博客园 . nerdctl安装 . 小吉猫 2022.10 . https://www.cnblogs.com/wangguishe/p/16779282.html
[16]. github . 下载 nvcr.io 镜像会发生 unexpected commit digest 错误 . DaoCloud . 2023.11 . https://github.com/DaoCloud/public-image-mirror/issues/1441
[17]. kubernetes . 众所周知的标签、注解和污点 . 2024 . https://kubernetes.io/zh-cn/docs/reference/labels-annotations-taints/
[18]. kuboard . 安装 Kuboard v3 - static pod . 2024. https://kuboard.cn/install/v3/install-static-pod.html#static-pod-%E5%AE%89%E8%A3%85-kuboard