跳转至

c05-常用命令总结

自我介绍

你好面试官,我叫xxx 上家公司在天翼云工作 主要工作是资源池建设 交付部署运维 编写自动化部署脚本 编写制定集成规范,部署流程等相关的工作

本人擅长 自动化 云计算 写自动化脚本 写总结 写文档 写流程 写规范 写方案 画流程图 架构图 做企业技术培训 平时喜欢做技术分享

dell 惠普 h3c 华为 烽火

服务器优化 配网 升级 巡检 脚本 kvm虚拟机创建脚本

使用ansible编写云平台 openstack 组件部署脚本

902190089

linux

常用命令类

cd 
mkdir
touch 
lscpu 
free -h
ip addr
lsblk
find 

三剑客命令

1. grep 命令

功能:文本搜索工具,支持正则表达式匹配。

常用参数

参数 说明 示例
-i 忽略大小写 grep -i "error" log.txt
-v 反向匹配(显示不包含模式的行) grep -v "success" data.txt
-n 显示匹配行的行号 grep -n "root" /etc/passwd
-r 递归搜索目录 grep -r "TODO" ./src
-E 使用扩展正则表达式 `grep -E "hello
-w 完全匹配单词 grep -w "apple" fruits.txt
-A 2 显示匹配行及其后2行 grep -A 2 "error" log.txt
-B 2 显示匹配行及其前2行 grep -B 2 "start" demo.txt
-C 2 显示匹配行前后各2行 grep -C 2 "end" data.txt
-l 仅显示包含匹配的文件名 grep -rl "pattern" ./project
-c 统计匹配行数 grep -c "error" *.log

2. sed 命令

功能:流式文本编辑器,支持替换、删除、插入等操作。

常用参数

参数 说明 示例
-i 直接修改文件(GNU) sed -i 's/old/new/g' file.txt
-i.bak 修改文件并备份(BSD/macOS) sed -i.bak 's/old/new/g' file.txt
-e 允许多个编辑命令 sed -e 's/a/b/' -e 's/c/d/' file.txt
-n 抑制自动打印模式空间 sed -n '2,5p' file.txt
s/old/new/ 替换命令,g 表示全局替换 sed 's/hello/HELLO/g' demo.txt
d 删除行 sed '3d' file.txt(删除第3行)
a 在行后追加文本 sed '2a\New Line' file.txt
i 在行前插入文本 sed '2i\Inserted Line' file.txt
y/old/new/ 字符转换(如大小写) sed 'y/abcdef/ABCDEF/' data.txt

3. awk 命令

功能:文本分析工具,按列处理数据。

常用参数

参数 说明 示例
-F 指定字段分隔符(默认为空格) awk -F',' '{print $2}' csv.txt
-v 定义变量 awk -v var=1 '{print var, $1}' data.txt
$0 当前行内容 awk '{print $0}' file.txt
$1, $2... 第1、2...列 awk '{print $1, $3}' data.txt
NR 当前行号 awk 'NR>5 {print}' file.txt(从第6行开始)
NF 当前行字段数 awk '{print NF, $NF}' file.txt
BEGIN 处理前执行的动作 awk 'BEGIN {print "Start"} {print $1}'
END 处理后执行的动作 awk '{sum+=$1} END {print sum}' data.txt

4. find命令

1)-type表示查找类型,f表示文件,d表示目录

2)-name精确查找文件或目录名称

3)-mtime根据修改时间查找文件或目录 +7表示7天以前 -7表示七天以内 第七天7表示

4)-size根据文件大小查找,+100k +100M

5)find命令后面加上管道与xargs命令配合

6)xargs -i mv {} /tmp 将find查找的内容通过xargs -i参数放进{}这个框里

7)xargs mv -t /tmp mv的参数-t 可以反转源路径和目标路径

正则表达式

常用正则

字符 描述
^ ^word表示搜索以word开头的内容
$ word$表示搜索以word结尾的内容

拓展正则

字符 描述
+ 重复一个或多个字符(*是0个或个多)
| 同时过滤多个关键字字符
重复0个或1个前面的字符
() 找出"用户组"字符串

常见符号与通配符

[常见通配符]

通配符 解释说明
* 代表任意字符(0个或多个)
代表任意一个字符
[] 匹配中括号中的任意一个字符

[常见符号]

符号 解释说明
连续两个命令的分隔符(前面的命令执行错误,后面的命令也能正常执行)
# 用来注释文件内容信息
| 管道符号,将前面命令的结果,通过管道传送给后面的命令
~ 用户的家目录
- 上一次目录
. 当前目录
.. 上一级目录
$ (1)引用系统变量使用例如$OLDPWD (2)表示普通用户提示符
/ (1)系统根目录 (2)路径的分隔符,用来分割路径
(1)取反 (2)vi中表示强制退出 (3)!c 表示在历史记录中调出最近一次以c开头的命令
> > 或1> **输出重定向:**把前面的输出的东西输入到后面的文件中,但是会清空原来文件的内容。
>> >>或1>> **追加重定向:**把前面输出的东西追加到后面的文件中,不会清空原有的文件内容
< <或<0 输入重定向:用于改变命令的输入,后面指定输入内容,前面跟文件名。(箭头的方向就是数据的流向)
<< <<或<<0 追加输入重定向:后跟字符串,用来表示“输入结束”,也可以使用Ctrl+d键结束
2> 错误重定向:把错误信息输入到后面的文件中,但是会清空文件原有的内容,并输入错误提示信息到文件内容中。
2>> 错误追加重定向:把错误的信息追加到文件内容的最后一行,不会清空原来的文件内容。
' ' 单引号,原样输出内容,所见即所得
" " 双引号,会将解析的变量输出
反引号,会将命令的执行结果输出
{ } 中间表示命令块,或创建数字序列
&& 前一个命令执行成功后,才继续执行下一个命令。例:p1 && p2 ;若p1执行成功后,才执行p2,反之,不执行p2;
|| 前一个命令执行失败后,才继续执行下一个命令。例:p1 || p2 ;若p1执行成功后,不执行p2,反之,才执行p2;

网络类命令

tcpdump

tcpdump‌ 是一款用于Unix/Linux系统的命令行网络数据包捕获与分析工具,支持基于协议、主机、端口等条件的过滤,常用命令如 tcpdump -i eth0 host 192.168.1.1 and port 80 -c 10 -w output.pcap 可抓取指定IP和端口的数据包并保存为文件。

基础命令与参数‌

指定网卡与基础抓包‌。

tcpdump -i eth0:监听eth0网卡的所有流量(需root权限)。‌
tcpdump -D:列出系统所有可用网卡。‌‌

过滤条件‌。

IP过滤‌:
tcpdump host 192.168.1.1:抓取与指定IP相关的所有流量。‌‌
tcpdump src 192.168.1.1 或 tcpdump dst 192.168.1.1:按源/目标IP过滤。‌‌
端口过滤‌:
tcpdump port 80:抓取HTTP流量。‌
tcpdump src port 22:抓取源端口为SSH的流量。‌‌
协议过滤‌:
tcpdump icmp:仅抓取ICMP协议包(如ping请求)。‌‌

逻辑组合与高级过滤‌。

使用 and/or/not 组合条件,例如:
tcpdump "host 192.168.1.1 and (port 80 or port 443)"。‌
BPF语法支持更复杂过滤,如 tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0' 抓取TCP握手包。‌‌

输出控制与保存‌

限制抓包数量‌。
tcpdump -c 100:抓取100个包后自动停止。‌
保存与分析‌。
tcpdump -w output.pcap:保存原始数据供Wireshark分析。‌
tcpdump -r output.pcap:读取已保存的抓包文件。‌‌
输出格式‌。
-n:禁用DNS解析,显示IP而非域名。‌‌
-vvv:输出更详细的协议信息。‌‌

高级用法示例‌

抓取特定服务的流量‌。
HTTP请求:tcpdump -i eth0 -nn "tcp port 80 and (((ip^2:2^ - ((ip&0xf)<<2)) - ((tcp&0xf0)>>2)) != 0)"。‌
排除干扰数据‌。
tcpdump not port 22:过滤SSH流量。‌‌
实时显示MAC地址‌。
tcpdump -e:输出包含MAC地址的链路层信息。‌‌

DNS系统架构与解析原理

参考答案:

DNS解析原理

TCP/IP的3次握手和四次断开原理

参考答案:

TCP三次握手

ISO网络模型

ISO参考模型:物理层/数据链路层/网络层/传输层/会话层/表示层/应用层

‌各层功能详解‌

‌物理层(Physical Layer)‌。
负责比特流在物理介质(如电缆、光纤)上的传输,定义电压、接口等电气特性。典型设备包括集线器和中继器。‌‌
3‌‌
4

‌数据链路层(Data Link Layer)‌。
通过MAC地址寻址,将数据封装为帧(Frame),并提供差错控制和流量管理。交换机是该层的代表设备。‌‌
3‌‌
5

‌网络层(Network Layer)‌。
使用IP协议实现逻辑寻址和路由选择,确保数据包跨网络传输。路由器工作于此层。‌‌
3‌‌
6

‌传输层(Transport Layer)‌。
提供端到端的可靠传输(如TCP协议)或不可靠传输(如UDP协议),负责数据分段、流量控制和差错恢复。‌‌
2‌‌
7

‌会话层(Session Layer)‌。
管理通信会话的建立、维护和终止,支持全双工或半双工对话同步。‌‌
4‌‌
7

‌表示层(Presentation Layer)‌。
处理数据格式转换(如加密/解密、压缩/解压缩),确保不同系统间的语法兼容性。‌‌
4‌‌
7

‌应用层(Application Layer)‌。
直接为用户应用程序(如HTTP、FTP)提供网络服务接口,实现文件传输、邮件收发等功能。‌‌

TCP/IP模型

‌TCP/IP模型的核心架构‌

‌应用层‌:直接面向用户,整合了OSI模型中应用层、表示层和会话层的功能,提供HTTP、FTP、SMTP等协议支持网络服务。‌‌
1‌‌
2
‌传输层‌:确保端到端通信,包含TCP(可靠连接,三次握手)和UDP(无连接高速传输)协议,负责数据分段、流量控制和差错恢复。‌‌
3‌‌
4
‌网络层‌(网际互联层):通过IP协议实现逻辑寻址和路由选择,核心协议包括IP、ICMP(错误诊断)、ARP(地址解析)等。‌‌
1‌‌
5
‌网络接口层‌:对应OSI的物理层和数据链路层,处理硬件接口(如以太网、Wi-Fi)和帧封装,实现比特流传输。‌‌
3‌‌

mysql

高可用方案

Galera Cluster是集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster和MariaDB Cluster,Galera本时是具有多主特性,即采用Multi-master的集群架构,是一个即稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案。

image-20250807104838672

Galera Cluster种每个MySQLServer之间相互为主主的关系,当客户端发送指令到一个数据库时,数据库将数据修改后返回一个OK,表示用户的请求已经被收到,但是事务并没有结束依旧可以撤销。当事务结束时用户发送一个commit(提交),服务器收到后会将数据的更新发送给其他的MySQLServer,此时会开启一个全局性的事务ID给组内的其他服务器,其他服务器会查看是否有事务冲突,如果没有冲突就确认更改成功。

主要特点: 多主架构:真正的多点读写的集群,在任何时候读写数据都是最新的 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失 并发复制:从节点APPLY数据时,支持并行执行有更好的性能。 故障切换:数据库故障时,因为支持多点写入,切换容易 热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务的时间就会非常少。在节点故障期间,节点本身对集群的影响非常小 自动节点克隆: 在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一直 对应用透明:集群的维护,对应用程序是透明的 https://blog.csdn.net/ZouChengli/article/details/107564041

常用命令类

systemctl start mariadb
systemctl stop mariadb


mysql -u root -p                                                                                    # 登录进入数据库
create database test01(character set utf8);
drop database test01;

use test01;
show databases;                                                                                     # 显示数据库的表

# 创建表与删除表
use 库名;
create table 表名(字段列表);
drop table 表名;

# 显示表中的记录
select * from 表名;

ceph

存储类型区分

特性 块存储 文件存储 对象存储
数据结构 固定大小数据块(512B/4KB) 树状目录结构下的文件和子文件夹 自包含的,无层级结构的(数据+元数据)
接口标准 SCSI/iSCSI/FC 文件系统协议:如NFS/SMB/CIFS/FTP/HTTP RESTful API/S3/Swift 接口
元数据 上层应用管理 文件系统内置(大小/日期等) 对象自带自定义元数据
应用场景 虚拟机磁盘/数据库存储/大型企业应用 文件共享/网络附加存储NAS/备份恢复 大规模非结构化数据/CDN内容分发/备份
对应产品 SAN存储/本地磁盘/虚拟机磁盘/数据库实例 NAS设备/云文件服务 AWS S3/Azure Blob/阿里云OSS
扩展性 高 扩展复杂度相对较高,需精细管理 中等(可通过添加更多NAS节点扩展) 极高(添加支持横向扩展 增加存储容量)
数据访问 高性能低延迟(随机I/O) 通过路径定位文件适用于顺序或随机读写 唯一ID访问(适用于规模并行访问)
数据一致性 较强的一致性 尤其对于本地存储 可以提供较强的强一致性保证 可配置(最终到强一致性)
版本控制 无原生支持(依赖应用) 快照实现版本 原生版本控制(轻松回滚)

集群类命令

ceph -s                                                     # 显示集群的整体状态,包括监视器、管理器、OSD 的数量和状态,以及存储池信息等
ceph health                                                                             # 显示集群的健康状态,若集群健康会显示 HEALTH_OK
ceph health detail                                                              # 当集群不健康时,提供详细错误信息
ceph -w                                                                                     # 持续监控集群状态变化
ceph df                                                                                     # 查看全局存储使用情况,包括每个 OSD 的用量和 PG 数量
ceph df detail                                                                      # 显示更详细的存储池使用情况
ceph osd stat                                                                           # 显示所有 OSD 的状态(如 up/down)
ceph osd tree                                                                       # 查看 OSD 目录树,了解分布情况
ceph osd dump                                                                           # 获取指定 OSD 的详细信息(如权重、状态等)
ceph osd df                                                                             # 查看osd节点的使用情况

存储池命令

ceph osd pool create rbd 128                                    # 创建存储池
ceph osd pool application enable rbd rbd            # 启用存储池
ceph osd pool ls                                                            # 查看存储池

每个pool应该分配多少个PG,与OSD的数量、复制份数、pool数量有关,有个计算公式在:

Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count

结算的结果往上取靠近2的N次方的值。比如总共OSD数量是160,复制份数3,pool数量也是3,那么按上述公式计算出的结果是1777.7。取跟它接近的2的N次方是2048,那么每个pool分配的PG数量就是2048。

块存储命令

rbd create --size 4096 test01 --image-feature layering --pool rbd # 创建快存储
rbd ls -l                                                                           # 查看创建的块存储
rbd --image test01 info                                             # 详细查看块存储
rbd resize --image test01 --size 8192                   # 扩容块存储

rbd rm test01                                                                   # 删除块存储

扩缩容类命令

# ceph mon 节点扩容
cd /data/ceph/
ceph-deploy --overwrite-conf mon add ceph02 
ceph -s
ceph mon stat 

# ceph mon 节点缩容
cd /data/ceph/
ceph-deploy mon destroy ceph03
ceph -s

# ceph osd 节点扩容
cd /data/ceph/
mkfs.xfs -f /dev/sdd                                                        # 初始化磁盘
ceph-deploy disk zap ceph03 /dev/sdd                        # ceph初始化磁盘
ceph-deploy osd create --data /dev/sdd ceph03       # 添加osd节点
ceph osd tree                                                                       # 检查osd节点是否扩容成功

# ceph osd 节点缩容
ceph osd tree
ceph osd out osd.8                                                          # 将 OSD 下线
systemctl disable --now ceph-osd@8                          # 客户端的osd节点停止osd相关进程
ceph auth del osd.8                                                         # 删除osd认证密钥d
ceph osd rm osd.8                                                               # 将 OSD 删除  注意观察osd的状态为DNE
dmsetup status                                                                  # 客户端解除ceph对磁盘的占用
dmsetup remove ceph--d17c50bc--c897--451d--8d0b--0424a7521af9-osd--block--94ee413b--6ed6--49d6--a70e--7881ef33f89a
ceph osd crush remove osd.8                                         # 管理端清除osd的DNE状态,从crush中移除
ceph -s                                                                                 # 验证集群状态,发现集群数据缩容成功

服务管理

mon节点相关服务

systemctl status ceph-mon.target
systemctl status ceph.target
systemctl status ceph-mon@ceph01.service

osd节点相关服务

systemctl status ceph-osd.target
systemctl status ceph.target
systemctl status ceph-osd@0.service
systemctl status ceph-osd@1.service
systemctl status ceph-osd@2.service

故障处理

处理磁盘故障失败

作为存储管理员,您必须在存储群集的生命周期内处理磁盘故障。在发生实际故障前,测试和模拟磁盘失败将确保您为实际情况做好准备。

以下是替换故障磁盘的高级别工作流:

查找失败的 OSD。   ceph osd tree
将 OSD 变为 out。  ceph osd out osd.8
停止节点上的 OSD 守护进程。 systemctl disable --now ceph-osd@8
检查 Ceph 的状态。 ceph -s
从 CRUSH map 移除 OSD。 ceph osd crush remove osd.8 
删除 OSD 授权。   ceph auth del osd.8
从存储集群中移除 OSD。  ceph osd rm osd.8    
卸载节点上的文件系统。   dmsetup remove ceph--d17c50bc-
替换失败的驱动器。   通知机房人工替换或者修复磁盘
将 OSD 重新添加到存储集群。  ceph osd 节点扩容
检查 Ceph 的状态。 ceph -s

openstack

架构图

image-20250807102528319

网络划分

image-20250807114457835

虚拟机创建流程

image-20250807102604869

集群类命令

source /root/admin-openrc 
nova service-list
neutron agent-list
cinder service-list

openstack image list                                                        # 查看镜像
openstack image delete <image_id>                               # 删除镜像
openstack image show <image_id>                                 # 查看镜像详细信息
openstack image set <image_id>                                  # 更新镜像ID

openstack flavor list                                                       # 查看虚拟机规格                                   

openstack user list                                                         # 查看所有租户
openstack role list                                                         # 查看所有角色
openstack catalog list                                                  # 列出认证服务目录

openstack server list --all                                         # 查看所有租户下的虚拟机
openstack server list --all --long                          # 查看所有租户下的虚拟机(可以显示更多信息 包括虚拟机所在节点)
nova list --all                                                                 # 查看所有租户下的虚拟机
nova show 32191deb-0c65-464a-9625-d15256c77d57  # 查看虚拟机的详细信息包含虚拟机所在节点

租户类命令

source demo-openrc
openstack network list                                                                      # 查看租户网络
openstack subnet list                                                                           # 查看租户子网
openstack port list                                                                             # 查看租户port ip
openstack floating ip list                                                              # 查看租户浮动IP
openstack volume list                                                                           # 查看租户创建的卷
openstack console url show selfservice-instance                     # 查看租户虚拟机vnc地址
openstack console log show selfservice-instance                     # 查看租户console log日志

openstack server stop selfservice-instance                              # 关闭虚拟机
openstack server start selfservice-instance                             # 开启虚拟机
openstack server reboot selfservice-instance                            # 重启虚拟机
openstack server pause selfservice-instance                             # 暂停虚拟机
openstack server unpause selfservice-instance                           # 取消暂停虚拟机
openstack server suspend selfservice-instance                           # 挂起虚拟机
openstack server resume selfservice-instance                            # 恢复虚拟机
openstack server rescue <server_id> --rescue_image_ref <rescue_image>       # 恢复虚拟机
openstack server resize <server_id> <flavor_name>                   # 调整需求规格大小
openstack server rebuild <server_id> <image_id>                     # 重装虚拟机
nova meta <server_id> set <meta_key>=<meta_value>                   # 设置虚拟机元数据

openstack volume snapshot create --volume <volume-id> <snapshot-name>       # 虚拟机做快照
openstack volume snapshot list                                              # 虚拟机查看快照

# 创建网络
openstack network create  --share --external \
  --provider-physical-network provider \
  --provider-network-type flat provider
# 创建子网
openstack subnet create --network provider \
  --allocation-pool start=203.0.113.101,end=203.0.113.250 \
  --dns-nameserver 8.8.4.4 --gateway 203.0.113.1 \
  --subnet-range 203.0.113.0/24 provider
# 创建flavor
openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano
# 安全组规则
openstack security group rule create --proto icmp default
openstack security group rule create --proto tcp --dst-port 22 default

# 创建虚拟机
openstack server create --flavor m1.nano --image cirros \
  --nic net-id=PROVIDER_NET_ID --security-group default \
  --key-name mykey provider-instance

扩缩容类命令

# 下线计算节点的命令
nova service-list
nova  service-disable 154ad59a-d986-446e-91ac-fab6dbf47f0b
nova  service-delete 154ad59a-d986-446e-91ac-fab6dbf47f0b
systemctl disable libvirtd.service openstack-nova-compute.service
systemctl stop libvirtd.service openstack-nova-compute.service

neutron agent-list
neutron agent-delete 154ad59a-d986-446e-91ac-fab6dbf47f0b
systemctl disable neutron-linuxbridge-agent.service
systemctl stop neutron-linuxbridge-agent.service

cinder service-list
cinder service-disable compute1 cinder-volume
cinder service-disable compute1@nfs cinder-volume 
cinder service-disable compute1@lvm cinder-volume 
cinder service-disable compute1@rbd cinder-volume 
cinder-manage service remove  cinder-volume compute1
systemctl disable openstack-cinder-volume.service target.service
systemctl stop openstack-cinder-volume.service target.service

迁移类命令

热迁移单个虚拟机(热迁移需要依赖分布式存储ceph实现)

source /root/admin-openrc
openstack server list --long --all
nova live-migration eb77e2dc-1516-424a-81fe-e5a1c78cc6e2 compute1
openstack server list --long --all

热迁移批量虚拟机(热迁移需要依赖分布式存储ceph实现)

source /root/admin-openrc
openstack server list --long --all
nova host-evacuate-live --target-host compute3 compute1
openstack server list --long --all

冷迁移虚拟机

nova stop selfservice-instance01
scp -rP 10000 355c2264-a2bd-4485-962b-4a231175d39d 192.168.1.223:/var/lib/nova/instances/
chown -R nova.nova /var/lib/nova/instances/355c2264-a2bd-4485-962b-4a231175d39d

mysql
use nova;
desc instances;
select id,hostname,host from instances;
update instances set host='compute2', node='compute2' where uuid='355c2264-a2bd-4485-962b-4a231175d39d';

nova show selfservice-instance01
nova start selfservice-instance01

计算节点超配

内存和磁盘超配虽然能提供更多数量的虚拟机,当该宿主机上大量虚拟机的负载都很高时,轻着影响虚拟机性能,重则引起 qemu-kvm 相关进程被杀,即虚拟机被关机。因此对于线上稳定性要求高的业务,建议不要超配 RAM 和 DISK,但可适当超配 CPU。建议这几个参数设置为:

CPU: CONF.cpu_allocation_ratio = 4
RAM: CONF.ram_allocation_ratio = 1.0
DISK: CONF.disk_allocation_ratio = 1.0
RAM-Reserve: CONF.reserved_host_memory_mb = 2048
DISK-Reserve: CONF.reserved_host_disk_mb = 20480

在OpenStack中,默认的CPU超配比例是1:16,内存超配比例是1:1.5。当宿主机使用swap交换分区来为虚拟机分配内存的时候,则虚拟机的性能将急速下降。生产环境上不建议开启内存超售(建议配置比例1:1)。另外,建议设置nova.conf文件中的reserved_host_memory_mb 参数,即内存预留量(建议至少预留4GB),保证该部分内存不能被虚拟机使用。

vim /etc/nova/nova.conf

[DEFAULT]
reserved_host_memory_mb=4096

#磁盘预留空间,这部分空间不能被虚拟机使用
reserved_host_disk_mb= 10240 

默认OpenStack的CPU超配比例是1:16,内存超配比例是1:1.5。下面配置的就是这个比例,你可以自己算一下,cat /proc/cpuinfo里面的逻辑核数,再x16就是你能够分配给虚拟机的。内存也是类似。

物理cpu数

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

单块cpu核数

cat /proc/cpuinfo| grep "cpu cores"|wc -l

总核数 = 物理CPU个数 × 每颗物理CPU的核数

cpu和内存的超售目的就是为了资源利用的最大化

[root@compute2 ~]# vim /etc/nova/nova.conf
disk_allocation_ratio = 10.0
cpu_allocation_ratio = 10.0
ram_allocation_ratio = 10.0

systemctl restart openstack-nova-compute.service

需要重启控制节点服务

systemctl restart openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service

服务管理

# 控制节点
systemctl stop openstack-cinder-api.service openstack-cinder-scheduler.service
systemctl stop neutron-l3-agent.service
systemctl stop neutron-server.service   neutron-linuxbridge-agent.service neutron-dhcp-agent.service   neutron-metadata-agent.service
systemctl stop     openstack-nova-api.service     openstack-nova-scheduler.service     openstack-nova-conductor.service     openstack-nova-novncproxy.service
systemctl stop openstack-glance-api.service
systemctl stop httpd.service
systemctl stop etcd
systemctl stop memcached.service
systemctl stop rabbitmq-server.service
systemctl stop mariadb.service


# 计算节点
systemctl stop neutron-linuxbridge-agent.service
systemctl stop libvirtd.service openstack-nova-compute.service
systemctl stop openstack-cinder-volume.service target.service

以下是OpenStack各节点典型服务分配(基于2025年最新架构):

控制节点(Controller Node)

  1. Keystone:身份认证与授权服务
  2. Glance:镜像管理服务(API与注册表)
  3. Nova:
  4. nova-api:计算服务API接口
  5. nova-scheduler:虚拟机调度器
  6. nova-conductor:数据库交互代理
  7. Neutron:
  8. neutron-server:网络服务API接口
  9. 核心插件(如ML2)与路由服务
  10. Cinder:
  11. cinder-api:块存储API接口
  12. cinder-scheduler:卷调度器
  13. Placement:资源跟踪与分配服务(独立于Nova)
  14. Horizon:Web仪表盘(可选)
  15. Heat:编排服务(可选)

网络节点(Network Node)

  1. Neutron:
  2. neutron-l3-agent:虚拟路由器与NAT服务
  3. neutron-dhcp-agent:DHCP服务
  4. neutron-metadata-agent:实例元数据服务
  5. neutron-openvswitch-agent:OVS虚拟交换代理(或Linux Bridge代理)
  6. OVN:SDN控制器(高级部署可选)

存储节点(Storage Node)

块存储(Cinder)

  1. cinder-volume:卷管理服务(对接LVM/Ceph等后端)
  2. cinder-backup:卷备份服务(可选)

对象存储(Swift)

  1. swift-proxy:API代理与负载均衡
  2. swift-account/swift-container/swift-object:账户/容器/对象存储服务
  3. swift-replicator/swift-auditor:数据一致性服务

计算节点(Compute Node)

  1. Nova:
  2. nova-compute:虚拟机生命周期管理
  3. nova-libvirt:虚拟化驱动(KVM/QEMU)
  4. Neutron:
  5. neutron-openvswitch-agent:虚拟网络接口管理
  6. 其他:
  7. libvirtd:底层虚拟化服务
  8. qemu-kvm:虚拟机实例运行

补充说明

  • 高可用部署:控制节点通常集群化(如Keystone、MySQL集群),服务分布可能调整。
  • 混合节点:小型部署中,网络/存储服务可能与控制节点合并,但最佳实践建议分离以提升性能。
  • 最新架构:Neutron已支持OVN、SR-IOV等高级网络功能,存储节点可集成Ceph等分布式存储。

网络抓包

在OpenStack环境中抓包,通常是为了调试网络问题,比如虚拟机之间的通信问题、流量分析等。OpenStack使用多种技术来构建和管理云环境,包括计算(Nova)、网络(Neutron)和存储(Cinder)等。下面介绍几种常见的抓包方法:

1. 使用虚拟机内的抓包工具
1.1 使用tcpdump

如果你在虚拟机内部,可以直接使用tcpdump来抓包。例如,要抓取所有经过虚拟机的流量,可以在虚拟机中执行:

sudo tcpdump -i any -w output.pcap

这会捕获所有经过虚拟机的流量,并将输出保存到output.pcap文件中。

1.2 使用Wireshark

在虚拟机中安装Wireshark GUI工具,然后运行它,选择正确的网络接口(通常是eth0或ens3等),然后开始捕获。

2. 使用Neutron的端口镜像功能

如果你的OpenStack部署支持Neutron网络,可以使用端口镜像功能来抓取特定端口的流量。

2.1 创建端口镜像

首先,你需要创建一个端口镜像:

openstack port mirror create --name mirror-name --type flow --port-id port-id-to-mirror --shared

其中mirror-name是镜像的名称,port-id-to-mirror是你想要监控的端口的ID。

2.2 配置交换机以支持端口镜像

接下来,你需要将镜像端口添加到适当的交换机上:

openstack network set --distributed --provider:network_type vxlan --provider:segmentation_id 10 network-name

然后,将镜像添加到交换机:

openstack network set --mirror mirror-port-id network-name

3. 使用外部抓包工具(如tshark, Wireshark在宿主机上)
3.1 使用tshark在宿主机上抓包

在宿主机上,你可以使用tshark(Wireshark的命令行版本)来抓取通过物理网络接口的流量。例如:

sudo tshark -i eth0 -w output.pcap

这会捕获通过eth0接口的流量。

4. 使用Neutron的端口安全组规则添加日志记录功能(可选)

虽然这不是直接抓包的方法,但可以通过配置安全组规则来记录进出端口的流量:
openstack security group rule create --proto icmp --direction ingress security-group-name
openstack security group rule create --proto icmp --direction egress security-group-name

这些规则可以帮助你监控进出特定端口的ICMP流量。

总结

选择哪种方法取决于你的具体需求和环境配置。如果只是简单地想要查看虚拟机内的流量,使用虚拟机内的tcpdump或Wireshark是最直接的方法。对于需要监控跨多个虚拟机或网络的流量,使用Neutron的端口镜像功能会更加有效。在宿主机上使用tshark或Wireshark也是一种强大的选择,尤其是在需要捕获物理网络流量的场景中。

故障处理方法

ISO参考模型:物理层/数据链路层/网络层/传输层/会话层/表示层/应用层
https://blog.csdn.net/qq_57515401/article/details/147323583

source admin-openrc

一:简单openstack底层网络状态
1.使用ping命令进行简单检查所有管理网是否通信正常,进行互ping
2.使用ssh命令检查所有openstack主机是否可以连接

二:检查openstack网络服务状态
openstack compute service list                                      # 检查Nova服务状态
openstack network agent list                                            # 检查Neutron服务状态
openstack volume service list                                           # 检查Cinder服务状态                                  

三:检查网络拓扑
openstack network list                                                      # 列出所有网络
openstack subnet list                                                           # 列出所有子网
openstack port list                                                             # 列出所有端口

四:检查实例网络配置
openstack server list                                                           # 查看虚拟机状态
openstack server show <server_id>                                   # 查看实例详情 (nova show)
openstack console log show <instance-id>                    # 查看实例console 日志


五:无法获取IP地址
# 检查DHCP代理状态
openstack network agent list | grep dhcp  # 如状态异常可能为neutron-dhcp-agent未正常运行
# 检查DHCP命名空间
ip netns list | grep dhcp

六:检查端口状态
openstack port list --server <instance-id>                  # 查找实例关联的端口
openstack port show <port-id>                                               # 查看端口详情
端口绑定失败:
检查物理网络(如 VLAN/VXLAN)配置或底层插件(OVS/LinuxBridge)状态


七:检查实例内部
# 通过控制台或VNC检查实例内的网络配置
# 确认是否发送了DHCP请求


虚拟机网络不通
检查 OVS/LinuxBridge 是否绑定虚拟机端口:
ovs-vsctl show | grep tap
brctl show | grep tap
检查安全组是否放行流量
openstack port show <端口ID> | grep security_group

故障处理案例

当发现你的OpenStack虚拟机网络有问题,不妨先试一下这16个步骤

https://www.cnblogs.com/popsuper1982/p/8536247.html

1. Security Group全部打开,这是最基本的,但是很多人容易忘记
2. 通过界面查看虚拟机的log,也可以在compute节点上查看console.log文件,看看里面是否有DHCP获取IP成功的日志
在compute节点上可以查看 /var/lib/nova/instances/6323a941-de10-4ed3-9e2f-1b2b25e79b66/console.log
如果没有日志,则说明image有问题

3. 如果虚拟机连不上DHCP Server,则需要准备一个不使用metadata server,而是用用户名密码可以登录的image
这种Image很好做,自己动手做一个就可以了,启动镜像后去掉cloud-init相关配置,然后设置一个默认的用户名密码。

4. 通过VNC登录

5. 如果VNC登录不进去,说明VNC配置的有问题,方法一重新配置VNC
6. 如果VNC登录不进去,还有一个方法,使用自己的VNC Client,通过compute物理节点的IP地址登陆
qemu-system-x86_64 有参数 -vnc 0.0.0.0:5
就可以通过compute node的ip地址进入

7. 通过ovs-vsctl show和brctl来查看,各个网卡和bridge之间关系是否正确,tunnel之间是否能够通,网卡是否都处于up的状态
8. 如果从虚拟机的虚拟网卡到DHCP Server的网卡一路都是配置正确的,则需要查看br-tun上ovs-ofctl dumpflows查看flows规则,是否对包的改写正确,是否有正确的规则
9. 通过VNC登录进去后,就可以通过命令行运行dhclient,来重启连接DHCP Server, 从compute节点上的网卡和bridge,一个个进行tcpdump,看到底哪个网卡或者bridge没有收到包,收到的包里面的VLAN ID等是否正确
10. 如果VM能从DHCP Server获得IP,则好事成了一半,接下来换一个有cloud-init的image,看metadata server能够连接成功,能够注入key,也是通过console.log来看

11. 如果metadata server不能连接成功,就需要顺着metadata server的整个流程,一个一个模块看,看每个模块的log,端口是否正确,是否收到请求,也可以在VM里面用curl来模拟metadata server的请求 http://169.254.169.254

12. 如果metadata server能够连接成功,key成功注入,下一步需要从namespace里面看是否能够ping通,能够ssh

13. 如果namespace里面能够成功,则在network节点上,ping floating ip和ssh,是否能够成功,如果不成功,看br-ex的网卡是否添加正确,是否配置了ip,路由表是否正确,namespace里面floating ip的iptables规则是否添加正确

14. 在network节点上能够ssh到floating ip,则需要从其他节点上ssh,如果不成功,可能br-ex的网址配置有问题,很可能是br-ex添加的物理网卡不是混合状态,也可能是路由配置有问题,对于floating ip所在的网段,不指向network节点

15. 如果floating ip能够成功,则需要进去VM里面运行apt-get update,如果不可以,看能否ping通openstack里面的gateway(10.0.0.1),然后看能否ping通物理网络环境的gateway(16.158.XXX.1)

16. 看DNS Server是否配置正确,是否能够ping通,如果能,apt-get update运行成功

kubernetes-k8s

架构图

image-20250807114333042

image-20250807114350761

image-20250807114406958

image-20250807114423581

集群类命令

  1. 集群状态与节点信息
kubectl cluster-info dump                            # 查看集群信息(API服务器、版本、节点数等)
kubectl get nodes                                    # 查看集群节点列表及状态
kubectl get nodes -o wide                            # 查看集群节点列表及状态 显示详细信息(IP、版本、角色等)
kubectl describe node node-10-0-0-112                # 查看节点详情(含污点、标签、条件等)
  1. 组件状态(适用于 kubeadm 部署的集群)
kubectl get pods -n kube-system                         # 查看系统组件Pod
kubectl get pods --all-namespaces                       # 查看所有命名空间的pod
kubectl describe pod <pod-name> -n kube-system          # 查看组件详情

资源对象操作

  1. 通用语法
# 查看资源列表
kubectl get <resource-type> [NAME] [OPTIONS]

# 创建资源
kubectl create -f <yaml-file>  # 从YAML文件创建
kubectl apply -f <yaml-file>   # 从YAML文件创建或更新(推荐)

# 删除资源
kubectl delete <resource-type> <name>
kubectl delete -f <yaml-file>

# 查看资源详情
kubectl describe <resource-type> <name>
  1. 常见资源类型缩写
资源类型    缩写
Pods    po
Services    svc
Deployments deploy
ReplicaSets rs
StatefulSets    sts
DaemonSets  ds
ConfigMaps  cm
Secrets secret
Namespaces  ns
PersistentVolume    pv
PersistentVolumeClaim   pvc

Pod相关操作

  1. 创建与查看
# 创建Pod(示例:运行一个Nginx容器)
kubectl run nginx --image=nginx:alpine

# 查看Pod列表
kubectl get pods
kubectl get pods -o wide  # 显示IP、节点等详细信息
kubectl get pods -n <namespace>  # 查看指定命名空间的Pod
kubectl get pods -ALL               # 查看所有命名空间的pod 

# 查看Pod详细状态(事件、容器信息等)
kubectl describe pod <pod-name>
  1. 调试与日志
# 查看Pod日志
kubectl logs <pod-name>
kubectl logs -f <pod-name>  # 实时跟踪日志(类似tail -f)
kubectl logs <pod-name> -c <container-name>  # 多容器Pod指定容器

# 进入Pod内部执行命令
kubectl exec -it <pod-name> -- /bin/sh  # 进入shell
kubectl exec <pod-name> -- cat /etc/hosts  # 执行单个命令

# 复制文件到/从Pod
kubectl cp <pod-name>:/path/in/pod /local/path  # 从Pod复制到本地
kubectl cp /local/path <pod-name>:/path/in/pod  # 从本地复制到Pod

Deployment 与服务编排

  1. Deployment 操作
# 创建Deployment(示例:3副本的Nginx)
kubectl create deployment nginx --image=nginx:alpine --replicas=3

# 查看Deployment
kubectl get deployments
kubectl describe deployment <deployment-name>

# 扩缩容
kubectl scale deployment <deployment-name> --replicas=5

# 滚动更新镜像
kubectl set image deployment <deployment-name> nginx=nginx:1.21.0

# 回滚到上一个版本
kubectl rollout undo deployment <deployment-name>

# 查看更新状态
kubectl rollout status deployment <deployment-name>

2.Service 操作

# 为Deployment创建Service(ClusterIP类型)
kubectl expose deployment <deployment-name> --port=80 --target-port=80

# 查看Service
kubectl get services
kubectl describe service <service-name>

# 创建NodePort类型Service(外部访问)
kubectl create service nodeport <service-name> --tcp=80:80 --node-port=30080

Namespace 命名空间管理

# 查看所有命名空间
kubectl get namespaces

# 创建命名空间
kubectl create namespace dev

# 在特定命名空间执行命令
kubectl get pods -n dev  # 查看dev命名空间的Pod
kubectl apply -f <yaml-file> -n dev  # 在dev命名空间创建资源

# 设置默认命名空间
kubectl config set-context --current --namespace=dev

配置与密钥管理

  1. ConfigMap
# 从文件创建ConfigMap
kubectl create configmap app-config --from-file=config.properties

# 从字面量创建ConfigMap
kubectl create configmap app-config --from-literal=key1=value1 --from-literal=key2=value2

# 查看ConfigMap
kubectl get configmaps
kubectl describe configmap app-config
  1. Secret
# 创建Secret(示例:存储数据库密码)
kubectl create secret generic db-secret --from-literal=username=root --from-literal=password=pass123

# 查看Secret(数据以Base64编码显示)
kubectl get secrets
kubectl describe secret db-secret

存储卷管理

# 创建PersistentVolume(PV)
kubectl apply -f pv.yaml  # 需先编写PV的YAML文件

# 创建PersistentVolumeClaim(PVC)
kubectl apply -f pvc.yaml

# 查看PV和PVC
kubectl get pv
kubectl get pvc

集群调试与故障排查

# 查看API资源类型及支持的操作
kubectl api-resources

# 查看资源的API版本
kubectl api-versions

# 查看事件(排查问题的关键)
kubectl get events
kubectl get events --sort-by=.metadata.creationTimestamp  # 按时间排序

# 端口转发(访问集群内部服务)
kubectl port-forward service/<service-name> 8080:80  # 将本地8080端口转发到Service的80端口

# 节点资源使用情况(需安装metrics-server)
kubectl top nodes
kubectl top pods

上下文与认证管理

# 查看当前配置上下文
kubectl config view

# 查看当前使用的上下文
kubectl config current-context

# 切换上下文
kubectl config use-context <context-name>

# 获取集群凭证(用于配置kubectl客户端)
kubectl get secret -n kube-system <admin-secret> -o yaml

其他实用命令

# 自动补全(支持bash/zsh)
source <(kubectl completion bash)  # 临时生效
echo "source <(kubectl completion bash)" >> ~/.bashrc  # 永久生效
# 使用JSONPath过滤输出
kubectl get pods -o=jsonpath='{.items[*].metadata.name}'

# 执行批量操作(标签选择器)
kubectl delete pods -l app=nginx  # 删除所有标签app=nginx的Pod
kubectl scale deployments -l app=nginx --replicas=0  # 缩容所有相关Deployment

节点扩缩容

节点扩容

yum install docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io -y
yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6
systemctl enable kubelet ; systemctl start kubelet 
kubeadm token create --print-join-command  安装 k8s 集群-添加第三个工作节点
kubectl get node

节点缩容

kubectl get node
kubectl cordon node3        标记节点不可调度
kubectl drain node3 --delete-local-data --force --ignore-daemonsets 驱逐这个node节点上的pod
kubectl delete nodes node3      删除这个node节点
kubectl get node

故障排查思路图

image-20240611173406966

问题及解决思路汇总

Pod 启动失败问题

(一)镜像拉取失败 问题表现:Pod 长时间处于Pending状态,描述信息中显示ImagePullBackOff。例如,执行kubectl describe pod 命令后,在Events部分看到类似Failed to pull image "": rpc error: code = Unknown desc = Error response from daemon: manifest for not found的错误信息。 解决思路: 检查镜像仓库连接:确认镜像仓库地址是否可达,可尝试从集群节点使用curl命令访问仓库地址。如果无法访问,可能是网络配置问题,检查防火墙设置、网络代理配置等。例如,若使用私有镜像仓库,需确保节点能访问到仓库的 IP 地址和端口。 验证镜像名称和标签:检查镜像名称是否正确,标签是否存在于仓库中。镜像名称应包含仓库地址、镜像名及标签,如registry.example.com/your - image:latest。若标签错误,可能导致镜像拉取失败。 检查认证信息:若镜像仓库需要认证,需确保 K8s 中已正确配置认证信息。可以通过创建Secret资源,并在 Pod 的spec.imagePullSecrets字段中引用该Secret来解决认证问题。 (二)容器启动命令错误 问题表现:Pod 进入CrashLoopBackOff状态,容器不断重启。查看容器日志(使用kubectl logs 命令),发现报错信息与容器启动命令相关,如executable file not found in $PATH。 解决思路: 检查 Dockerfile 或容器启动脚本:确认容器启动命令是否正确。若使用自定义启动脚本,需确保脚本路径正确且有可执行权限。例如,在 Dockerfile 中,CMD或ENTRYPOINT指令定义的命令应准确无误。若启动脚本需要依赖某些环境变量,需确保这些环境变量在容器中已正确设置。 验证基础镜像:基础镜像中应包含容器启动所需的依赖和工具。如果基础镜像缺少必要的命令或库,可能导致容器启动失败。可以尝试在本地运行基础镜像,执行相关启动命令,检查是否正常。

网络通信问题

(一)Pod 间通信失败 问题表现:一个 Pod 无法访问另一个 Pod 提供的服务,使用ping或应用层面的请求都无法成功。例如,在 Pod 内执行ping 命令,显示Request timeout。 解决思路: 检查网络插件配置:K8s 使用网络插件(如 Flannel、Calico 等)来实现 Pod 间通信。确认网络插件配置正确,相关组件正常运行。例如,检查 Flannel 的kube - flannel.yml配置文件,确保网络地址段设置合理,且kube - flannel Pod 处于Running状态。 验证 Pod 网络配置:检查源 Pod 和目标 Pod 的网络配置,包括 IP 地址、端口等。确保目标 Pod 的服务端口已正确暴露,并且源 Pod 的请求能正确到达目标 Pod。可以通过查看 Pod 的spec.containers.ports字段来确认端口配置。 排查网络策略:K8s 的网络策略可能限制了 Pod 间的通信。检查是否存在相关网络策略阻止了源 Pod 对目标 Pod 的访问。使用kubectl get networkpolicy命令查看网络策略,并分析其规则。 (二)Service 访问异常 问题表现:通过 Service 的 IP 和端口无法访问后端的 Pod 服务,浏览器访问显示连接超时或服务不可用。 解决思路: 检查 Service 配置:确认 Service 的spec.selector字段与后端 Pod 的标签匹配,确保 Service 能正确选择后端 Pod。同时,检查spec.ports字段的配置,包括port(Service 对外暴露的端口)和targetPort(后端 Pod 实际监听的端口)是否正确。 验证后端 Pod 健康状态:使用kubectl get pods命令查看后端 Pod 的状态,确保 Pod 处于Running且健康状态。若 Pod 存在问题,可能导致 Service 无法正常转发请求。例如,Pod 可能因为资源不足或应用程序错误而无法提供服务。 检查 kube - proxy 运行情况:kube - proxy 负责将 Service 的流量转发到后端 Pod。检查 kube - proxy 组件在各个节点上是否正常运行,其日志中是否有相关错误信息。在节点上执行systemctl status kube - proxy命令查看其运行状态。

资源不足问题

(一)CPU 和内存资源不足 问题表现:Pod 运行缓慢,出现卡顿现象,或者被 K8s 驱逐(Evicted状态)。使用kubectl top pods命令查看 Pod 的资源使用情况,发现 CPU 或内存使用率持续高于 Pod 定义的limits。 解决思路: 优化应用程序:检查应用程序代码,看是否存在资源消耗过高的代码逻辑,如内存泄漏、死循环等。对应用程序进行性能优化,减少不必要的资源占用。 调整资源请求和限制:根据应用实际的资源需求,合理调整 Pod 的resources.requests和resources.limits。例如,如果应用在高负载下需要更多内存,可以适当增加limits.memory的值,但同时要确保节点有足够的资源可供分配。 扩缩容集群:若集群整体资源不足,考虑增加节点数量或升级节点的硬件配置。使用 K8s 的自动扩缩容功能(如 Horizontal Pod Autoscaler,HPA),根据资源指标自动调整 Pod 副本数量。 (二)存储资源不足 问题表现:Pod 因无法挂载存储卷而启动失败,或者在运行过程中出现磁盘空间不足的错误。例如,应用程序写入文件时提示磁盘已满。 解决思路: 清理无用数据:检查存储卷中的数据,删除不必要的文件或日志。对于日志文件,可以设置定期清理策略。例如,使用logrotate工具对日志文件进行管理。 扩展存储卷:如果是持久化卷(PV),可以尝试扩展其容量。不同的存储后端有不同的扩展方法,如在 AWS EBS 卷中,可以在控制台直接扩展卷的大小,然后在 K8s 中更新 PersistentVolumeClaim(PVC)以使用扩展后的容量。 调整存储策略:评估应用对存储的需求,考虑使用更高效的存储策略。例如,对于一些读写频繁但对数据持久性要求不高的应用,可以使用EmptyDir存储卷,它基于节点的内存或磁盘临时存储数据,不会占用持久化存储资源。

节点下线维修

kubectl get node
kubectl cordon node2        # 首先标记节点不可调度
kubectl drain node2 --delete-local-data --force --ignore-daemonsets # 节点上的pod进行驱逐
然后我们将服务器进行关机,等待服务器修好以后,再次开机,讲node节点恢复为可以调度的状态
kubectl uncordon node2
kubectl get node

节点故障疏散

node节点故障 等待一段时间后,我们可以看到node3节点上pod的状态会变成 Terminating
如果此时我们已经确认node3节点已经属于不可恢复的节点 我们开始清理node3节点上异常的pod
我们开始清理node3节点上异常的pod
[root@master1 ~]# cat clean_pod.sh 
#!/bin/bash

node_list="node2"

for n in "${node_list}"
do
    fail_pod_count=$(kubectl get pod -o wide -ALL |grep " ${n} "|grep -v kube-system|wc -l)
    for m in `seq 1 $fail_pod_count`
    do 
        fail_pod_name=$(kubectl get pod -o wide -ALL |grep " ${n} "|grep -v kube-system|awk 'NR=='$m'{print $2}')
        fail_pod_namespace=$(kubectl get pod -o wide -ALL |grep " ${n} "|grep -v kube-system|awk 'NR=='$m'{print $1}')
        echo "kubectl delete pod $fail_pod_name -n $fail_pod_namespace --force --grace-period=0"
        sleep 0.5
    done
done

关机下电

master节点操作

现在master节点操作 使得节点为维修状态

kubectl drain master-10-0-0-111 --ignore-daemonsets
kubectl drain node-10-0-0-112 --ignore-daemonsets
kubectl drain node-10-0-0-113 --ignore-daemonsets

[root@k8s01 ~]# kubectl get node
NAME                STATUS                     ROLES                  AGE   VERSION
master-10-0-0-111   Ready,SchedulingDisabled   control-plane,master   13m   v1.20.11
node-10-0-0-112     Ready,SchedulingDisabled   <none>                 10m   v1.20.11
node-10-0-0-113     Ready,SchedulingDisabled   <none>                 10m   v1.20.11

node节点操作

依次关机node节点

poweroff

最后关机master节点

poweroff

开机恢复

master节点操作

先开机master节点 启动时先启动master节点,然后等 30秒-1分钟 etcd 起稳,再启动子节点

kubectl uncordon  master-10-0-0-111
kubectl uncordon  node-10-0-0-112
kubectl uncordon  node-10-0-0-113

[root@k8s01 ~]# kubectl get node
NAME                STATUS   ROLES                  AGE   VERSION
master-10-0-0-111   Ready    control-plane,master   18m   v1.20.11
node-10-0-0-112     Ready    <none>                 15m   v1.20.11
node-10-0-0-113     Ready    <none>                 15m   v1.20.11


[root@k8s01 ~]# kubectl get pod -A
NAMESPACE              NAME                                         READY   STATUS    RESTARTS   AGE
kube-flannel           kube-flannel-ds-7dcjz                        1/1     Running   1          15m
kube-flannel           kube-flannel-ds-h5jgz                        1/1     Running   1          15m
kube-flannel           kube-flannel-ds-smd9n                        1/1     Running   1          18m
kube-system            coredns-5775bfb4dc-26sqg                     1/1     Running   1          18m
kube-system            coredns-5775bfb4dc-vsg6q                     1/1     Running   1          18m
kube-system            etcd-master-10-0-0-111                       1/1     Running   1          18m
kube-system            kube-apiserver-master-10-0-0-111             1/1     Running   2          15m
kube-system            kube-controller-manager-master-10-0-0-111    1/1     Running   2          18m
kube-system            kube-proxy-24mvj                             1/1     Running   1          15m
kube-system            kube-proxy-lw8j9                             1/1     Running   1          15m
kube-system            kube-proxy-nk92z                             1/1     Running   1          18m
kube-system            kube-scheduler-master-10-0-0-111             1/1     Running   2          18m
kube-system            metrics-server-6595f875d6-wf8nv              2/2     Running   2          14m
kubernetes-dashboard   dashboard-metrics-scraper-7b59f7d4df-hmwr8   1/1     Running   1          15m
kubernetes-dashboard   kubernetes-dashboard-5dbf55bd9d-6flnn        1/1     Running   2          15m

sdn

常见面试题

以下是SDN运维部署交付相关的常见面试题及解析,结合了实际场景和技术要点:

一、SDN基础与架构‌

SDN的核心架构包含哪些平面?‌
控制平面‌:集中管理网络策略(如OpenDaylight控制器)‌
数据平面‌:转发流量(如支持OpenFlow的交换机)‌
应用平面‌:业务需求驱动(如网络编排系统)‌

OpenFlow协议的默认端口号是多少?‌

答案‌:6633(TCP协议)‌

二、部署与自动化‌
如何实现SDN网络的自动化部署?‌

技术选型‌:
使用Ansible/Python脚本批量配置交换机(如端口VLAN、ACL)‌
通过SDN控制器(如Cisco DNA Center)集中下发策略‌
场景‌:新办公楼部署时,自动化工具可节省80%配置时间‌

SDN控制器如何保障高可用性?‌

方案‌:控制器集群(如ONOS多节点)+ 热备切换机制‌
三、运维与故障处理‌

SDN网络中如何快速定位故障?‌

工具‌:
使用REST API查询控制器状态(如Ryu的/stats接口)‌
分析交换机流表日志(如匹配异常流表项)‌

如何优化SDN网络的性能?‌
方法‌:
调整流表匹配规则优先级(避免全表扫描)‌
启用ECMP(等价多路径)负载均衡‌
四、安全与扩展‌

SDN网络的安全风险有哪些?如何防护?‌
风险‌:控制器单点故障、南向接口劫持‌
防护‌:
加密通信(TLS协议)‌
基于角色的访问控制(RBAC)‌

如何扩展SDN网络支持新业务?‌

步骤‌:
通过北向API(如RESTful)对接业务系统‌
动态调整流表(如新增VXLAN隧道)‌
五、实际场景题‌

金融行业如何利用SDN降低交易延迟?‌

方案‌:
超低延迟交换机(如Arista 7060CX2,转发延迟<500ns)‌
静态路由优化(避免动态协议收敛时间)‌

多租户场景下SDN如何隔离网络?‌

技术‌:
VXLAN/OTV实现二层隔离‌
控制器内租户逻辑分区(如OpenStack Neutron)‌

如需深入探讨特定问题(如SDN与NFV协同、多云网络集成等),可进一步补充。

kvm

virt-install --name ${vmname} --virt-type kvm --vcpus 2 --ram 2048  --disk path=/data/kvm-data/${vmname}/${vmname}.qcow2 --boot hd=${vmname} --channel unix,path=/var/lib/libvirt/qemu/${vmname}.agent,mode=bind,target_type=virtio,name=org.qemu.guest_agent.0 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole   # 创建虚拟机

virsh undefine linux-node1                                                  # 删除虚拟机配置文件(等价于删除虚拟机,不会删除磁盘)

virsh shutdown linux-node1                                                  # 正常关机虚拟机
virsh destroy linux-node1                                                       # 强制关闭虚拟机
virsh start linux-node1                                                         # 开启虚拟机
virsh reboot linux-node1                                                        # 重启虚拟机
virsh autostart linux-node1                                                 # 设置虚拟机开启自启
virsh console linux-node1                                                       # 进入虚拟机控制台
virsh suspend linux-node1                                                       # 虚拟机挂起
virsh resume linux-node1                                                        # 虚拟机恢复挂起
virsh edit linux-node1                                                          # 修改虚拟机配置文件
virsh domrename linux-node1 linux-node1                         # 虚拟机重命名(必须的关机后才能重命名)
virsh  snapshot-create-as linux-node1 system-init       # 虚拟机创建快照
virsh snapshot-list linux-node1                                         # 虚拟机查看快照
virsh snapshot-revert linux-node1 --snapshotname system-init    # 虚拟机还原快照
virsh snapshot-delete linux-node1 --snapshotname system-init    # 虚拟机删除快照
virsh set-user-password linux-node1  --user root --password 123 # 修改虚拟机密码

virsh --version                                                                             # 查看kvm版本
virsh list                                                                                      # 查看正在运行的虚拟机
virsh list --all                                                                            # 查看所有虚拟机 包含未启动的
virsh dumpxml linux-node1                                                           # 查看虚拟机配置文件
virsh dominfo linux-node1                                                           # 查看虚拟机基本信息
virsh domiflist linux-node1                                                     # 查看虚拟机网卡信息
virsh vcpuinfo linux-node1                                                      # 查看虚拟机CPU信息
virsh domblklist linux-node1                                                    # 查看虚拟机磁盘信息

docker

docker run --name nginx01 -it -d -p 8080:80 nginx       # 启动一个容器
docker save nginx:latest > nginx.tar.gz                             # 导出镜像
docker load < nginx.tar.gz                                                      # 导入镜像

docker rm nginx01                                           # 删除容器 
docker rm -f nginx01                                    # 强制删除容器 
docker rmi nginx01                                      # 删除镜像
docker rmi -f nginx01                                   # 强制删除镜像

docker start nginx01                                # 启动容器
docker stop nginx01                                 # 关闭容器
docker restart nginx01                          # 重启容器
docker rename nginx01 nginx02               # 给容器修改名称

docker info                                                 # 查看容器详细信息
docker version                                          # 查看容器版本
docker ps                           # 查看已运行容器
docker ps -a                                                # 查看所有容器 包含未启动的容器
docker images                                               # 查看容器镜像
docker logs nginx01                                 # 查看容器日志
docker network ls                                       # 查看容器网络类型
docker volume ls                                        # 查看容器存储卷