参考文章
Kubernetes 1.24 集群部署指南(Ubuntu 20.04 + Containerd)
文章中有多处地方其实是需要灵活修改的,但是作者并没有表明,在本文中将进行表明详细讲解应该如何操作
重要!在docker和containerd换代的时候,很多教程都会说,docker与k8s不兼容,因为k8s的底层容器技术已经从docker换成了containerd,但是实际上我们并不需要担心docker和k8s的兼容性问题,因为新版的docker,底层使用的容器技术其实也是containerd
前提条件
由于本次搭建集群使用的账户均为root,所以很多命令没有加sudo
我的测试集群是三机集群,使用国内网络环境,三台机器的信息如下
主机名: master
IP: 192.168.146.101
系统: Ubuntu 22.04.5 LTS
主机名: node1
IP: 192.168.146.102
系统: Ubuntu 22.04.5 LTS
主机名: node3
IP: 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 <<EOF
br_netfilter
overlay
EOF
sudo modprobe br_netfilter overlay # 立即加载模块
# 配置网络参数
# 启用IP转发和网桥流量透传,确保容器网络通信
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1 # IPv6流量透传
net.bridge.bridge-nf-call-iptables = 1 # IPv4流量透传
net.ipv4.ip_forward = 1 # 启用IP转发
EOF
sudo sysctl --system # 应用配置
关于containerd的安装
由于我们已经安装过了docke
r,此时containerd
实际上已经安装在系统里面了,所以在这里可以直接跳过
镜像加速与配置
博主给出的镜像加速站点实测未失效
# 生成默认配置文件
sudo mkdir -p /etc/containerd
containerd 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 = true
EOF
# 重启Containerd服务
sudo systemctl restart containerd
sudo 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 <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
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-00
sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本,防止意外升级
预拉取镜像
在这里,安装不太的k8s版本会有不同的镜像版本,可以使用下面的命令查看具体需要的版本,然后将对应的版本替换即可
sudo kubeadm config images list
我这里返回
registry.k8s.io/kube-apiserver:v1.28.15
registry.k8s.io/kube-controller-manager:v1.28.15
registry.k8s.io/kube-scheduler:v1.28.15
registry.k8s.io/kube-proxy:v1.28.15
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.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 $img
done
同样的,博主的命令中指定了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