准备
准备两台主机
主机名 | 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