本文最后更新于 2024-09-02,文章内容距离上一次更新已经过去了很久啦,可能已经过时了,请谨慎参考喵。

本篇仅为我部署k8s集群过程中的踩坑记录,仅供参考,不要模仿,操作有风险,请务必备份数据

强烈建议看完整篇部署过程之后再部署,中间有遇到报错,可以提前安装部分组件避免报错!!!

建议直接拉到 kubesphere 重新开始3 这个章节看。

部署环境

系统版本:Debian 12.6

内核版本:6.1.0

内核版本在 5.4 及以上。

Kubernetes 和 Sealos Cloud 的系统组件在每个 Master 节点上大约需要 2 核心(2c)和 2GB 内存(2g),在每个 Node 节点上则需要大约 1 核心(1c)和 1GB 内存(1g)。

主机名

内网 IP

配置

k8s-master1

10.10.10.56

2C-8G-100G

k8s-node1

10.10.10.57

2C-8G-100G

k8s-node2

10.10.10.58

2C-8G-100G

master 节点必须为奇数台,node 节点任意。

主机名可以和我不一样,但三台不能一模一样。

k8s集群部署

首先安装 curl:(所有节点)

sudo apt update
sudo apt install curl

安装时间同步服务器:(所有节点)

sudo apt install ntpdate -y

sudo ntpdate -s ntp1.aliyun.com    # 阿里云时间同步服务器

date    # 查看时间
timedatectl    # 查看时间

开启 root 登录 ssh:

sudo vim /etc/ssh/sshd_config

# 编辑或注释下面两行
PermitRootLogin yes
PasswordAuthentication yes

# 重启 sshd 服务
sudo systemctl restart sshd

安装 Sealos 命令行工具:(master 节点)

echo "deb [trusted=yes] https://apt.fury.io/labring/ /" | sudo tee /etc/apt/sources.list.d/labring.list
sudo apt update
sudo apt install sealos

参考官方文档:

https://sealos.run/docs/self-hosting/lifecycle-management/quick-start/deploy-kubernetes/

基本的安装要求:

  • 每个集群节点应该有不同的主机名。主机名不要带下划线。

  • 所有节点的时间需要同步

  • 需要在 K8s 集群的第一个 master 节点上运行 sealos run 命令(也就是下面这个安装脚本),目前集群外的节点不支持集群安装。

  • 建议使用干净的操作系统来创建集群。不要自己装 Docker!

  • 支持大多数 Linux 发行版,例如:Ubuntu、CentOS、Rocky linux。

  • 支持 Docker Hub 中的所有 Kubernetes 版本。

  • 支持使用 Containerd 作为容器运行时。

root 用户执行安装程序:(master 节点)

sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.28.12 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 \
     --masters 10.10.10.56 \
     --nodes 10.10.10.57,10.10.10.58 -p xxxxxxxxx

注意:labring/helm 应当在 labring/cilium 之前。

版本 v1.28.12 是截止本文创建时间时最稳定的一个版本,请根据自己的需要进行选择。

最后的 xxxxxxxxx 请修改为对应的自己的 node 节点的 root 密码,同时请保持所有节点都可以使用 root 用户进行 ssh 登录。

等待代码跑完,完蛋,直接报错:

20240828202003.png

先执行重置:

sealos reset

安装几个插件:(所有节点)

sudo apt install ebtables ethtool iptables socat -y

# 加入环境变量
su
vim /root/.bashrc
# 加入下面这一行
export PATH=/usr/sbin:$PATH
# 使之生效
source /root/.bashrc

重新执行上面那个安装脚本,安装成功:

sealos部署

参考官方文档:

https://sealos.run/docs/self-hosting/sealos/installation/

必须使用 root 用户安装!

master 主节点安装:

curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \
  --cloud-version=v5.0.0 \
  --image-registry=registry.cn-shanghai.aliyuncs.com --zh \
  --proxy-prefix=https://mirror.ghproxy.com

确保所有节点能使用 root 用户 ssh 登录,且 root 密码一致。

等待代码跑完,弹出提示:

输入sealos cloud 域名:10.10.10.56.nip.io

输入sealos cloud 端口:回车默认443

输入证书路径:回车默认

继续跑代码,然后出现报错:

查看官网文档,注意到了以下问题:!!!

Kubernetes 版本暂不支持 1.28 及以上版本 !!!

master 节点执行:

sealos reset

重新部署:

sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 \
     --masters 10.10.10.56 \
     --nodes 10.10.10.57,10.10.10.58 -p xxxxxxxxx

