1. 适用场景
- 容器引擎默认使用containerd
- 只有普通软件的yum源,没有K8S组件的相关yum源,例如当前时间点,公网ctyunos暂无对应版本的kubelet、kubectl、kubeadm这些组件,也缺少高版本的containerd和runc等组件。
- 系统版本不是常见的系统,例如ctyunos,但必须为linux + amd64。
- 只需要搭建一个可用的多节点K8S集群,对是否高可用,网络功能、集群性能没有太高要求。
- 可能没有公网,但可以传文件。
由于在常见的centos系统中,通过公网yum源可以搞定很多常见软件的安装,但在ctyunos系统中,yum源上软件的不足,在实际部署测试环境中较多困扰。所以就本人的一些经验,结合网上的步骤,整理而得出该文档。
一些常用的部署K8S的软件,有些只支持单节点K8S,有些对系统版本有要求,总的来说,不够通用,在实际部署过程中使用反而麻烦。
2. 系统准备(所有节点)
本次用例,以ctyunos为例,内核版本5.4
在开始之前,尽量需要配置基本的yum源畅通
2.1. 节点host配置
进入/etc/hosts,配置IP和hostname的对应关系
10.0.0.24 csitest-centos8-0001
10.0.0.22 csitest-centos8-0002
10.0.0.21 csitest-centos8-0003
10.0.0.30 csitest-centos8-0004
2.2. 系统软件下载
通过yum下载一些常用软件,方便部署K8S和后续K8S的维护、开发工作:
yum -y install wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel python-devel openssh-server socat ipvsadm conntrack ntpdate
除了个别组件外,大部分并非部署K8S急需的组件,根据实际下载情况对K8S部署的影响情况,再决定是不是一定要下载。
2.3. 系统配置
完成以下配置:
ntpdate ntp1.aliyun.com
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
setenforce 0
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
systemctl disable firewalld
systemctl stop firewalld
echo """
vm.swappiness = 0
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
""" > /etc/sysctl.conf
sysctl --system
3. K8S软件下载(所有节点)
3.1. 下载
创建一个本地目录并进入,用于临时存放这些下载后的组件。
注意:以下下载路径中,涉及到版本的字段,需要自行找到个人需要的版本进行替换,本文档只是以K8S 1.25.5为例,构建的相关组件的地址。(不同版本的K8S可能所需要的组件版本不同)。
如果下载的较慢或者无法访问公网,建议可以直接到对应的地址下载后,放到节点上的同一个目录。
以下涉及到kubectl、runc、containerd、crictl、kubeadm、kubelet、kubernetes-cni这些组件的下载。
curl -LO "https://dl.k8s.io/release/v1.25.5/bin/linux/amd64/kubectl"
wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64
wget "https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.25.0/crictl-v1.25.0-linux-amd64.tar.gz"
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
3.2. 可执行文件存放
进入上一节下载文件的目录。
除了kubernetes-cni的文件外,将其他文件解压并且chmod +x,然后放入到/usr/local/bin下(其他可执行的路径都行,随意),但需要检查K8S节点上是否已经存在该组件,如果有,则需要删除原有主机上的可执行文件,切记!后续的组件配置中,需要使用到其中某些可执行文件的存放路径。
而kubernetes-cni得文件解压后,放入到/opt/cni/bin/下(固定路径)
chmod +x * -R
cp -rf runc.amd64 /usr/bin/runc
tar -xvf crictl-v1.25.0-linux-amd64.tar.gz
chmod +x * -R
cp -rf crictl /usr/local/bin
tar -xvf containerd-1.7.2-linux-amd64.tar.gz
chmod +x * -R
cp -rf bin/* /usr/local/bin/
cp -rf kubectl /usr/local/bin/
cp -rf kubeadm kubelet /usr/local/bin/
mkdir -p /opt/cni/bin/
tar -xvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin/
chmod +x /opt/cni/bin/*
执行以上组件的相关命令,例如
Which xxx
或者
Xxx version
Xxx -v
类似的命令来确认我们的可执行命令安装到位
3.3. Kubelet服务构建
- 构建kubelet服务
DOWNLOAD_DIR=/usr/local/bin
RELEASE_VERSION="v0.4.0"
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service
sudo mkdir -p /etc/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
注意,DOWNLOAD_DIR需要改为存放kubelet的路径。
如果下载的较慢或者无法访问公网,建议可以直接到对应的地址下载后,放到命令中指定的目录,并手动执行命令后半部。
修改完成后,执行systemctl enable --now kubelet
- 构建containerd服务
创建/lib/systemd/system/containerd.service文件,写入以下内容:
[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 #(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
LimitNOFILE=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
- 构建containerd配置
创建/etc/containerd/目录,创建/etc/containerd/config.toml文件,写入以下内容(不采用containerd自动生成的默认的配置,内容太多,这个配置简明扼要):
version = 2
root = "/var/lib/containerd"
state = "/run/containerd"
oom_score = -999
[grpc]
max_recv_message_size = 16777216
max_send_message_size = 16777216
[debug]
level = "info"
[metrics]
address = ""
grpc_histogram = false
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
max_container_log_line_size = -1
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
snapshotter = "overlayfs"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
runtime_engine = ""
runtime_root = ""
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
完成后执行:systemctl restart containerd && systemctl enable containerd
注意:sandbox_image地址需要根据你下载的镜像地址进行替换,后续会讲到。
另外,这里配置中,使用Systemd作为cgroup管理器,而不是cgroupfs,符合未来K8S的趋势。
不做配置的情况下,默认containerd的sock地址为/var/run/containerd/containerd.sock或者/run/containerd/containerd.sock(两个路径为同一个),一般情况下没必要修改。
- 构建crictl服务
由于crictl可能默认使用sock地址与我们实际环境不同,所以需要创建/etc/crictl.yaml 文件
然后写入以下内容:
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
具体endpoint地址根据containerd配置的地址有关