由于客户网络处于专网环境下, 使用kubeadm工具安装K8S集群,由于无法连通互联网,所有无法使用apt工具安装kubeadm、kubelet、kubectl,当然你也可以使用apt-get工具在一台能够连通互联网环境的服务器上下载cri-tools、containerd、kubernetes-cni软件包,然后拷贝到专网主机上,通过dpkg工具安装cri-tools、containerd、kubernetes-cni,这里并没有采用这种方式,在当前客户主机网络环境下,我们使用二进制方式来安装cri-tools、containerd、kubernetes-cni。
环境信息如下所示:
操作系统 | 内核版本 | cri-containerd-cni版本 |
---|---|---|
Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 1.7.2 |
说明:根据官方文档,自1.1版本之后,提供了cri-tools、containerd、runc、cni二进制合集包。
cri-containerd-cni二进制包,包含如下软件:
软件名称 | 软件版本 |
---|---|
cri-tools | 1.26.0 |
containerd | 1.7.2 |
runc | 1.1.7 |
cni | 1.2.0 |
问题一:为什么安装containerd,需要同时安装runc及cni网络插件?
安装containerd,需要同时安装runc及cni网络插件。Containerd不能直接操作容器,需要通过runc来运行容器。默认Containerd管理的容器仅有lo网络(无法访问容器之外的网络),如果需要访问容器之外的网络则需要安装CNI网络插件。CNI(Container Network Interface) 是一套容器网络接口规范,用于为容器分配ip地址,通过CNI插件Containerd管理的容器可以访问容器之外的网络。
问题二:为什么安装cri-tools?
cri-tools(容器运行时工具):这是一个 用于与Kubernetes容器运行时接口(CRI)进行交互的命令行工具集。它提供了一些有用的功能,如创建、销毁和管理容器等。
1、下载软件包
wget https://github.com/containerd/containerd/releases/download/v1.7.2/cri-containerd-cni-1.7.2-linux-amd64.tar.gz
2、解压安装
tar axf cri-containerd-cni-1.7.2-linux-amd64.tar.gz -C /
3、生成默认配置文件
mkdir -p /etc/containerd && containerd config default > /etc/containerd/config.toml
4、配置systemd cgroup驱动
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
5、重载沙箱pause镜像
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"#g' /etc/containerd/config.toml
6、设置cni插件在创建网络配置文件时使用的模板文件路径
sed -i 's#conf_template = ""#conf_template = "/etc/cni/net.d/cni-default.conf"#g' /etc/containerd/config.toml
6、网络插件CNI配置文件
rm -f /etc/cni/net.d/10-containerd-net.conflist
cat <<EOF | sudo tee /etc/cni/net.d/cni-default.conf
{
"name": "mynet",
"cniVersion": "0.3.1",
"type": "bridge",
"bridge": "mynet0",
"isDefaultGateway": true,
"ipMasq": true,
"hairpinMode": true,
"ipam": {
"type": "host-local",
"subnet": "10.48.0.0/16"
}
}
EOF
说明:
1、10.48.0.0/16是集群pod网段
2、cni-default.conf 文件中cniVersion的版本号要与10-containerd-net.conflist版本中定义的保持一致。
7、重启containerd服务并设置开机自启
systemctl daemon-reload && systemctl restart containerd && systemctl enable containerd
安装完成后,确保k8s集群所有节点的runc和containerd版本如下所示:
root@k8s-master-63:~# containerd -v
containerd github.com/containerd/containerd v1.7.2 0cae528dd6cb557f7201036e9f43420650207b58
root@k8s-master-63:~# runc -v
runc version 1.1.7
commit: v1.1.7-0-g860f061b
spec: 1.0.2-dev
go: go1.20.4
libseccomp: 2.5.1
说明:由于网络问题,无法下载国外的K8S镜像,所以这里使用阿里云的镜像仓库地址registry.cn-hangzhou.aliyuncs.com/google_containers代替。如果你有阿里云的账号,可以对 containerd配置镜像加速地址来实现快速下载镜像。
1、安装cri-tools
# 1、下载二进制包
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.26.0/crictl-v1.26.0-linux-amd64.tar.gz
tar axf crictl-v1.26.0-linux-amd64.tar.gz -C /usr/local/bin
# 2、配置/etc/crictl.yaml
cat <<EOF | sudo tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
EOF
2、安装cni网络插件
# 1、下载二进制包
wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz
# 2、解压文件
mkdir -p /opt/cni/bin
tar axf cni-plugins-linux-amd64-v1.2.0.tgz -C /opt/cni/bin
3、安装runc
wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64
cp runc.amd64 /usr/bin/runc
4、安装containerd
# 1、下载二进制包并解压
wget https://github.com/containerd/containerd/releases/download/v1.7.2/containerd-1.7.2-linux-amd64.tar.gz
tar axf containerd-1.7.2-linux-amd64.tar.gz -C /usr/local
# 2、生成默认配置文件
mkdir -p /etc/containerd && containerd config default > /etc/containerd/config.toml
# 3、配置systemd cgroup驱动
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 4、重载沙箱pause镜像
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"#g' /etc/containerd/config.toml
# 5、设置cni插件在创建网络配置文件时使用的模板文件路径
sed -i 's#conf_template = ""#conf_template = "/etc/cni/net.d/cni-default.conf"#g' /etc/containerd/config.toml
# 6、网络插件CNI配置文件
cat <<EOF | sudo tee /etc/cni/net.d/cni-default.conf
{
"name": "mynet",
"cniVersion": "0.3.1",
"type": "bridge",
"bridge": "mynet0",
"isDefaultGateway": true,
"ipMasq": true,
"hairpinMode": true,
"ipam": {
"type": "host-local",
"subnet": "10.48.0.0/16"
}
}
EOF
# 7、创建service文件
vim /etc/systemd/system/containerd.service
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
#uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
#Environment="ENABLE_CRI_SANDBOXES=sandboxed"
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
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
# 8、重启containerd服务并设置开机自启
systemctl daemon-reload && systemctl restart containerd && systemctl enable containerd
更多详细内容请参考:企业级K8s集群运维实战