注意改密码和 IP 即可,版本不要动!!!

好好好,又报错,端口占用:

估计是没卸载干净,没办法了,只能使用快照恢复大法了,还好部署之前备份了快照,直接恢复快照,重新从干净系统开始。

sealos重新开始

这次梳理一下流程,希望一次成功,所有节点:

sudo apt update

sudo apt install curl vim ntpdate -y
sudo ntpdate -s ntp1.aliyun.com    # 阿里云时间同步服务器
date    # 查看时间是否同步
timedatectl    # 查看时间是否同步

sudo vim /etc/ssh/sshd_config
# 编辑或注释下面两行
PermitRootLogin yes
PasswordAuthentication yes
# 重启 sshd 服务
sudo systemctl restart sshd

sudo apt install ebtables ethtool iptables socat -y
# 加入环境变量
su
vim /root/.bashrc
# 最下面加入这一行
export PATH=/usr/sbin:$PATH
# 使之生效
source /root/.bashrc

master 节点:

echo "deb [trusted=yes] https://apt.fury.io/labring/ /" | sudo tee /etc/apt/sources.list.d/labring.list
sudo apt update
sudo apt install sealos

切换为 root 用户:(master 节点)

sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.7 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 \
     --masters 10.10.10.56 \
     --nodes 10.10.10.57,10.10.10.58 -p xxxxxxxxx

注意更改密码。

欧克家人们,一次成功!

安装分布式应用:(master 节点)

sealos run registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 # install helm
sealos run registry.cn-shanghai.aliyuncs.com/labring/openebs:v3.9.0 # install openebs
sealos run registry.cn-shanghai.aliyuncs.com/labring/minio-operator:v4.5.5 registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:4.1.0

接下来就是 sealos cloud 安装:(master 节点)

curl -sfL https://mirror.ghproxy.com/https://raw.githubusercontent.com/labring/sealos/v5.0.0-beta5/scripts/cloud/install.sh -o /tmp/install.sh && bash /tmp/install.sh \
  --cloud-version=v5.0.0 \
  --image-registry=registry.cn-shanghai.aliyuncs.com --zh \
  --proxy-prefix=https://mirror.ghproxy.com

之前使用这个一键安装脚本重装了好几次,每次不是这个问题就是那个问题,后来仔细阅读了官方的这个安装脚本源码,发现了两个问题:

第一,这个 v5.0.0 的正式版脚本是有问题的,其中有一行的配置文件时错误的,GitHub issues 里已经解决了这个问题,但是并不清楚为何还是会报 configMap not found 的错误;可以通过使用 v5.0.0-beta5 这个版本来解决。

第二,官方推荐的配置内存为 16G,我的三个节点都只有 8G,在安装过程中会出现内存满载导致安装脚本卡死的问题;可以尝试更改为 16G 再部署。

等待代码跑完,弹出提示:

输入sealos cloud 域名:10.10.10.56.nip.io

输入sealos cloud 端口:回车默认443

输入证书路径:回车默认

这里我没试,我转战 kubesphere 了,因为 kubesphere 只要求内存 4G 即可。

kubeSphere部署

放弃了 sealos,重新试试部署 kubesphere,参考官方文档:

https://kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/multioverview/

主机还是那三台,其他基本条件:

  • 所有节点必须都能通过 SSH 访问。

  • 所有节点时间同步。

  • 所有节点都应使用 sudocurlopenssltar

环境准备:(所有节点)

sudo apt update

sudo apt install ntpdate -y
sudo ntpdate -s ntp1.aliyun.com    # 阿里云时间同步服务器
date    # 查看时间是否同步
timedatectl    # 查看时间是否同步

sudo vim /etc/ssh/sshd_config
# 编辑或注释下面两行
PermitRootLogin yes
PasswordAuthentication yes
# 重启 sshd 服务
sudo systemctl restart sshd

依赖安装:(所有节点)

sudo apt install curl openssl tar -y
sudo apt install socat conntrack ebtables ipset ethtool -y

网络和 DNS 要求:(所有节点)

  • 请确保 /etc/resolv.conf 中的 DNS 地址可用,否则,可能会导致集群中的 DNS 出现问题。

  • 如果您的网络配置使用防火墙规则或安全组,请务必确保基础设施组件可以通过特定端口相互通信。建议您关闭防火墙。

下载 KubeKey:(master 节点)

export KKZONE=cn

mkdir k8s && cd k8s

curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.13 sh -

chmod +x kk

