(踩坑版)Ubuntu22.04安装K8s集群

参考文章

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的安装

由于我们已经安装过了docker,此时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

——END——
评论区
头像
文章目录