运维排忧解难

本文最后更新于:3 个月前

1 常用指令

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

1.1 Linux 指令

各种环境配置

1.1.1 Ssh 连接

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

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

1.1.2 文件传输

通过 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.3 查看路由表

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

1.1.4 查看资源

查看所有资源占用情况,降序排列,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.5 查看进程

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.6 查看内存

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

1
free -mh

1.1.7 查看硬盘

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

1
df -h

1.1.8 查看系统日志

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.9 查看编辑文件

1.1.9.1 搜索文件

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

1
find . -type f -exec grep -l 'mysql-master' {} \;
1
grep 'temporary password' /var/log/mysqld.log

1.1.9.2 查看文件数量

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

1.1.9.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.9.4 查看内容

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

1
cat <fileName>

1.1.9.5 新建文件

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

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

1.1.9.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

强制删除 pod

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

1.2.1.3 Pod

启动定时任务

1
kubectl-prod -n mysql create job --from=cronjob/cweb-mysql-backup cweb-k8s-mysql-master

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进行解决。

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 数据备份

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 参考文献

  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. 无法打开虚拟机,获取该虚拟机的所有权失败。 主机上的某个应用程序正在使用该虚拟机

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