创建配置文件:(master 节点)

./kk create config --with-kubernetes --with-kubesphere

编辑生成的配置文件:(master 节点)vim ./config-sample.yaml

spec:
  hosts:
  - {name: master, address: 10.10.10.56, internalAddress: 10.10.10.56, user: debian, password: xxxxxx}
  - {name: node1, address: 10.10.10.57, internalAddress: 10.10.10.57, user: debian, password: xxxxxx}
  - {name: node2, address: 10.10.10.58, internalAddress: 10.10.10.58, user: debian, password: xxxxxx}
  roleGroups:
    etcd:
    - master
    control-plane:
    - master
    worker:
    - node1
    - node2

注意,是只修改配置文件中的这部分内容,其他部分默认即可。(当然前面的集群名称也可以改一下)

在安装前,请确保端口 6443 没有被其他服务占用,否则在安装时会产生冲突(6443 为 API 服务器的默认端口)

创建集群:(master 节点)

./kk create cluster -f config-sample.yaml

安装完成后如图所示:

根据提示,执行一下 kubectl get pod -A

确认所有组件全部 ready 并且在 running 状态,接下来安装 kubesphere ui:

kubectl version

注意输出结果中的 Server Version 这行,确认显示 GitVersion 大于 v1.19.0

执行最小化部署:(master 节点)

kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/kubesphere-installer.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/cluster-configuration.yaml

# 查看部署进度及日志
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-installer -o jsonpath='{.items[0].metadata.name}') -f

如果访问不到 GitHub,可以提前下载下来上传到服务器,然后本地执行。

报错,查看日志:

Error from server (BadRequest): container "installer" in pod "ks-installer-c9655d997-h9w9m" is waiting to start: trying and failing to pull image

执行一下 kubectl get pod -A

发现是镜像拉取失败了,配置 docker 代理,(master 节点),参考:https://blog.imbhj.com/archives/Eol0unAo

删除这个 pod ,执行 kubectl delete deploy ks-installer -n kubesphere-system

重新执行上一个步骤中的最小化部署:(master 节点)

kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/kubesphere-installer.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.0/cluster-configuration.yaml

可以看到已经在拉取镜像了,等待。。。。。。发现还是报错 ImagePullBackOff ,翻了一下文档,发现是没配置存储。。。。。

所有节点:

sudo apt-get install nfs-common

master 节点:

vim nfs-client.yaml

# 写入配置
nfs:
  server: "10.10.10.56"
  path: "/mnt/k8s-nfs"
storageClass:
  defaultClass: true

编辑第一步生成的那个配置文件 config-sample.yaml ,修改 addons 的配置:(master 节点)

addons:
- name: nfs-client
    namespace: kube-system
    sources:
      chart:
        name: nfs-client-provisioner
        repo: https://charts.kubesphere.io/main
        valuesFile: /home/debian/nfs-client.yaml

重新部署集群:(master 节点)

./kk create cluster -f config-sample.yaml

检查存储是否部署:(master 节点)

kubectl get sc

检查 pod 状态:(master 节点)

nfs-client 的 pod 一直都是在创建中,配置出错,宣布失败。。。。。。

kubeSphere重新开始

跟 sealos 一样,总结一下失败原因和步骤,重新梳理一下安装步骤,从纯净系统重新开始。

kubesphere 的节点要求相对来说简单:(我的三台节点还是本文刚开始那三台 debian)

  • 所有节点必须都能通过 SSH 访问。

  • 所有节点时间同步。

  • 所有节点都应使用 sudo/curl/openssl/tar

首先配置普通用户使用 sudo 权限:(所有节点)

su    # 切换到 root 用户
vim /etc/sudoers

# 新增普通用户权限
debian ALL=(ALL:ALL) ALL

安装小工具:(所有节点)

sudo apt update
sudo apt install curl -y
sudo apt install socat -y
sudo apt install conntrack -y

切换到 root 用户,配置时间同步:(所有节点)

su
# 看一下三台节点的时间是否同步
timedatectl

这里可以看到我的系统在安装的时候就已经选择了 CST 中国标准时间。

timedatectl set-timezone Asia/Shanghai    # 切换时区到亚洲上海
timedatectl    # 查看一下是否设置成功
apt install chrony -y    # 安装时间同步工具

可以看到 debian12 自带了 chrony 同步工具,直接下一步:

chronyc -n sources -v    # 查看时间同步服务器列表

chronyc tracking    # 查看时间同步状态

timedatectl status    # 核查三个节点的时间是否一样

