银河麒麟V10 ARM64 kubernetes 1.30.0 基于Containerd 离线搭建

准备

准备两台主机

主机名IPCPU架构
mx-text-01192.168.0.222ARM64
mx-text-02192.168.0.223ARM64

主机要求: 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.advertiseAddressnodeRegistration.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

  • 31
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值