参考文章
Kubernetes 1.24 集群部署指南(Ubuntu 20.04 + Containerd)
文章中有多处地方其实是需要灵活修改的,但是作者并没有表明,在本文中将进行表明详细讲解应该如何操作
重要!在docker和containerd换代的时候,很多教程都会说,docker与k8s不兼容,因为k8s的底层容器技术已经从docker换成了containerd,但是实际上我们并不需要担心docker和k8s的兼容性问题,因为新版的docker,底层使用的容器技术其实也是containerd
前提条件
由于本次搭建集群使用的账户均为root,所以很多命令没有加sudo
我的测试集群是三机集群,使用国内网络环境,三台机器的信息如下
主机名: masterIP: 192.168.146.101系统: Ubuntu 22.04.5 LTS
主机名: node1IP: 192.168.146.102系统: Ubuntu 22.04.5 LTS
主机名: node3IP: 192.168.146.103系统: Ubuntu 22.04.5 LTS三台机器均已完成系统安装、换源,每台机器中都有三台机器的公钥,均可使用公钥登录
安装docker和docker-compose
安装docker
目前,国内的网络环境无法使用get.docker.com的脚本直接进行安装,我们可以使用它的加速镜像进行安装
curl -sSL https://testingcf.jsdelivr.net/gh/docker/docker-install@master/install.sh | bash偶尔在国内的网络中也会遇到报错
curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection to download.docker.com:443可以重试几次,一般都可以解决
完成以上步骤后,就已经完成了docker的安装
验证
docker info显示
Client: Docker Engine - Community Version: 28.0.4 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.22.0 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.34.0 Path: /usr/libexec/docker/cli-plugins/docker-compose
Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 28.0.4 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Using metacopy: false Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: systemd Cgroup Version: 2 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 runc Default Runtime: runc Init Binary: docker-init containerd version: 05044ec0a9a75232cad458027ca83437aae3f4da runc version: v1.2.5-0-g59923ef init version: de40ad0 Security Options: apparmor seccomp Profile: builtin cgroupns Kernel Version: 5.15.0-119-generic Operating System: Ubuntu 22.04.5 LTS OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 3.785GiB Name: master ID: 1b039b7c-566f-46ae-9a1f-d7a855819895 Docker Root Dir: /var/lib/docker Debug Mode: false Experimental: false Insecure Registries: ::1/128 127.0.0.0/8 Live Restore Enabled: false安装dockerc-ompose
安装docker-compose我一般是先去github的https://github.com/docker/compose/releases下载适合当前系统的docker-compose,然后将其上传到服务器的/usr/local/bin目录下,然后执行
chmod +x /usr/local/bin/docker-compose验证
docker-compose version显示
Docker Compose version v2.34.0按照教程操作
如果小节标题中未标注是哪个节点执行,则所有节点都要执行
系统初始化
由于我这里已经初始化过机器了,所以跳过第一小节,不过需要补充的是,最好在初始化系统的时候,将所有机器的时区同步
timedatectl set-timezone Asia/Shanghai内核参数优化
这两块可以直接照抄
# 加载必要内核模块# br_netfilter:支持网桥模式的网络过滤# overlay:支持容器分层文件系统sudo tee /etc/modules-load.d/k8s.conf <<EOFbr_netfilteroverlayEOFsudo modprobe br_netfilter overlay # 立即加载模块
# 配置网络参数# 启用IP转发和网桥流量透传,确保容器网络通信sudo tee /etc/sysctl.d/k8s.conf <<EOFnet.bridge.bridge-nf-call-ip6tables = 1 # IPv6流量透传net.bridge.bridge-nf-call-iptables = 1 # IPv4流量透传net.ipv4.ip_forward = 1 # 启用IP转发EOFsudo sysctl --system # 应用配置关于containerd的安装
由于我们已经安装过了docker,此时containerd实际上已经安装在系统里面了,所以在这里可以直接跳过
镜像加速与配置
博主给出的镜像加速站点实测未失效
# 生成默认配置文件sudo mkdir -p /etc/containerdcontainerd config default | sudo tee /etc/containerd/config.toml
# 替换镜像仓库地址(解决国内拉取镜像慢的问题)sudo tee /etc/containerd/config.toml <<'EOF'version = 2
[plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] # Docker Hub 镜像加速 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://registry.cn-hangzhou.aliyuncs.com", "https://registry-1.docker.io"] # Kubernetes 官方镜像仓库替换 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"] endpoint = ["https://registry.cn-hangzhou.aliyuncs.com/google_containers"] # Quay 镜像仓库替换 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"] endpoint = ["https://quay.mirrors.ustc.edu.cn"]
[plugins."io.containerd.grpc.v1.cri".registry.configs] # 跳过TLS验证(仅在内网或信任的镜像源使用) [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.cn-hangzhou.aliyuncs.com".tls] insecure_skip_verify = trueEOF
# 重启Containerd服务sudo systemctl restart containerdsudo systemctl enable containerd # 设置开机自启测试拉取镜像
# 测试拉取基础镜像(pause容器用于Pod沙盒环境)sudo ctr images pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7
# 查看已拉取的镜像sudo ctr images ls | grep pause # 应显示 pause:3.7这里博主在写的时候写错了,原文中拉取镜像的时候没有指定namespace,所以如果使用sudo ctr -n k8s.io images ls | grep pause不会有任何结果,这里的命令我已经进行了修改
安装 Kubernetes
# 配置阿里云Kubernetes镜像源(解决官方源访问慢的问题)curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOFdeb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial mainEOF
sudo apt update在博主的文章中,直接指定了Kubernetes的版本,但是软件源中的代码版本并不总是相同,要查询可用的Kubernetes的版本可以使用
sudo apt list|grep kubelet在我的当前系统中返回的是
kubelet/kubernetes-xenial 1.28.2-00 amd64使用如下命令安装对应版本
sudo apt install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本,防止意外升级预拉取镜像
在这里,安装不太的k8s版本会有不同的镜像版本,可以使用下面的命令查看具体需要的版本,然后将对应的版本替换即可
sudo kubeadm config images list我这里返回
registry.k8s.io/kube-apiserver:v1.28.15registry.k8s.io/kube-controller-manager:v1.28.15registry.k8s.io/kube-scheduler:v1.28.15registry.k8s.io/kube-proxy:v1.28.15registry.k8s.io/pause:3.9registry.k8s.io/etcd:3.5.9-0registry.k8s.io/coredns/coredns:v1.10.1拉取对应镜像
# 定义需要预加载的镜像列表(避免初始化时等待下载)images=( "registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.15" "registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.28.15" "registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.28.15" "registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.28.15" "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9" "registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.9-0" "registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.10.1")
# 循环拉取镜像到本地for img in "${images[@]}"; do sudo ctr images pull $imgdone同样的,博主的命令中指定了namespace,实际上不需要指定
Master 节点初始化(Master节点)
sudo kubeadm init \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ --pod-network-cidr=172.100.0.0/16 \ --apiserver-advertise-address=192.168.146.101请替换自己的pod-network-cidr和apiserver-advertise-address
其中pod-network-cidr指的是k8s内部的ip,只需要与现在的ip网段不冲突即可,apiserver-advertise-address则为master节点的ip
踩坑
Master节点安装报错且未能解决,最终放弃,因为在这个博主的教程中,k8s的底层使用的还是container.io而不是我期望的docker,所以未能成功跑起来主节点,后面我会寻找新的方式,用于正确安装k8s