时间同步就暂时配置完毕了,如果需要将时间同步服务配置到内网自己搭建的时间同步服务器,则需要配置时间同步服务器列表,这个就不赘述了,自行百度,本文采用默认列表,公网时间同步。

下一步回到 master 节点,测试是否可以登录到其他两个节点:

ssh debian@10.10.10.57
ssh debian@10.10.10.58

测试完成之后就可以正式开始安装了,回到 master 节点su 切换到 root 用户,执行下列步骤。

# 如果是国内机器,没有配置代理的话先执行环境变量设置,如果下载不下来的话,把这个环境变量加入到 /root/.bashrc 中
export KKZONE=cn
# 下载 KubeKey
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.13 sh -
# 下载完毕之后 ls 一下看看是否有 kk 这个文件
# 增加权限
chmod +x kk
# 生成配置文件
./kk create config --with-kubernetes v1.23.10 --with-kubesphere v3.4.1

如果不指定 Kubernetes 版本,KubeKey 将默认安装 Kubernetes v1.23.10。

如果添加标志 --with-kubesphere 时不指定 KubeSphere 版本,则会安装最新版本的 KubeSphere。

!!!注意:亲测这里必须加上版本号,否则生成的配置文件是不全的。

继续,编辑刚才生成的配置文件 vim ./config-sample.yaml

metadata:
  name: luobo
spec:
  hosts:
  - {name: k8s-master1, address: 10.10.10.56, internalAddress: 10.10.10.56, user: debian, password: xxxxxx}
  - {name: k8s-node1, address: 10.10.10.57, internalAddress: 10.10.10.57, user: debian, password: xxxxxx}
  - {name: k8s-node2, address: 10.10.10.58, internalAddress: 10.10.10.58, user: debian, password: xxxxxx}
  roleGroups:
    etcd:
    - k8s-master1
    control-plane:
    - k8s-master1
    worker:
    - k8s-node1
    - k8s-node2

注意,默认只需要修改这部分即可,其他的默认最小化安装。

安装集群:

./kk create cluster -f config-sample.yaml

输入 yes 开始安装。。。。。。

报错:

安装依赖: apt install ebtables ipset -y

重新执行安装脚本: ./kk create cluster -f config-sample.yaml

报错:

所有节点重启 docker 服务: systemctl start docker

重新执行安装脚本: ./kk create cluster -f config-sample.yaml

所有的都安装成功了,但是最后卡在 Please wait for the installation to complete 这里,手动 Ctrl+C 结束,执行命令查看日志:

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

查找了一下相关资料,可能是由于网络问题,下载部分镜像超时引起的。

ok,fine,已经失败这么多次了,不差这一次了,快照恢复镜像,重新来一遍。

kubeSphere重新开始2

首先配置普通用户使用 sudo 权限:(所有节点)

su    # 切换到 root 用户
vim /etc/sudoers

# 新增普通用户权限
debian ALL=(ALL:ALL) ALL

安装小工具和依赖:(所有节点)

sudo apt update
sudo apt install curl openssl tar socat conntrack ebtables ipset -y

切换到 root 用户,配置时间同步:(所有节点)

su
# 看一下三台节点的时间是否同步
timedatectl
# 切换时区到亚洲上海
timedatectl set-timezone Asia/Shanghai
# 查看一下是否设置成功
timedatectl
# 安装时间同步工具
apt install chrony -y
# 查看时间同步服务器列表
chronyc -n sources -v
# 查看时间同步状态
chronyc tracking
# 核查三个节点的时间是否一样
timedatectl status

配置环境变量:(所有节点)(如果是国外机器,可以不用设置)

# 如果是国内机器,没有配置代理的话先执行环境变量设置,如果下载不下来的话,把这个环境变量加入到 /root/.bashrc 和 /home/debian/.bashrc 中,并使之生效

export KKZONE=cn

登录到 master 节点,测试 ssh 是否可以正常连接:

ssh debian@10.10.10.57
ssh debian@10.10.10.58

继续在 master 节点:(普通用户,不用切换 root 用户)

# 下载 KubeKey
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.13 sh -
# 下载完毕之后 ls 一下看看是否有 kk 这个文件
# 增加权限
chmod +x kk
# 生成配置文件
./kk create config --with-kubernetes v1.23.10 --with-kubesphere v3.4.1

编辑配置文件:(master 节点)

metadata:
  name: luobo
