k8s部署折腾记录
本文最后更新于 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)。
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
参考官方文档:
基本的安装要求:
每个集群节点应该有不同的主机名。主机名不要带下划线。
所有节点的时间需要同步。
需要在 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 登录。
等待代码跑完,完蛋,直接报错:
先执行重置:
sealos reset
安装几个插件:(所有节点)
sudo apt install ebtables ethtool iptables socat -y
# 加入环境变量
su
vim /root/.bashrc
# 加入下面这一行
export PATH=/usr/sbin:$PATH
# 使之生效
source /root/.bashrc
重新执行上面那个安装脚本,安装成功:
sealos部署
参考官方文档:
必须使用 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,参考官方文档:
主机还是那三台,其他基本条件:
所有节点必须都能通过 SSH 访问。
所有节点时间同步。
所有节点都应使用
sudo
、curl
、openssl
、tar
。
环境准备:(所有节点)
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 节点),参考:
删除这个 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
等待代码跑完:
还是这个问题,但是不要手动结束,等了几分钟之后发现,浏览器访问 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 脚本的版本导致镜像源没有配置好或者失效,镜像拉取超时。