运维排忧解难
本文最后更新于:3 个月前
1 常用指令
[!NOTE] 符号说明
指令中小括号()
内为选填项,<>
为填充项(根据实际变量进行填充)。
1.1 Linux 指令
1.1.1 Ssh 连接
-p 指定端口,默认不带则为 22 端口
1 |
|
1.1.2 文件传输
通过 ssh 协议用于在本地计算机和远程计算机之间安全地复制文件
- 本地到远程
1 |
|
- 远程到本地
1 |
|
1.1.3 查看路由表
1 |
|
1.1.4 查看资源
查看所有资源占用情况,降序排列,top
默认会实时更新显示的信息,通常每秒刷新一次。
1 |
|
- 排序:
- 按 CPU 使用率排序:按
P
键。 - 按内存使用率排序:按
M
键。 - 按执行时间排序:按
T
键。
- 按 CPU 使用率排序:按
- 搜索进程:
- 输入
u
键,然后输入用户名,可以显示该用户的所有进程。 - 输入
p
键,然后输入进程 ID(PID),可以快速定位到特定进程。
- 输入
- 过滤进程:
- 输入
U
键,然后输入用户名,可以过滤显示该用户的进程。 - 输入
P
键,然后输入进程 ID(PID),可以过滤显示该 PID 的进程。
- 输入
- 杀死进程:
- 输入
k
键,然后输入进程 ID 和要发送的信号(默认是 SIGTERM,即 15),可以杀死进程。
- 输入
1.1.5 查看进程
ps
命令在 Unix-like 系统中用于显示当前进程的状态。
1 |
|
参数说明
USER
:进程所有者的用户名。PID
:进程的 ID。%CPU
:进程占用的 CPU 百分比。%MEM
:进程占用的内存百分比。VSZ
:虚拟内存大小(Virtual Size)。RSS
:实际内存大小(Resident Set Size)。TTY
:进程终端类型。STAT
:进程状态。START
:进程启动时间。TIME
:进程占用 CPU 的时间。COMMAND
:启动进程的命令。
常见组合
- ps aux (–sort=-%mem/cpu): 显示所有进程(按照内存/CPU 使用率降序排列进程)
- ps -ef:显示所有进程的完整信息。
- ps -p PID:显示特定进程的详细信息。
1.1.6 查看内存
以人类可读的方式展示内存使用状态。
1 |
|
1.1.7 查看硬盘
以人类可读的方式展示磁盘分配状态。
1 |
|
1.1.8 查看系统日志
journalctl
是 systemd
系统服务管理器的一部分,用于查询和显示日志消息。它提供了一种方便的方式来查看系统日志,特别是与特定服务或单元相关的日志。
1 |
|
查看系统日志
1 |
|
查找cpu相关日志:
1 |
|
1.1.9 查看编辑文件
1.1.9.1 搜索文件
按照关键词搜索含有关键词的文件
1 |
|
1 |
|
1.1.9.2 查看文件数量
1 |
|
1.1.9.3 查看目录
列出当前目录下的文件和文件夹
1 |
|
常见搭配
- ls -lh:组合使用
-l
和-h
选项,以易读的格式显示文件大小。 - ls -l:以长列表格式显示文件详细信息,包括权限、所有者、大小和最后修改时间。
- ls -lt:以修改时间排序,最新修改的文件排在最前面。
- ls -lS:以文件大小排序。
- ls -a:显示所有文件,包括以点(
.
)开头的隐藏文件。 - ls -R:递归地列出所有子目录的内容。
- ls -F:在每个文件名后添加一个字符以指示文件类型,例如,
/
表示目录,*
表示可执行文件。 - ls -o:显示文件所有者和组,但不显示组名。
- ls –color:使用颜色来区分不同类型的文件。
- ls *.txt:列出当前目录下所有的
.txt
文件。
- ls -lh:组合使用
参数解释:
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 |
|
1.1.9.5 新建文件
新增一个文件,或写入内容到文件中
1 |
|
1.1.9.6 编辑内容
使用 Vim 编辑器编辑文件
1 |
|
- 常见操作:
- i:进入插入写模式
- esc:退出当前模式
- :指令模式
- :q:直接退出
- :wq:保存退出
1.2 K8s 和 Docker 相关指令
1.2.1 K8s
1.2.1.1 集群
获取 prod 集群中所有节点信息
1 |
|
1.2.1.2 节点
获取指定命名空间下的所有 pod
1 |
|
获取指定 pod 的详情(可根据 event 排查 pod 的错误信息
)
1 |
|
条件查询指定命名空间下指定状态的 pod 并批量删除
1 |
|
强制删除 pod
1 |
|
1.2.1.3 Pod
启动定时任务
1 |
|
1.2.2 Docker
1.2.2.1 配置镜像
为镜像仓库配置下载源,查看 /etc/docker/daemon.json
文件来确定当前配置的镜像源,如果该文件不存在或为空,则默认使用 Docker 官方镜像源。
- 查看镜像源配置
1 |
|
- 修改配置
多个镜像源以逗号分隔
1 |
|
常见镜像源:
- public-image-mirror
- ISCAS 开源镜像站
- docker.rainbond.cc
- 网易云镜像源
- icu紧急镜像源
- 阿里云镜像源
- 上海交大镜像站
- 南京大学镜像站
- DockerHub国内镜像源列表-20240618
- 从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
- 国内无法拉取Docker镜像了?这些方法拯救你的Docker-腾讯云开发者社区-腾讯云
测速(测速前先移除本地的镜像!)
docker rmi nginx:latest
time docker pull nginx:latest
- 重启服务更新配置
1 |
|
1.2.2.2 保存镜像
将指定本地镜像保存为 tar 压缩包
1 |
|
1.2.2.3 加载镜像
根据指定镜像压缩包加载镜像到本地
1 |
|
1.2.2.4 删除镜像
删除所有未使用的镜像,容器和存储卷。
1 |
|
1.2.2.5 更新镜像
对已有的变更环境进行保存以便于 pod 重启后维持最新环境
1 |
|
OPTIONS
-a
或--author
:设置镜像的作者字段。-c
或--change
:应用 Dockerfile 指令来创建镜像。-m
或--message
:提交时的说明信息。-p
或--pause
:提交时暂停容器运行(默认为 true)。
CONTAINER
是你要提交的容器的 ID 或名称。REPOSITORY
是新创建镜像的仓库名称。TAG
是可选的,用于给镜像指定一个标签,如果不指定,默认标签是latest
。
1.3 MySQL 指令
1.3.1 找到配置文件位置
1 |
|
1.3.2 查看日志所在位置
1 |
|
2 常见问题
[!warning] Tips
- 重启(物理机、虚拟机、服务、pod 等) 可能是
最直接常见的办法
,但不是最有效
的办法,具体问题具体分析,重在根据问题逐步搜索的排查思路,自顶向下排查,自底向上解决。- 遇到问题不要慌,众里寻它先百度,属是不行再问路,先思考后动脑,多学多看多实践,能力日益节节高。
2.1 镜像无法拉取
- 原因:由于国内防火墙导致国外官方镜像仓库被墙无法拉取镜像,本地镜像库缓存导致拉取时没有找到最新镜像,docker 网络问题,系统网络问题
- 办法:
- 出国旅游:windosw 开启魔法拉取镜像后通过 docker save 和 load 转移镜像,并 push 到本地私有镜像仓库留存。
- 取而代之:寻找国内镜像源仓库,直接拉取国内镜像仓库的镜像到本地,并推送到本地私有仓库留存。(国内镜像仓库不稳定,可能会清除镜像)
- 重启 docker:docker pull 卡在 waiting 则可能是网络问题,将 pod 所在节点的 docker 进行重启。
- 检查 hosts 添加记录:
cat /etc/hosts
记录格式:ip domain - 重启系统网络:
sudo systemctl restart NetworkManager
2.2 内存/硬盘满载/溢出
- 原因:随着时间的累积和负载变化,内存或硬盘资源可能会不够,虚拟机负载过大,无法提供正常响应。
- 办法:
- 内存:清理无用进程(kill),重启虚拟机(reboot),扩容内存(vcenter 扩大虚拟机内存)
- 硬盘:查看磁盘分区和挂载情况(df -h),清理无用文件(rm -rf),转移文件(mv),硬盘扩容(分配更多分布式存储容量,添加一块磁盘并进行磁盘分区)
2.3 挂载卷存储满载
- 原因:挂载的数据卷存储容量有限,当满载后无法在挂载目录下新增目录或文件。
- 办法:
- 清理挂载目录下无用的文件,腾出可用空间
- 对挂载卷进行扩容,增加其存储容量。
2.4 CPU 核心过多软锁定
- 问题描述:
1 |
|
- 原因:日志表明系统遇到了一个“软锁定”(soft lockup)的情况。这通常意味着某个进程或线程在 CPU 上运行了很长时间,导致系统监视器认为它可能已经冻结或卡住。
- 死锁:一个或多个进程可能陷入了死锁状态,导致 CPU 无法处理其他任务。
- 资源竞争:进程之间可能存在资源竞争,导致 CPU 长时间占用。
- 无限循环:代码中可能存在无限循环,导致 CPU 被持续占用。
- 内核问题:可能是内核本身的问题,比如驱动程序或内核补丁引起的问题。
- 高负载:系统可能由于高负载而无法及时响应。
cpu stuck 软锁定的原因有很多种,比如供电不足、虚拟机 cpu 核心数超过物理机核心数、虚拟机/物理机 cpu 太忙或磁盘 IO 太高、linux 内核 bug 等
- 办法:
- 使用
cat /var/dmesg
或journalctl
查看内核日志。 - 查看核心数是否过多(eg:32),关机减少核心数(eg:12);所有虚拟机的虚拟 cpu 加起来可能会超过物理机实际 cpu 线程数,但单个虚拟机的虚拟 cpu 处理器数不能超过物理机线程数,一般虚拟 cpu 个数和物理机 cpu 个数保持一致,总处理器数设为物理机的一半。(参考:虚拟机如何选择处理器和内核数量,实现最佳性能_虚拟机设置cpu处理器只有处理内核数量-CSDN博客)
- 使用
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 |
|
查看版本:
1 |
|
版本降级:
1 |
|
重启kubelet:
1 |
|
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-lh1longhornio/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;