spec:
  hosts:
  - {name: k8s-master1, address: 10.10.10.56, internalAddress: 10.10.10.56, user: debian, password: xxxxxx}
  - {name: k8s-node1, address: 10.10.10.57, internalAddress: 10.10.10.57, user: debian, password: xxxxxx}
  - {name: k8s-node2, address: 10.10.10.58, internalAddress: 10.10.10.58, user: debian, password: xxxxxx}
  roleGroups:
    etcd:
    - k8s-master1
    control-plane:
    - k8s-master1
    worker:
    - k8s-node1
    - k8s-node2

其他配置项不用修改,默认最小安装。

安装集群和 kubesphere:(master 节点,普通用户)

./kk create cluster -f config-sample.yaml

等待代码跑完,直接一次成功:

但是。。。还是卡在这里很久。。。。。。

GitHub issues 上也有这个 https://github.com/kubesphere/kubesphere/issues/6153 ,看了眼社区,发现:

好好好,搞我是吧,没关系,我心态好(死亡微笑

那就接着来呗:

kubeSphere重新开始3

首先配置普通用户使用 sudo 权限:(所有节点)

su    # 切换到 root 用户
vim /etc/sudoers

# 新增普通用户权限
debian ALL=(ALL:ALL) ALL

安装小工具和依赖:(所有节点)

sudo apt update
sudo apt install curl openssl tar socat conntrack ebtables ipset -y

切换到 root 用户,配置时间同步:(所有节点)

su
# 看一下三台节点的时间是否同步
timedatectl
# 切换时区到亚洲上海
timedatectl set-timezone Asia/Shanghai
# 查看一下是否设置成功
timedatectl
# 安装时间同步工具
apt install chrony -y
# 查看时间同步服务器列表
chronyc -n sources -v
# 查看时间同步状态
chronyc tracking
# 核查三个节点的时间是否一样
timedatectl status

登录到 master 节点,测试 ssh 是否可以正常连接:

ssh debian@10.10.10.57
ssh debian@10.10.10.58

配置环境变量:(所有节点)(如果是国外机器,可以不用设置)

# 如果是国内机器,把这个环境变量加入到 /root/.bashrc 和 /home/debian/.bashrc 中,并使之生效

export KKZONE=cn

继续在 master 节点:(普通用户,不用切换 root 用户)

# 下载 KubeKey
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.1.5 sh -
# 下载完毕之后 ls 一下看看是否有 kk 这个文件
# 增加权限
chmod +x kk
# 生成配置文件
./kk create config --with-kubernetes v1.23.17 --with-kubesphere v3.4.1

注意这里的 kk 脚本版本 v3.1.5,k8s 版本 v1.23.17,kubesphere 版本 v3.4.1,我都改成了兼容的最新的版本(截止 20240831)。

编辑配置文件:(master 节点)

metadata:
  name: luobo
spec:
  hosts:
  - {name: k8s-master1, address: 10.10.10.56, internalAddress: 10.10.10.56, user: debian, password: xxxxxx}
  - {name: k8s-node1, address: 10.10.10.57, internalAddress: 10.10.10.57, user: debian, password: xxxxxx}
  - {name: k8s-node2, address: 10.10.10.58, internalAddress: 10.10.10.58, user: debian, password: xxxxxx}
  roleGroups:
    etcd:
    - k8s-master1
    control-plane:
    - k8s-master1
    worker:
    - k8s-node1
    - k8s-node2

其他配置项不用修改,默认最小安装。

安装集群和 kubesphere:(master 节点,普通用户)

./kk create cluster -f config-sample.yaml

20240831153805.jpg

等待代码跑完:

还是这个问题,但是不要手动结束,等了几分钟之后发现,浏览器访问 10.10.10.56:30880 已经可以登陆上 kubesphere 了

输入初始账号和密码: admin/P@88w0rd 访问控制台。

登入控制台之后,再返回到 ssh 那边,发现居然提示部署成功了!

按照提示,查看安装日志:

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

查看一下集群 pod 的状态:

kubectl get pod --all-namespaces

所有的 pod 状态都在 running ,没毛病。

控制面板这里显示 master 节点有一个污点 pod,这是因为一般情况下,为了保证集群的稳定性,都不会让任务 pod 跑在 master 节点上的。

查看系统组件,所有状态都是健康:

欧克,k8s 集群部署和 kubeSphere 安装就到此结束啦~

后续可能还会出使用方面的一些记录,拜拜~

所以最后提一嘴,重新开始2 章节中最后还是在最后一步卡死,大概率就是 kk 脚本的版本导致镜像源没有配置好或者失效,镜像拉取超时。