k8s集群搭建/二进制搭建/离线搭建/arm搭建(通用官方版本系列)_kubernetes 二进制离线部署
最近成人本科要毕设了,需要搞一搞集群,然后之前很多同学想使用指定版本的k8s,找安装包,不是很方便,所以顺便写了这个自己思路的文章,自认为是比较方便的,还请参考或批评。按照本文操作,可以尝试根据自己的Linux系统,打包离线包,或根据安装步骤编写脚本。
思路是在最小化部署的linux操作系统上,使用官方的二进制文件三剑客:kubeadm,kubectl,kubelet。
由于k8s,1.24版本之前支持docker-shim,之后是containerd,所以上面这两个容器运行时到底安装哪个,需要自己判断,运行时版本兼容问题,比如containd版本和k8s的版本兼容不在文章内。
主要是cgroup版本1/2的兼容问题,本文因为使用的k8s版本为1.33,因此默认使用的是cgroupv2。低于1.25版本的k8s测试环境不建议使用cgroupv2,低于1.19无法使用cgroupv2。当你的kubelet和containerd都启动正常,集群无法初始化的时候——kubelet无法拉起静态pod且containerd无日志,回来看这个问题。
请查看系统cgroup版本
ubuntu为例
stat -fc %T /sys/fs/cgroup/
第一步
初始化主机
#内核参数cat > /etc/sysctl.d/k8s.conf << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1EOFsudo modprobe br_netfilterecho \'br_netfilter\' | sudo tee -a /etc/modules-load.d/k8s.confsysctl -pbash > /etc/security/limits.conf <> /etc/hosts << EOF172.21.114.169 k8s-master k8s-masterEOF #时钟同步#修改主机名hostnamectl set-hostname k8s-master
第二步
安装容器运行时,以containerd为例
下载地址:https://github.com/containerd/containerd/releases/,自行寻找版本,参考我很久之前写的文章containerd 1.6.22 安装初使用_containerd1.6-CSDN博客,印象中是cgroupv1
本文以2.1.2当时最新版本为例,安装包bin目录有四个文件
除了containerd的4个文件,还需要单独下载1个runc
https://github.com/opencontainers/runc/releases
#官方下载#下载runc,深深的恶意,居然没有校验文件/哈希值curl -LO https://github.com/opencontainers/runc/releases/download/v1.3.0/runc.amd64
#containerdcurl -LO https://github.com/containerd/containerd/releases/download/v2.1.2/containerd-static-2.1.2-linux-amd64.tar.gzcurl -LO https://github.com/containerd/containerd/releases/download/v2.1.2/containerd-static-2.1.2-linux-amd64.tar.gz.sha256sum#校验sha256sum --check containerd-static-2.1.2-linux-amd64.tar.gz.sha256sum
#安装containerd runc cni插件#解压tar -xzvf containerd-static-2.1.2-linux-amd64.tar.gz#赋予可执行权限chmod +x ./bin/c*#拷贝到环境变量目录cp ./bin/c* /usr/local/bin/#!!!操作系统的systemd文件目录,不同系统可能略有区别vim /usr/lib/systemd/system/containerd.service####配置文件内容[Unit]Description=containerd container runtimeDocumentation=https://containerd.ioAfter=network.target local-fs.target[Service]ExecStartPre=-/sbin/modprobe overlayExecStart=/usr/local/bin/containerdType=notifyDelegate=yesKillMode=processRestart=alwaysRestartSec=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=infinityLimitCORE=infinityLimitNOFILE=infinity# Comment TasksMax if your systemd version does not supports it.# Only systemd 226 and above support this version.TasksMax=infinityOOMScoreAdjust=-999[Install]WantedBy=multi-user.target#systemd管理重载,开机自启动,启动systemctl daemon-reloadsystemctl enable containerdsystemctl start containerd#检查配置文件如果存在的话,cri插件是否禁用,如果被禁用注释掉sudo sed -i \'s/disabled_plugins = \\[\"cri\"\\]/# disabled_plugins = [\"cri\"]/g\' /etc/containerd/config.toml
systemctl status containerd
第三步
初始化集群
获取官方指定版本的安装工具kubectl、kubeadm、kubelet。巨慢,比windows浏览器下载慢多了(浏览器会帮你切到CDN线路)。不想动脑子就躺着等。
获取x86-64位安装工具
curl -LO \"https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl\"curl -LO \"https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubeadm\"curl -LO \"https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubelet\"
$(curl -L -s https://dl.k8s.io/release/stable.txt)
上面变量是获取到的版本,理论上可以是任何存在的版本
获取arm-64位安装工具,把amd64改成arm64即可,
例如:
curl -LO https://dl.k8s.io/release/v1.33.1/bin/linux/arm64/kubectl
curl -LO https://dl.k8s.io/release/v1.33.1/bin/linux/arm64/kubeadm
curl -LO https://dl.k8s.io/release/v1.33.1/bin/linux/arm64/kubelet
校验下载内容是否是官方文件,以x86为例:
下载校验文件
curl -LO \"https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256\"curl -LO \"https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubeadm.sha256\"curl -LO \"https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubelet.sha256\"
校验:
echo \"$(cat kubeadm.sha256) kubeadm\" | sha256sum --checkecho \"$(cat kubectl.sha256) kubectl\" | sha256sum --checkecho \"$(cat kubelet.sha256) kubelet\" | sha256sum --check
校验非ok,重新去下载!
#赋予可执行权限chmod +x kubeadm kubectl kubelet cp ./kube* /usr/local/bin#启动kubeletmkdir /etc/sysconfig/echo \"KUBELET_EXTRA_ARGS=\" >/etc/sysconfig/kubeletmkdir /usr/lib/systemd/system/kubelet.service.dvim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf# Note: This dropin only works with kubeadm and kubelet v1.11+[Service]Environment=\"KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf\"Environment=\"KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml\"# This is a file that \"kubeadm init\" and \"kubeadm join\" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamicallyEnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.EnvironmentFile=-/etc/sysconfig/kubeletExecStart=ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGSvim /usr/lib/systemd/system/kubelet.service[Unit]Description=kubelet: The Kubernetes Node AgentDocumentation=https://kubernetes.io/docs/Wants=network-online.targetAfter=network-online.target[Service]ExecStart=/usr/local/bin/kubeletRestart=alwaysStartLimitInterval=0RestartSec=10[Install]WantedBy=multi-user.target#kubelet开机自启动systemctl daemon-reloadsystemctl enable kubeletsystemctl start kubelet#初始化集群kubeadm init --apiserver-advertise-address=172.21.114.169 --kubernetes-version=v1.33.1 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 #--ignore-preflight-errors=all#--image-repository registry.aliyuncs.com/google_containers
关于镜像国内无法下载等问题参考使用上面的阿里源,但是会出现一个很恶心的问题,就是K8S还是会使用谷歌的pause这个镜像,导致集群启动失败,我记得做了好几版本都是有这个问题。
# 使用国内镜像源拉取 pause 镜像
sudo ctr -n k8s.io images pull registry.aliyuncs.com/google_containers/pause:3.10
# 为镜像打上 registry.k8s.io 的标签
sudo ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.10 registry.k8s.io/pause:3.10
配置访问权限
#kubectl访问权限mkdir -p $HOME/.kubesudo /bin/cp /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
第四步
安装网络插件calico
配置网络插件calico,存在镜像问题下载不了,默认从docker.io下载。需改成quay.io下载,然后修改tag。
calico官网:https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart
大概有下面这些镜像,注意版本哦,官网上的yaml对应的版本可能不同
977 ctr -n k8s.io image pull quay.io/calico/typha:v3.25.0 982 ctr -n k8s.io image pull quay.io/calico/pod2daemon-flexvol:v3.25.0 1052 ctr -n k8s.io image pull quay.io/calico/cni:v3.25.0 1056 ctr -n k8s.io image pull quay.io/calico/node:v3.25.0 1065 ctr -n k8s.io image pull quay.io/calico/kube-controllers:v3.25.0 1067 ctr -n k8s.io image pull quay.io/calico/csi:v3.25.0 1072 ctr -n k8s.io image pull quay.io/calico/node-driver-registrar:v3.25.0 1077 ctr -n k8s.io image pull quay.io/calico/apiserver:v3.25.0
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml#修改该文件的pod地址池kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml
最后一步
打包所有镜像和修改过的文件,可以尝试做脚本和离线包,暂时先写这么多,后面再改