运维排忧解难

本文最后更新于:1 小时前

1 常用指令

[!NOTE] 符号说明
指令中小括号 () 内为选填项<>填充项(根据实际变量进行填充)。

1.1 Linux 指令

各种环境配置

1.1.1 磁盘扩容

1.1.1.1 已存在磁盘(使用余量扩容分区)

1.1.1.1.1 确认剩余空间

使用 lsblkfdisk -l 查看新增磁盘的设备名(如 /dev/sdb

1
sudo fdisk -l
  1. 查看磁盘总容量
    /dev/sda 总容量为 322.1GB,已分配的分区如下:

    • /dev/sda1(启动分区):1GB
    • /dev/sda2(LVM 物理卷):107.4GB
      • centos-root(根分区):53.7GB
      • centos-swap(交换分区):5.3GB
      • centos-home(用户数据分区):47.3GB
  2. 计算未使用空间
    sda2 的结束扇区为 209715199,而 /dev/sda 总扇区为 629145600,未分配空间约为 ​214.7GB​(322.1GB - 107.4GB)

  3. 查看文件系统

1
lsblk -f
1.1.1.1.2 扩容根目录逻辑卷
步骤 1:扩展 Sda2 分区

由于未分配空间位于 sda2 之后,需先扩展 sda2 分区以包含全部磁盘空间:

1
2
3
sudo parted /dev/sda
(parted) resizepart 2 100% # 将sda2扩展到磁盘末尾
(parted) quit
步骤 2:扩展物理卷

将新增空间加入 LVM 物理卷:

1
sudo pvresize /dev/sda2  # 自动识别扩展后的空间
步骤 3:扩展逻辑卷
  1. 查看卷组(VG)信息
1
sudo vgdisplay centos  # 确认VG名称为"centos"
  1. 扩展根逻辑卷(LV)​
1
sudo lvextend -l +100%FREE /dev/mapper/centos-root  # 将剩余空间全部分配给根目录
步骤 4:调整文件系统

根据文件系统类型执行扩容:

  • ext4 文件系统
1
sudo resize2fs /dev/mapper/centos-root
  • xfs 文件系统
1
sudo xfs_growfs /

1.1.1.1.3 ​验证结果
1
2
df -h /  # 查看根目录容量是否增加
lsblk # 确认逻辑卷大小变化

1.1.1.1.4 ​注意事项
  1. 备份数据
    操作前建议对重要数据备份,避免扩容失败导致数据丢失
  2. 文件系统类型
    通过 lsblk -f 确认根目录文件系统类型(如 xfs 或 ext4)。
  3. 在线扩容
    若使用 xfs 文件系统,支持在线扩容;ext4 需确保文件系统未损坏。

1.1.1.1.5 ​扩展场景(可选)​
  • 调整 home 分区空间
    若无需保留home分区数据,可删除 /dev/mapper/centos-home,将其空间合并到根目录:
  1. 备份 home 数据后卸载:
1
2
sudo umount /home
sudo lvremove /dev/mapper/centos-home
  1. 扩展根逻辑卷:
1
2
sudo lvextend -l +100%FREE /dev/mapper/centos-root
sudo resize2fs /dev/mapper/centos-root # 或xfs_growfs

1.1.1.2 新增磁盘

1.1.1.2.1 VSphere 给虚拟机加新硬盘

image.png
添加完成硬盘后,重启虚拟机以识别到新硬盘。

1.1.1.2.2 新硬盘创建物理卷(PV)

首先,你需要将 sdb 磁盘转化为物理卷。

1
pvcreate /dev/sdb
1.1.1.2.3 扩展卷组(VG)

将这个新的物理卷加入到现有的卷组中

1
vgextend centos /dev/sdb
1.1.1.2.4 扩展逻辑卷(LV)

现在可以扩展 / 根目录所在的逻辑卷了,以增加 100GB 为例(根据实际情况调整大小)

1
lvextend -L +100G /dev/centos/root

如果你想使用 sdb 上的所有空间

1
lvextend -l +100%FREE /dev/centos/root
1.1.1.2.5 扩展文件系统

最后一步是扩展文件系统以使用新增的空间。这个步骤依赖于你 / 根目录使用的文件系统类型。

如果是 ext4 文件系统
1
resize2fs /dev/rl/root
如果是 XFS 文件系统
1
xfs_growfs /

1.1.2 检查磁盘空间并清理

你的系统根分区 /dev/mapper/centos-root100% 满了(196G 已用完,仅剩 104K),必须立即清理,否则系统可能崩溃、服务宕机、无法登录。


1.1.2.1 🔍 第一步:快速定位大目录(按大小排序)

运行以下命令,从根目录开始,找出占用空间最大的目录

1
2
# 查看根目录下各子目录大小(人类可读,按大小排序)
sudo du -h --max-depth=1 / | sort -hr

✅ 输出示例:

1
2
3
4
5
150G    /var
30G /usr
10G /home
5G /opt
...

重点关注 /var/tmp/home/root/usr 等目录。


1.1.2.2 🧹 第二步:重点清理常见“临时/日志”目录

1.1.2.2.1 清理系统日志(通常在 /var/log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看 /var/log 大小
sudo du -sh /var/log

# 清空大日志文件(不要直接删,避免服务异常)
sudo truncate -s 0 /var/log/messages
sudo truncate -s 0 /var/log/secure
sudo truncate -s 0 /var/log/maillog
sudo truncate -s 0 /var/log/cron
sudo truncate -s 0 /var/log/dmesg

# 清理 journal 日志(如果使用 systemd)
sudo journalctl --vacuum-size=100M
# 或清空
sudo journalctl --vacuum-time=1s
1.1.2.2.2 清理临时目录
1
2
3
4
5
# 清理 /tmp(重启会自动清,但可手动删)
sudo rm -rf /tmp/*

# 清理 /var/tmp
sudo rm -rf /var/tmp/*
1.1.2.2.3 清理 YUM 缓存(如果是 CentOS/RHEL)
1
2
3
4
5
# 清理 yum 缓存
sudo yum clean all

# 或直接删缓存目录
sudo rm -rf /var/cache/yum
1.1.2.2.4 清理 Docker(如果你用了 Docker)
1
2
3
4
5
# 查看 Docker 磁盘使用
docker system df

# 清理无用镜像、容器、卷
docker system prune -a -f --volumes
1.1.2.2.5 清理旧内核(如果 /boot 也满,但你这里 /boot 只用了 5%)
1
2
3
4
5
# 列出已安装内核
rpm -q kernel

# 删除旧内核(保留最新1-2个)
sudo package-cleanup --oldkernels --count=1

1.1.2.3 🔎 第三步:查找大文件(>100MB)

1
2
3
4
5
# 查找全系统大于 100MB 的文件
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -hr

# 或只查最近修改的大文件
sudo find / -type f -size +100M -mtime -7 -exec ls -lh {} \; 2>/dev/null

常见“罪魁祸首”:

  • 日志文件:*.logjournalcatalina.out(Tomcat)
  • 数据库 dump 文件:*.sql*.bak
  • 临时下载文件:/root/*.zip/tmp/*.tar.gz
  • 应用缓存:/home/*/.cache/var/lib/*

1.1.2.4 💡 第四步:紧急释放空间(如果上述不够)

1.1.2.4.1 方案 A:临时扩容(如果用了 LVM)

但你的 df -h 显示是 LVM(/dev/mapper/centos-root),可检查是否有未分配空间:

1
2
sudo vgs    # 查看卷组剩余空间
sudo lvs # 查看逻辑卷

如果有剩余,可扩容(但需先清理出一点空间才能操作)。

1.1.2.4.2 方案 B:删除无用大文件(谨慎!)
1
2
3
4
5
# 示例:删除某个大日志
sudo rm -f /var/log/your_app_huge.log

# 或清空(更安全)
sudo truncate -s 0 /path/to/huge_file

⚠️ 切勿删除你不认识的文件! 尤其是 /bin/sbin/lib 下的文件。


1.1.2.5 ✅ 第五步:预防措施

  1. 设置 logrotate(自动轮转日志)
    1
    sudo vi /etc/logrotate.d/your_app
  2. 监控磁盘使用
    1
    2
    3
    4
    # 安装监控工具
    sudo yum install -y ncdu
    # 交互式查看目录大小
    sudo ncdu /
  3. 定期清理脚本
    1
    2
    # 添加 cron 任务
    echo "0 2 * * 0 /usr/bin/yum clean all" | sudo crontab -

1.1.2.6 🚨 紧急操作建议

你现在 必须立即清理至少 1~2GB 空间,否则:

  • systemd 可能无法写日志
  • SSH 可能拒绝新连接
  • 数据库可能 crash

优先执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 清理 journal 日志
sudo journalctl --vacuum-size=50M

# 2. 清空主要日志
sudo truncate -s 0 /var/log/messages
sudo truncate -s 0 /var/log/secure

# 3. 清理 yum 缓存
sudo yum clean all

# 4. 检查 /tmp 和 /var/tmp
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*

然后再次运行:

1
df -h

确认 / 分区 Use% 降到 95% 以下


完成清理后,建议用 ncdu 工具深入分析:

1
2
sudo yum install -y ncdu
sudo ncdu /

它会交互式显示目录大小,方便你精准定位“空间吞噬者”。

1.1.3 Ssh 连接

-p 指定端口,默认不带则为 22 端口

1
ssh -p <port> <username>@<ip/hostname>

1.1.4 Glusterfs 文件挂载

1
2
3
4
5
6
# 创建挂载点目录(需指定路径)
sudo mkdir -p /mnt/glusterfs

# 挂载 GlusterFS 卷(使用 FUSE 客户端)
mount -t glusterfs 192.168.88.170:vol_69994102f7e8a927ebeb3acd3784590c /mnt/hsas_log
sudo mount -t glusterfs <GlusterFS节点IP或主机名>:/<卷名> /mnt/glusterfs

卷名通过 rancher 里找到对应的 volume 查看。

1.1.5 文件传输

通过 ssh 协议用于在本地计算机和远程计算机之间安全地复制文件

  1. 本地到远程
1
scp (-p <port>) </path/to/local/file> <username>@<remote_host/host_name>:</path/to/remote/directory>
  1. 远程到本地
1
scp (-p <port>) <username>@<remote_host/host_name>: </path/to/remote/directory> </path/to/local/file> 

1.1.6 查看路由表

1
2
yum install net-tools -y
route -n #列出所有路由

1.1.7 查看资源

查看所有资源占用情况,降序排列,top 默认会实时更新显示的信息,通常每秒刷新一次。

1
top 
  1. 排序
    • 按 CPU 使用率排序:按 P 键。
    • 按内存使用率排序:按 M 键。
    • 按执行时间排序:按 T 键。
  2. 搜索进程
    • 输入 u 键,然后输入用户名,可以显示该用户的所有进程。
    • 输入 p 键,然后输入进程 ID(PID),可以快速定位到特定进程。
  3. 过滤进程
    • 输入 U 键,然后输入用户名,可以过滤显示该用户的进程。
    • 输入 P 键,然后输入进程 ID(PID),可以过滤显示该 PID 的进程。
  4. 杀死进程
    • 输入 k 键,然后输入进程 ID 和要发送的信号(默认是 SIGTERM,即 15),可以杀死进程。

1.1.8 查看进程

ps 命令在 Unix-like 系统中用于显示当前进程的状态。

1
ps
  1. 参数说明

    • USER:进程所有者的用户名。
    • PID:进程的 ID。
    • %CPU:进程占用的 CPU 百分比。
    • %MEM:进程占用的内存百分比。
    • VSZ:虚拟内存大小(Virtual Size)。
    • RSS:实际内存大小(Resident Set Size)。
    • TTY:进程终端类型。
    • STAT:进程状态。
    • START:进程启动时间。
    • TIME:进程占用 CPU 的时间。
    • COMMAND:启动进程的命令。
  2. 常见组合

    • ps aux (–sort=-%mem/cpu): 显示所有进程(按照内存/CPU 使用率降序排列进程)
    • ps -ef:显示所有进程的完整信息。
    • ps -p PID:显示特定进程的详细信息。

1.1.9 查看内存

以人类可读的方式展示内存使用状态。

1
free -mh

1.1.10 查看硬盘

以人类可读的方式展示磁盘分配状态。

1
df -h

1.1.11 查看系统日志

journalctlsystemd 系统服务管理器的一部分,用于查询和显示日志消息。它提供了一种方便的方式来查看系统日志,特别是与特定服务或单元相关的日志。

1
sudo journalctl -u <NetworkManager>

查看系统日志

1
2
cat/vim /var/log/messages
dmesg

查找 cpu 相关日志:

1
2
grep -r Call -C 10 /var/log/messages*
grep -r Call /var/log/messages*

1.1.12 查看编辑文件

1.1.12.1 搜索文件

按照关键词搜索含有关键词的文件

1
find . -type f -exec grep -l 'mysql-master' {} \;
1
grep 'temporary password' /var/log/mysqld.log
1
sudo find / -type f -name "*.yaml" -exec grep -H 'service-node-port-range' {} \; 2>/dev/null

搜索指定文件名的文件

1
sudo find / -name "kube-apiserver.yaml" 2>/dev/null

1.1.12.2 查看文件数量

1
find /path/to/directory -type f | wc -l

1.1.12.3 查看目录

列出当前目录下的文件和文件夹

1
ls
  1. 常见搭配

    • ls -lh:组合使用 -l-h 选项,以易读的格式显示文件大小。
    • ls -l:以长列表格式显示文件详细信息,包括权限、所有者、大小和最后修改时间。
    • ls -lt:以修改时间排序,最新修改的文件排在最前面。
    • ls -lS:以文件大小排序。
    • ls -a:显示所有文件,包括以点(.)开头的隐藏文件。
    • ls -R:递归地列出所有子目录的内容。
    • ls -F:在每个文件名后添加一个字符以指示文件类型,例如,/ 表示目录,* 表示可执行文件。
    • ls -o:显示文件所有者和组,但不显示组名。
    • ls –color:使用颜色来区分不同类型的文件。
    • ls *.txt:列出当前目录下所有的 .txt 文件。
  2. 参数解释:drwxr-xr-x 10 root root 4.0K Feb 22 21:41 clash

    • d:目录/文件
    • rwx:文件所有者的权限,r 代表可读(read),w 代表可写(write),x 代表可执行(execute)
    • r-x:文件所有者同组的用户(group)的权限,可读可执行但不可写
    • r-x:其他用户(others)的权限,可读可执行但不可写
    • 10:硬链接指向这个目录的个数,目录至少为2(一个是 . 表示当前目录,另一个是 .. 表示父目录),加上目录下文件和子目录的数量。
    • root root:文件所有者和组的名称。
    • 4.0K:目录占用空间大小(不包括子文件和子目录)。
    • Feb 22 21:41:目录最后修改的日期和时间。
    • clash:目录名称。

1.1.12.4 查看内容

查看文件内容,打印在控制台

1
cat <fileName>

1.1.12.5 新建文件

新增一个文件,或写入内容到文件中

1
2
3
cat > <file.txt>
echo <content> > <file.txt>
touch <file.txt>

1.1.12.6 编辑内容

使用 Vim 编辑器编辑文件

1
vi(m) <fileName>
  1. 常见操作:
    • i:进入插入写模式
    • esc:退出当前模式
    • :指令模式
    • :q:直接退出
    • :wq:保存退出

1.2 K8s 和 Docker 相关指令

快速安装 | Rainbond

1.2.1 K8s

1.2.1.1 集群

获取 prod 集群中所有节点信息

1
2
3
4
# 正式集群
kube-prod get nodes
# 测试集群
kube-test get nodes

1.2.1.2 节点

获取指定命名空间下的所有 pod

1
kube-prod get pod -n <namespace>

获取指定 pod 的详情(可根据 event 排查 pod 的错误信息

1
kube-prod describe pod <pod-name> -n <namespace>

条件查询指定命名空间下指定状态的 pod 并批量删除

1
kubectl get pods -n etms | grep Evicted | awk '{print $1}' | xargs kubectl delete pods --kubeconfig ./kube_config_cluster.yml -n etms

eg:

1
kube-test get pods -n etms | grep Evicted | awk '{print $1}' | xargs kubectl delete pods --kubeconfig ./test/kube_config_cluster.yml -n etms

强制删除 pod

1
kubectl delete pod hsas-1721236200-5q59b --grace-period=0 --force -n hsas

1.2.1.3 Pod

启动定时任务

1
2
3
4
kubectl-prod -n mysql create job --from=cronjob/cweb-mysql-backup cweb-k8s-mysql-master
第一个cweb:名称空间
第二个cweb:定时任务名
第三个cweb:启动的pod名

启动定时任务并查看日志

1
2
3
4
5
kube-prod create job bems-backup-test-$(date +%s) --from=cronjob/bems-backup -n bems
kube-prod get job -n bems
POD_NAME=$(kube-prod get pods -n bems -l job-name=bems-backup-test-1767168515 -o jsonpath='{.items[0].metadata.name}')
kube-prod logs -n bems $POD_NAME -c backup
kube-prod delete job bems-backup-test-1767168515 -n bems

1.2.1.4 Deployment

1.2.1.4.1 查看 deployment 的标签
1
kube-etms get deploy -n etms etms-web --show-labels
1.2.1.4.2 实时查看控制台日志
1
kube-etms logs -n etms -l app=etms-web --prefix -f | grep --line-buffered "关键词"

1.2.1.5 复制文件

1
2
3
kubectl cp -n 命名空间 -c 容器名 pod名:文件绝对路径 文件目标位置

kube-test cp -n tool -c kkfileview kkfileview-644dcccf65-r4kqb:/opt/kkFileView-4.1.0/config/application.properties ./application.properties

1.2.1.6 创建 Configmap

  1. 命令创建

通过参数 --from-literal 直接指定键值对。这种方式比较适用于临时测试使用,而且不适合配置很多的情况。

1
2
3
4
$ kubectl create configmap config-literal \
--from-literal=pkslow.name=Larry \
--from-literal=pkslow.age=18 \
--from-literal=pkslow.webSite=www.pkslow.com
  1. 文件创建

通过参数 --from-file 来指定文件。查看内容如下:

1
2
3
$ kubectl create configmap config-file \
--namespace=tool \
--from-file=application.yaml \

1.2.2 Docker

1.2.2.1 配置镜像

为镜像仓库配置下载源,查看 /etc/docker/daemon.json 文件来确定当前配置的镜像源,如果该文件不存在或为空,则默认使用 Docker 官方镜像源。

  1. 查看镜像源配置
1
2
cat /etc/docker/daemon.json
cat ~/.docker/config.json
  1. 修改配置
    多个镜像源以逗号分隔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}

#仅供私人使用
{
"registry-mirrors": [
"https://dockerhub.icu",
"https://registry.dockermirror.com",
"https://docker.m.daocloud.io",
"https://docker.fxxk.dedyn.io",
"https://dk.csfan.fun"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}

常见镜像源:

测速(测速前先移除本地的镜像!)
docker rmi nginx:latest
time docker pull nginx:latest

  1. 重启服务更新配置
1
2
3
systemctl restart docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker

1.2.2.2 保存镜像

将指定本地镜像保存为 tar 压缩包

1
docker save -o <image.tar> <image>

1.2.2.3 加载镜像

根据指定镜像压缩包加载镜像到本地

1
docker load -i <image.tar>

1.2.2.4 删除镜像

删除所有未使用的镜像,容器和存储卷。

1
2
3
docker image prune
docker container prune
docker volume prune

1.2.2.5 更新镜像

对已有的变更环境进行保存以便于 pod 重启后维持最新环境

1
2
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -a 'fcs'(commit msg) c3a6f02ad044(containerId/name) conda:fcs202407080840(newImageName)
  • OPTIONS
    • -a 或 --author:设置镜像的作者字段。
    • -c 或 --change:应用 Dockerfile 指令来创建镜像。
    • -m 或 --message:提交时的说明信息。
    • -p 或 --pause:提交时暂停容器运行(默认为 true)。
  • CONTAINER 是你要提交的容器的 ID 或名称。
  • REPOSITORY 是新创建镜像的仓库名称。
  • TAG 是可选的,用于给镜像指定一个标签,如果不指定,默认标签是 latest

1.3 MySQL 指令

1.3.1 找到配置文件位置

1
show variables like 'datadir';

1.3.2 查看日志所在位置

1
show variables like 'log_bin';

2 常见问题

[!warning] Tips

  1. 重启(物理机、虚拟机、服务、pod 等) 可能是 最直接常见的办法,但 不是最有效 的办法,具体问题具体分析,重在根据问题逐步搜索的排查思路,自顶向下排查,自底向上解决
  2. 遇到问题不要慌,众里寻它先百度,属是不行再问路,先思考后动脑,多学多看多实践,能力日益节节高

2.1 镜像无法拉取

  1. 原因:由于国内防火墙导致国外官方镜像仓库被墙无法拉取镜像,本地镜像库缓存导致拉取时没有找到最新镜像,docker 网络问题,系统网络问题
  2. 办法:
    • 出国旅游:windosw 开启魔法拉取镜像后通过 docker save 和 load 转移镜像,并 push 到本地私有镜像仓库留存。
    • 取而代之:寻找国内镜像源仓库,直接拉取国内镜像仓库的镜像到本地,并推送到本地私有仓库留存。(国内镜像仓库不稳定,可能会清除镜像)
    • 重启 docker:docker pull 卡在 waiting 则可能是网络问题,将 pod 所在节点的 docker 进行重启。
    • 检查 hosts 添加记录:cat /etc/hosts 记录格式:ip domain
    • 重启系统网络:sudo systemctl restart NetworkManager

2.2 内存/硬盘满载/溢出

  1. 原因:随着时间的累积和负载变化,内存或硬盘资源可能会不够,虚拟机负载过大,无法提供正常响应。
  2. 办法:
    • 内存:清理无用进程(kill),重启虚拟机(reboot),扩容内存(vcenter 扩大虚拟机内存)
    • 硬盘:查看磁盘分区和挂载情况(df -h),清理无用文件(rm -rf),转移文件(mv),硬盘扩容(分配更多分布式存储容量,添加一块磁盘并进行磁盘分区)

2.3 挂载卷存储满载

  1. 原因:挂载的数据卷存储容量有限,当满载后无法在挂载目录下新增目录或文件。
  2. 办法:
    • 清理挂载目录下无用的文件,腾出可用空间
    • 对挂载卷进行扩容,增加其存储容量。

2.4 CPU 核心过多软锁定

  1. 问题描述:
1
2
   [1539310.375852]NMI watchdog:BUG:soft lockup CPU#20 stuck for 23s![migration/20:111]
[1539310.375856]NMI watchdog:BUG:soft lockup CPU#28 stuck for 23s![kubelet:9779]
  1. 原因:日志表明系统遇到了一个“软锁定”(soft lockup)的情况。这通常意味着某个进程或线程在 CPU 上运行了很长时间,导致系统监视器认为它可能已经冻结或卡住。
    • 死锁:一个或多个进程可能陷入了死锁状态,导致 CPU 无法处理其他任务。
    • 资源竞争:进程之间可能存在资源竞争,导致 CPU 长时间占用。
    • 无限循环:代码中可能存在无限循环,导致 CPU 被持续占用。
    • 内核问题:可能是内核本身的问题,比如驱动程序或内核补丁引起的问题。
    • 高负载:系统可能由于高负载而无法及时响应。

cpu stuck 软锁定的原因有很多种,比如供电不足、虚拟机 cpu 核心数超过物理机核心数、虚拟机/物理机 cpu 太忙或磁盘 IO 太高、linux 内核 bug 等

  1. 办法:

2.5 内存占用虚高

vmware虚拟机内存异常占用问题一例_esxi8.0占用内存怎么处理

2.6 MySQL 故障

参考:MySQL启动报错[ERROR] InnoDB: Trying to access page number 4294967295 in space 0, space name innodb

2.6.1 K8s 集群连不上

k8s 集群 kubelet日志报错 command failed“ err=“failed to parse kubelet flag: unknown flag: –network-p_command failed” err=”failed to parse kubelet flag
kubelet 版本节点之间不一致

查看状态和日志:

1
2
systemctl status kubelet.service
journalctl -u kubelet -f

查看版本:

1
rpm -qa | grep kube

版本降级:

1
yum downgrade kubeadm-1.18.0-0.x86_64 kubectl-1.18.0-0.x86_64 kubelet-1.18.0-0.x86_64

重启 kubelet:

1
2
sudo systemctl restart kubelet.service
systemctl daemon-reload

2.7 Rancher 故障

2.7.1 Rancher 连不上 Apiserver

原因:cni 上层的网络组件出现了问题,可能是网络相关的 pod(kube-system 空间下或者直接-A 查看所有涉及到网络相关的 pod)挂了,重启后拉不到镜像导致网络不可用。
解决:排查网络相关组件 pod 是否正常,不正常则根据 event 和 status 进行解决。

2.8 集群域名修改

2.8.1 修改 242nginx 域名配置

修改 admin/nginx 目录下的 nginx 域名配置。
再使用 ./config 脚本更新重启 nginx 以生效配置。

2.8.2 改 233gitlab 配置文件里的域名

配置文件位置:/etc/gitlab/gitlab.rb
修改 gitlab 配置后重启,同步修改集群内的 gitlab-runner 配置(configmap)里的域名。
|600

2.8.3 改 102harbor 配置文件里的域名

配置文件位置:/opt/harbor_1_7/harbor.cfg
修改 harbor 配置后重启,同步修改集群内的所有镜像的仓库地址(基础设施、定时任务、应用服务等)。

2.8.4 修改 kubelet 的配置仓库鉴权域名

配置文件位于:/var/lib/kubelet/config.json
修改里面的仓库域名。

2.9 Harbor 镜像仓库清理

  1. 定位清理目标项目:登录 harbor 镜像仓库(registry.csdcinfo.cn),进入需要清理的项目。
  2. 过滤出待删除仓库镜像:进入需要删除的仓库,按照日期升序多选选中需要删除的镜像。
    |500
  3. 删除选中的 tag 镜像:在仓库中删除前面选中的 tag 镜像。
    |500
  4. 清理磁盘空间:上述删除仅为软删除并没有释放磁盘空间,需要进入系统管理的垃圾清理点击立即清理垃圾,此时会将前面软删除的镜像实际删除释放出占用的空间。
    |500

2.10 Mongodb 启动失败

问题:Rollback failed with unrecoverable error: UnrecoverableRollbackError: not willing to roll back more than 86400 seconds of data. Have: 263733 seconds

原因:分片挂掉没有及时启动,导致数据不一致,无法启动。

解决办法:

  1. 关闭 mongo 集群,找到这个分片的主分片,把它的整个目录复制到无法启动的那台分片上
  2. 增大同步时间限制,添加环境变量 MONGODB_EXTRA_FLAGS = –setParameter=rollbackTimeLimitSecs=172800,通过以下指令验证:mongo -u username -p password –authenticationDatabase admin –eval “db.adminCommand({getParameter: 1, rollbackTimeLimitSecs: 1})”

3 常用镜像

3.1 基础设施

3.1.1 Longhorn

longhornio/csi-attacher:v2.2.1-lh1
longhornio/csi-provisioner:v1.6.0-lh1
longhornio/csi-resizer:v0.5.1-lh1
longhornio/csi-snapshotter:v2.1.1-lh1
longhornio/longhorn-engine:v1.1.0
longhornio/longhorn-instance-manager:v1_20201216
longhornio/longhorn-manager:v1.1.0
longhornio/csi-node-driver-registrar:v1.2.0-lh1
longhornio/longhorn-ui:v1.1.0

3.1.2 数据库

3.1.2.1 关系型

busybox:1.32
registry.csdc.info/publish/mysql:5.7.31
mysql:5.7.31
nacos/nacos-mysql-master:latest
nacos/nacos-mysql-slave:latest
prom/mysqld-exporter

3.1.2.2 非关系型

3.1.2.2.1 Redis

registry.csdc.info/publish/redis507
registry.csdc.info/publish/redis-exporter135
oliver006/redis_exporter:v1.3.4
registry.csdc.info/publish/redisinsight:latest

3.1.2.2.2 Neo4j

neo4j:3.5

3.1.2.2.3 ELK

registry.csdc.info/publish/elasticsearch-ik-py:7.16.2
registry.csdc.info/publish/elasticsearch-ik:7.9.2
docker.elastic.co/kibana/kibana:7.16.2
registry.csdc.info/elk/logstash/logstash:7.16.2
docker.elastic.co/eck/eck-operator:1.9.1

3.1.2.2.4 Mongodb

registry.csdc.info/publish/mongodb424:latest
registry.csdc.info/publish/mongodb-exporter:latest

3.1.2.3 OSS

minio/minio:RELEASE.2022-03-17T06-34-49Z

3.1.3 反向代理

nginx:stable
nginx:1.7.9
nginx:1.15

3.1.4 微服务中间件

3.1.4.1 Nacos

nacos/nacos-server:0.9.0
registry.csdc.info/publish/nacos/nacos-server:0.9.0
nacos/nacos-server:2.0.3
registry.csdc.info/publish/nacos221:latest

3.1.4.2 RabbitMQ

docker.io/bitnami/rabbitmq:3.11.6-debian-11-r0

3.1.4.3 Seata

docker.io/seataio/seata-server:latest
registry.csdc.info/etms/seata-server:latest

3.1.5 Gitlab

registry.csdc.info/publish/docker:stable-dind
gitlab/gitlab-runner:alpine-v13.7.0
gitlab/gitlab-runner-helper:x86_64-943fc252

3.1.6 Harbor

harbor.newershoe.com:8443/library/etcd

3.1.7 监控看板

3.1.7.1 Grafana

rancher/grafana-grafana:7.1.5
rancher/prometheus-auth:v0.2.1
grafana/loki:2.4.2
grafana/grafana:8.3.5
grafana/promtail:2.1.0

3.1.7.2 Prometheus

rancher/prom-prometheus:v2.18.2
rancher/coreos-prometheus-config-reloader:v0.39.0
rancher/jimmidyson-configmap-reload:v0.3.0
rancher/mirrored-library-nginx:1.19.9-alpine

3.1.8 SSH

registry.csdc.info/publish/panubo-sshd:latest
panubo/sshd

3.1.9 其他

registry.csdc.info/publish/dingtalk-chatbot:1.0.3
registry.csdc.info/publish/databasetools:0.0.2
registry.csdc.info/publish/rsync-ssh:latest
rancher/rancher-agent:v2.5.8
rancher/fleet:v0.3.1
rancher/gitjob:v0.1.8
rancher/nginx-ingress-controller-defaultbackend:1.5-rancher1
rancher/nginx-ingress-controller:nginx-0.35.0-rancher1
rancher/calico-kube-controllers:v3.16.1
rancher/calico-cni:v3.16.1
rancher/calico-pod2daemon-flexvol:v3.16.1
rancher/calico-node:v3.16.1
rancher/coreos-flannel:v0.13.0-rancher1
rancher/coredns-coredns:1.7.0
rancher/cluster-proportional-autoscaler:1.8.1
rancher/metrics-server:v0.3.6
rancher/hyperkube:v1.19.3-rancher1
registry.csdc.info/publish/k8s-sidecar:1.15.1
registry.csdc.info/publish/kube-state-metrics:v2.2.4
quay.io/prometheus/alertmanager:v0.23.0
jimmidyson/configmap-reload:v0.5.0
quay.io/prometheus/node-exporter:v1.3.0
prom/pushgateway:v1.4.2
quay.io/prometheus/prometheus:v2.31.1
rancher/rancher-operator:v0.1.3
registry.csdc.info/publish/tomcat:7
registry.csdc.info/elk/filebeat:7.9.2
registry.csdc.info/publish/locust-tasks
registry.csdc.info/publish/kubectl:v1.14

3.1.10 Research

conda:fus
centos:latest
nvidia/cuda:10.1-devel-ubuntu18.04
nvidia/cuda:10.1-cudnn7-devel-centos7

4 数据备份

4.1 备份清单

4.1.1 数据库备份

应用数据库备份(每天):

  1. K8s 内备份:
    • srdb: mysql,mongodb
    • smdb: mysql
    • hsas: mysql
    • cweb(每月):mysql
  2. dbServ(220)上备份:
    • cmis:mysql(auth),oracle

4.1.2 文件备份

应用文件备份:

  1. K8S 内备份(每天):
    • srdb
    • smdb
    • hsas
    • cmis
    • cweb(每月)

FTP 文件备份:
210 上备份(每早上 8 点):autosync_push.sh

GitLab 代码备份(每周天):autobackup.sh

4.2 注意事项

oracle 数据库定时任务无法备份如下报错:

ORA-31634: 作业已存在
ORA-31664: 如果采用默认值, 将无法构造唯一的作业名

参考:ORA-31634: 作业已存在
原因:job 队列满了。
解决:
1. 先查询出所有未运行的 Jobs:SELECT 'DROP TABLE ' || OWNER_NAME ||'.'|| JOB_NAME ||';' FROM DBA_DATAPUMP_JOBS WHERE STATE='NOT RUNNING';
2. 删除查询到的定时任务计划表:DROP TABLE CMIS.SYS_EXPORT_SCHEMA_xx;

5 应用部署

5.1 新建项目

5.1.1 Gitlab

在 gitlab 新建一个要开发部署的项目

5.1.2 Harbor

在 harbor 镜像仓库新建一个私有项目,后续该应用的所有镜像都存储在该镜像仓库,便于后续上传和拉取应用镜像。

[!NOTE] 注意
harbor 以 docker 容器化部署的,重启 102 虚拟机或者 docker 后需要启动所有相关的容器才能恢复正常。

6 宿主机 IP 更换

  1. 将 ESXi 主机置于维护模式。(可跳过)
  2. 使用 ESXi 主机 UI Client 或 KVM 或 ssh 直接连接。(可跳过)
  3. 更改 IP 地址并更新 DNS 服务器。
    1
    2
    3
    cp /etc/vmware/esx.conf.backup /etc/vmware/esx.conf #备份宿主机配置文件
    esxcli network ip interface ipv4 set -i vmk0 -I 192.168.88.206 -N 255.255.255.0 -t static #修改ip
    esxcli network ip interface ipv4 get #查看是否生效
  4. 将 ESXi 主机取消维护模式,迁移原虚拟机回来。(可跳过)
  5. 编辑虚拟机网络状态为已连接,否则 ping 不通。

[!NOTE] 注意
重启 harbor,openrestry。

7 RKE 调整集群节点

  1. 到目标集群的 etcd0 节点上,一般在 home/root 目录或者/home/docker 目录下有 rke 及 cluster.yml 配置文件。
  2. 修改 cluster.yml 配置文件,对节点或其他配置进行修改。
  3. 通过 rke up --update-only --config cluster.yml 指令更新集群配置。
  1. 注意所有节点的 docker 版本要和 rke 支持的版本对应,​​RKE 1.2.1​​ 仅支持 Docker 1.13.x ~ 19.03.x
    ​​RKE 1.3.24​​ 支持 Docker 20.10.x ~ 26.x,不对应就降低 docker 版本。
  2. 如果是新增节点按照下面详细过程配置添加,如果是移除节点重新添加则 cluster.yml 文件先注释掉节点配置,更新集群一遍后再取消注释逐步加 role(先加 worker 再加 controller 或 etcd 等)。

7.1 详细过程

  1. 所有 etcd 和 master 和 worker 节点的 /etc/hosts 添加上所有节点名称和 ip 对应解析。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    192.168.88.129 etcd0 etcd0.linux.csdc
    192.168.88.128 etcd1
    192.168.88.127 etcd2
    192.168.88.126 master0
    192.168.88.125 master1
    192.168.88.124 master2
    192.168.88.123 build0
    192.168.88.122 node0
    192.168.88.121 node1
    192.168.88.120 node2
    192.168.88.119 node3
    192.168.88.118 node4
    192.168.88.117 node5
    192.168.88.116 node6
    192.168.88.115 node7
    192.168.88.190 gpu
    192.168.88.192 gpu2 h3cgpu
    192.168.88.194 gpu3 h3cgpu2
    192.168.88.196 gpu4 h3cgpu3
    192.168.88.102 registry.csdcinfo.cn registry.csdc.info
    192.168.88.233 gitlab.csdcinfo.cn gitlab.csdc.info
    192.168.88.231 rancher.csdcinfo.cn rancher.csdc.info
  2. vim /etc/sysctl.conf

    1
    2
    3
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1

    刷新配置

    1
    2
    modprobe br_netfilter
    sysctl -p
  3. 关闭防火墙

1
2
3
systemctl stop firewalld
systemctl disable firewalld
firewall-cmd --state
  1. 关闭 selinux
1
2
3
4
5
#永久关闭,一定要重启操作系统后生效。
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

#临时关闭,不重启操作系统,即刻生效。
sudo setenforce 0
  1. 主机 swap 分区设置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #永久关闭,需要重启操作系统生效。
    sudo swapoff -a
    # 注释掉 /etc/fstab 里所有 swap 行
    sudo sed -i '/swap/s/^/#/' /etc/fstab

    # 应该无输出
    swapon --show
    free -h # Swap 行应为 0B

    # cat /etc/fstab
    ···
    #/dev/mapper/centos_192-swap swap defaults {} {}
    #临时关闭,不需要重启操作系统,即刻生效。
    # swapoff a
  2. 时间同步

    1
    2
    3
    yum -y install ntpdate
    crontab -e
    0 */1 * * * ntpdate time1.aliyun.com
  3. 添加 rancher 用户
    使用 CentOS 时,不能使用 root 账号,因此要添加专用的账号进行 docker 相关操作。重启系统以后才能生效,只重
    的!重启后,rancher 用户也可以直接使用 docker ps 命令

    1
    2
    3
    useradd rancher
    usermod -aG docker rancher
    echo 123 | passwd --stdin rancher
  4. 复制 ssh 证书
    从 rke 二进制文件安装主机上复制,如果已经复制,则可不需要重复性复制。

  • 复制证书
    1
    ssh-copy-id rancher@worker02
  • 验证 ssh 证书是否可用
    在 rke 二进制文件安装主机机测试连接其它集群主机,验证是否可使用 docker ps 命令即可。
    1
    ssh rancher@worker02

8 ack 集群 arthas 调试方法

1
2
3
4
5
6
7
8
9
10
# 进入arthas目录
cd /opt/arthas/
# 下载jattach
wget https://hub.gitmirror.com/https://github.com/apangin/jattach/releases/download/v2.1/jattach
# 添加目录执行权限
chmod +x /opt/arthas/jattach
# 加载java进程到arthas
./jattach 1 load instrument false /opt/arthas/arthas-agent.jar
# 启动arthas
java -jar arthas-client.jar 127.0.0.1 3658

9 手动调整专网默认缺省路由

1
2
3
4
5
6
7
8
9
#99段优先
route del default gw 192.168.99.1
route add default gw 192.168.99.1 metric 50
route -n

#88段优先
route del default gw 192.168.99.1
route add default gw 192.168.99.1 metric 101
route -n

9.1 创建 Systemd 服务固化路由配置

适用于使用 Systemd 的现代 Linux 系统(CentOS 7+, Ubuntu 16.04+)

  1. 创建服务文件:
1
sudo vim /etc/systemd/system/static-routes.service
  1. 写入以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Static Routes
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ip route add 100.1.1.0/24 via 192.168.99.1
ExecStart=/sbin/ip route add 144.0.0.0/8 via 192.168.99.1

[Install]
WantedBy=multi-user.target
  1. 启用并启动服务:
1
2
3
sudo systemctl daemon-reload
sudo systemctl enable static-routes.service
sudo systemctl start static-routes.service

10 Glusterfs 常用操作

10.1 查看容量

1
2
3
4
5
6
7
8
9
10
11
heketi-cli node list 查看所有节点

heketi-cli node info 1f5074b6a92ff222cc59d71426638c56 查看单个节点

heketi-cli volume list 查看所有卷

heketi-cli volume list | grep vol_366bbff89824f57eb02ffa290462d39b 查看特定卷

heketi-cli volume delete 366bbff89824f57eb02ffa290462d39b 删除卷

mount -t glusterfs 192.168.88.170:vol_69994102f7e8a927ebeb3acd3784590c /mnt/hsas_log/

10.2 扩容

在 170 主节点上执行以下命令

1
2
3
4
5
6
7
8
9
10
11
heketi-cli device add --name /dev/sde --node 1f5074b6a92ff222cc59d71426638c56

heketi-cli device add --name /dev/sdf --node 1f5074b6a92ff222cc59d71426638c56

heketi-cli device add --name /dev/sde --node a55452348b59fe6312e34d9801a33e1e

heketi-cli device add --name /dev/sdf --node a55452348b59fe6312e34d9801a33e1e

heketi-cli device add --name /dev/sde --node c69166fd5d586c4354d6c77312467a6a

heketi-cli device add --name /dev/sdf --node c69166fd5d586c4354d6c77312467a6a

11 K8s静态路由配置

本地Windows如果需要能够访问k8s的内部网络,需要做静态路由:

  • 测试环境

    1
    route add 10.44.0.0 mask 255.255.0.0 -p 192.168.88.115
  • 正式环境

    1
    route add 10.42.0.0 mask 255.255.0.0 -p 192.168.88.133
  • 研究环境

    1
    route add 10.64.0.0 mask 255.255.0.0 -p 192.168.88.126
  • 查看静态路由表

    1
    route print

12 参考文献

  1. free-programming-books/books/free-programming-books-zh.md
  2. 节点压力驱逐 | Kubernetes
  3. Error排错:The node was low on resource: ephemeral-storage
  4. 虚拟机如何选择处理器和内核数量,实现最佳性能_虚拟机设置cpu处理器只有处理内核数量
  5. 无法打开虚拟机,获取该虚拟机的所有权失败。 主机上的某个应用程序正在使用该虚拟机
  6. 【vSphere】更改集群中ESXi主机IP地址的安全方法_vsphere改ip-CSDN博客

运维排忧解难
https://alleyf.github.io/2024/06/1d24d86ba310.html
作者
fcs
发布于
2024年6月28日
更新于
2026年1月3日
许可协议