1 Linux 相关
1.1 查看相关性能指标
- top动态实时显示系统中各个进程资源占用状况的工具。
- ps获取到进程的各种信息,如PID、父PID、用户ID、组ID、内存和CPU使用率等。
- netstat用于显示网络连接、路由表、接口统计等网络相关信息。
- free 命令用来查看系统内存使用情况
1.2 top命令各个字段
- PID: 进程ID。
- USER: 进程所属用户。
- PR: 进程优先级。
- NI: 进程的nice值,影响进程调度优先级。
- VIRT: 进程使用的虚拟内存总量。
- RES: 进程使用的物理内存大小。
- SHR: 进程使用的共享内存大小。
- %MEM: 进程使用的物理内存占总物理内存的比例。
- S: 进程状态,如 R(运行)、S(睡眠)、D(不可中断的睡眠)、Z(僵尸)、T(停止)、t(跟踪停止)等。
- %CPU: 进程使用的CPU时间占总CPU时间的比例。
- TIME+: 进程使用的CPU时间总计,精确到百秒。
- COMMAND: 启动该进程的命令。
1.3 linux中swap的使用一般会比内存高吗
正常情况下,系统的物理内存应该足够满足大多数应用程序的需求。然而,当物理内存不足时,系统会将一些不经常使用的内存页面移到交换空间中,以便为活跃的应用程序腾出更多物理内存。因此,理想情况下,交换空间的使用不应该超过物理内存的使用。
1.4 如何查看某个具体进程的内存占比
ps 命令可以显示当前系统中各个进程的详细信息,包括内存使用情况。你可以结合 grep 来过滤出特定进程的信息。
- %mem进程使用的物理内存占总物理内存的百分比。
- rss进程使用的物理内存大小(以KB为单位)。
- vsz进程使用的虚拟内存大小(以KB为单位)。
- command启动该进程的命令。
1.5 如何查看系统的内存占用
free 命令可以显示系统中物理内存和交换空间的使用情况。
1.6 如何查看具体文件、挂载目录以及该文件内存占用
ls 命令可以列出文件的基本信息,包括权限、所有者、大小、修改时间等。
1.7 如何查看隐藏文件,隐藏文件类型喝普通文件有什么区别。
ls 命令可以列出目录中的文件。要显示隐藏文件,可以使用 -a 选项。
类别 | 隐藏文件 | 普通文件 |
---|---|---|
命名规则 | 文件名以点(.)开头 | 文件名不以点(.)开头。 |
显示方式 | 默认情况下不会被 ls 命令列出,需要使用 -a 选项才能显示。 | 默认情况下会被 ls 命令列出。 |
用途 | 通常用于存储配置文件、历史记录、缓存等系统或应用程序的内部数据。这些文件通常不需要用户直接操作。 | 用于存储用户数据、文档、图片等常规文件,这些文件通常需要用户直接操作。 |
权限和所有权 | 权限和所有权与其他文件相同,没有特殊的权限限制。 | 权限和所有权也与其他文件相同,没有特殊的权限限制。 |
1.8 将一个文件内的a替换成b,在系统的静默模式进行替换。
sed 是一个流编辑器,可以用来进行文本替换。使用 -i 选项可以直接在文件中进行替换,而不会产生备份文件。
sed -i 's/a/b/g' filename.txt
- sed -i ‘s/a/b/g’ filename.txt:在 filename.txt 文件中将所有的 a 替换成 b。
- -i:直接在文件中进行替换。
- s/a/b/g:替换命令,其中 s 表示替换,a 是要被替换的字符串,b 是替换后的字符串,g 表示全局替换(即文件中所有匹配的地方都会被替换)。
1.9 vim中怎么全局替换某个字符串
:%s/old_string/new_string/g
# 如果你希望在每次替换时进行确认,可以使用 c 标志:
:%s/old_string/new_string/gc
# 如果你只想在文件的某一部分进行替换,可以指定行范围。例如,替换第10行到第20行之间的所有 foo 为 bar:
:10,20s/foo/bar/g
解释:
- %:表示对整个文件进行操作。
- s:表示替换命令。
- old_string:要被替换的字符串。
- new_string:替换后的字符串。
- g:表示全局替换,即替换每一行中所有匹配的字符串。
1.10 Linux怎么配置路由
# 添加路由
sudo ip route add <目标网络> via <网关> dev <接口>
# 示例 sudo ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0
# 删除路由
sudo ip route del <目标网络> via <网关> dev <接口>
# 示例 sudo ip route del 192.168.2.0/24 via 192.168.1.1 dev eth0
1.11 用户态切换内核态
- 系统调用:
- 用户态下的应用程序可以通过系统调用来请求操作系统执行某些特权操作,如读写文件、创建进程等。
- 当应用程序执行系统调用时,处理器会从用户态切换到内核态
- 操作系统内核处理完请求后,再返回用户态。
- 异常和中断:
- 当发生硬件中断(如定时器中断、键盘输入中断)或异常(如除零错误、段错误)时,处理器会从用户态切换到内核态。
- 内核处理完中断或异常后,再返回用户态。
1.12 从内核态到用户态
- 系统调用返回:
- 当操作系统内核处理完系统调用请求后,会将控制权返回给用户态的应用程序。
这通常通过一条特殊的指令(如 iret 或 sysexit)来完成。
- 当操作系统内核处理完系统调用请求后,会将控制权返回给用户态的应用程序。
- 中断处理返回:
- 当内核处理完中断或异常后,会将控制权返回给被中断的用户态进程。
1.13 vmsta
vmstat 是一个常用的系统监控工具,用于报告虚拟内存统计信息。它可以显示有关系统内存、进程、CPU 活动和其他系统资源的信息。vmstat 是一个非常有用的工具,特别是在诊断系统性能问题时。
- r:运行队列中的进程数。
- b:处于不可中断睡眠状态的进程数(通常是因为 I/O 操作)。
- swpd:使用的交换空间(KB)。
- free:空闲的物理内存(KB)。
- buff:用作缓冲区的内存(KB)。
- cache:用作缓存的内存(KB)。
- si:从交换空间读取的数据量(KB/s)。
- so:写入交换空间的数据量(KB/s)。
- bi:从块设备读取的数据量(块/s)。
- bo:写入块设备的数据量(块/s)。
- in:每秒的中断数。
- cs:每秒的上下文切换数。
- us:用户 CPU 时间百分比。
- sy:系统 CPU 时间百分比。
- id:空闲 CPU 时间百分比。
- wa:等待 I/O 完成的时间百分比。
- st:被其他虚拟机偷走的 CPU 时间百分比(在虚拟化环境中)。
# 基本用法:每隔 2 秒输出一次系统状态,共输出 5 次。
vmstat 2 5
# 显示活跃和非活跃内存:
vmstat -a
# 显示各种系统的统计信息:
vmstat -s
1.13 iostat
iostat 是一个用于监控系统输入/输出设备负载的工具,它可以显示 CPU 使用率、磁盘 I/O 活动和传输速率等信息。
# -c:显示 CPU 使用情况。
# -d:显示设备(磁盘)使用情况。
# -k:以 KiB 为单位
1.14 iptables
1.14.1 四表五链
- 四表
名称 | 作用 | 链 |
---|---|---|
filter表 | 用于过滤数据包 | input forward output |
nat表 | 用于网络地址转换,包括源地址转换(SNAT)、目的地址转换(DNAT) | output pre-routing post-routing |
raw 表 | 用于指定哪些连接不被状态跟踪 | pre-routing output |
mangle 表 | 用于修改数据包的头部信息,例如TTL值、优先级等。 | output pre-routing post-routing input forward |
- 五链
名称 | 作用 |
---|---|
input | 负责过滤所有目标地址 |
forward | 负责转发流经的数据包 |
output | 处理本机地址的数据包 |
pre-routing | 在数据包到达防火墙时,进行路由判断之前的执行规则 |
post-routing | 在数据包离开防火墙时进行路由判断之后的执行规则 |
2 k8s
2.1 解释一下Pod,为什么要设计pod,而不是直接管理容器?
在 Kubernetes 中,Pod 是最小的可部署单元。一个 Pod 可以包含一个或多个容器,这些容器共享网络和存储资源。
为什么设计 Pod?
- 共享网络命名空间:
- 网络隔离:同一个 Pod 内的容器共享同一个网络命名空间,这意味着它们可以使用 localhost 进行通信,而不需要额外的网络配置。
- 服务发现:Pod 内部的容器可以通过 localhost 访问彼此的服务,简化了服务发现和通信。
共享存储卷:
- 数据共享:Pod 内的容器可以共享同一个存储卷,这样可以方便地在容器之间共享数据。
持久化存储:通过挂载持久化卷(如 PersistentVolume),Pod 内的容器可以访问持久化的数据。 - 生命周期管理:
- 统一管理:Pod 作为一个整体进行生命周期管理,包括启动、停止、重启等操作。这样可以确保 Pod 内的所有容器一致地进行生命周期管理。
- 故障恢复:如果 Pod 内的一个容器失败,Kubernetes 可以自动重启整个 Pod,确保应用程序的高可用性。
- 资源隔离:
- 资源限制:Pod 可以设置资源限制(如 CPU 和内存),确保容器不会过度消耗资源。
- 资源共享:Pod 内的容器可以共享资源,例如日志文件、环境变量等。
- 简化部署和管理:
- 标准化:Pod 提供了一种标准化的方式来打包和部署应用程序,使得开发者和运维人员可以更容易地管理和部署应用。
- 自动化:Kubernetes 可以自动管理 Pod 的生命周期,包括自动扩展、滚动更新等,提高了部署和管理的效率。
Pod 与直接管理容器的区别
pod | 容器 | |
---|---|---|
抽象层次 | Pod 是一个更高层次的抽象,它不仅包含容器,还定义了容器之间的关系和共享资源。 | 容器是更低层次的抽象,只关注自身的运行环境和资源需求。 |
管理复杂度 | 通过 Pod,可以将多个相关容器作为一个逻辑单元进行管理,减少了管理和配置的复杂度。 | 直接管理多个容器需要手动配置网络、存储和生命周期管理,增加了管理的复杂度。 |
服务发现和通信 | Pod 内部的容器可以通过 localhost 进行通信,简化了服务发现和通信。 | 不同容器之间的通信需要额外的网络配置,增加了复杂性。 |
高可用性和故障恢复 | Kubernetes 可以自动管理和恢复 Pod,确保应用程序的高可用性。 | 直接管理容器需要手动处理故障恢复,增加了运维负担。 |
2.2 一个容器运行单个进程和多个进程你认为哪一个比较好?一个容器运行多进程会出现什么问题?
推荐在一个容器中运行单个进程,特别是对于微服务架构和需要高可用性和扩展性的应用场景。**这种方式简单、隔离性好、资源管理容易,并且更容易进行水平扩展。**然而,对于一些简单的任务或传统应用程序,如果资源开销是一个重要考虑因素,可以在一个容器中运行多个进程,但需要注意管理和监控的复杂性。
一个容器运行多进程会出现什么问题
- 复杂性:
- 容器内的进程管理更加复杂,需要额外的脚本来启动和管理多个进程。
- 日志管理和监控更加困难,需要区分不同进程的日志输出。
- 故障隔离:
- 一个进程的故障可能会影响到其他进程,增加了故障排查的难度。
- 故障恢复更加复杂,需要确保所有进程都能正确重启和恢复。
- 资源管理:
- 难以进行细粒度的资源限制和监控,因为多个进程共享相同的资源。
- 资源调度不够灵活,难以针对单个进程进行优化。
- 扩展性:
- 水平扩展更加困难,因为需要同时扩展多个进程,增加了复杂性。
- 微服务架构中,多个进程在一个容器中运行不利于独立开发、部署和扩展。
3 docker
3.1 docker多个RUN命令运行多条指令和一个RUN命令运行多条指令有什么区别?
- 多个 RUN 命令:
- 适用于需要独立管理和缓存每个步骤的情况。
- 使 Dockerfile 更加清晰和可读。
- 适合调试和测试。
- 一个 RUN 命令运行多条指令:
- 适用于需要减少镜像层数和体积的情况。
- 适合构建过程中变化较少的场景。
- 可能会增加构建时间,尤其是在命令较长时。
- 如果你需要减少镜像的层数和体积,可以考虑将多个相关命令合并到一个 RUN 命令中。
- 如果你需要充分利用缓存来加速构建过程,可以使用多个 RUN 命令,确保每个命令的变化不会影响其他命令的缓存。
- 对于复杂的构建步骤,建议使用多个 RUN 命令,以提高 Dockerfile 的可读性和维护性。
3.2 dockerfile 中copy和add区别
COPY
功能:COPY 指令用于将本地文件系统中的文件或目录复制到容器内的指定位置。它只支持基本的文件复制操作。
使用场景:当你需要将简单的文件或目录复制到镜像中时,推荐使用 COPY。因为它的功能相对简单,执行效率更高。
ADD
功能:ADD 指令的功能比 COPY 更强大,除了能完成文件或目录的复制外,它还能处理远程文件链接和自动解压归档文件。
使用场景:当你需要处理更复杂的文件操作,比如下载远程文件或者解压文件时,可以考虑使用 ADD。
3.3 dockerfile关键字
Dockerfile 是用于构建 Docker 镜像的脚本文件,其中包含了一系列命令来指导 Docker 如何构建镜像。以下是 Dockerfile 中常用的关键词及其简要说明:
基础指令
基础命令 | 作用 |
---|---|
FROM | 指定基础镜像。 |
RUN | 在镜像中运行命令。 |
CMD | 指定容器启动时运行的命令,默认可以被覆盖。 |
ENTRYPOINT | 指定容器启动时运行的命令,不会被命令行参数覆盖。 |
COPY | 从宿主机复制文件或目录到镜像中。 |
ADD | 与 COPY 类似,但支持远程文件URL和自动解压。 |
WORKDIR | 设置工作目录。 |
ENV | 设置环境变量。 |
VOLUME | 创建一个挂载点,用于数据持久化。 |
EXPOSE | 声明容器运行时监听的端口。 |
3.4 Namespace和cgroup原理
在 Linux 中,Namespace 提供了一种资源隔离的方法。不同的进程可以拥有不同的视图,即不同的命名空间,这样即使这些进程运行在同一台物理机上,它们也能看到不同的文件系统、网络设备等资源。通过这种方式,Linux 实现了轻量级虚拟化。
Cgroups 是 Linux 内核提供的一种机制,用于限制、记录和隔离进程组使用的物理资源(如 CPU、内存、磁盘 I/O 等)。它主要实现的功能包括:
- 资源限制:可以设置进程组对特定资源的最大使用量,例如限制一个进程组可以使用的最大内存或CPU时间。
- 优先级分配:可以为不同的进程组分配不同的资源优先级。
- 控制进程行为:可以将进程组冻结或恢复,或者在资源不足时杀死进程。
在 Kubernetes 中,`kube-proxy` 可以使用不同的代理模式来实现服务(Service)的负载均衡和网络路由功能。最常见的两种模式是 `iptables` 模式和 `ipvs` 模式。下面详细介绍这两种模式的区别:
### iptables 模式
#### 作用
`iptables` 模式是 `kube-proxy` 的默认模式。它通过配置节点上的 `iptables` 规则来实现服务的负载均衡和网络路由。
#### 主要特点
1. **规则管理**:`kube-proxy` 在每个节点上动态生成和管理 `iptables` 规则。这些规则用于将发送到服务的流量重定向到后端的 Pod。
2. **性能**:对于中小型集群,`iptables` 模式的性能表现良好。然而,随着集群规模的增大,`iptables` 规则的数量会增加,导致性能下降。
3. **灵活性**:`iptables` 规则非常灵活,可以实现复杂的网络流量管理和转换。
4. **负载均衡算法**:`iptables` 模式支持简单的轮询(Round Robin)负载均衡算法。
5. **健康检查**:`iptables` 模式不直接支持健康检查,依赖于 Kubernetes 的健康检查机制来确保流量不会被路由到不健康的 Pod。
#### 示例配置
```yaml
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "iptables"
clusterCIDR: "10.244.0.0/16"
3.5 docker 两个容器如何共享数据
- 数据卷(Volumes):适用于生产环境,数据持久化,独立于容器生命周期。
- 绑定挂载(Bind Mounts):适用于开发环境,方便直接编辑主机文件。
- Docker Compose:简化多容器应用的管理和配置。
ipvs 模式
作用
ipvs
模式是 kube-proxy
的另一种代理模式,使用 Linux 内核的 IPVS(IP Virtual Server)模块来实现服务的负载均衡和网络路由。
主要特点
- 高性能:
ipvs
模式在处理大规模集群时表现出更高的性能。IPVS 模块在内核态运行,减少了用户态和内核态之间的切换开销。 - 丰富的负载均衡算法:
ipvs
支持多种负载均衡算法,包括轮询(Round Robin)、最少连接(Least Connections)、哈希(Hash)等。 - 健康检查:
ipvs
模式内置了健康检查机制,可以主动检查后端 Pod 的健康状态,确保流量不会被路由到不健康的 Pod。 - 扩展性:
ipvs
模式更适合大规模集群,可以处理更多的后端 Pod 和更复杂的负载均衡需求。 - 稳定性:
ipvs
模式在处理高并发流量时更加稳定,减少了网络延迟和丢包率。
示例配置
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
clusterCIDR: "10.244.0.0/16"
总结
-
iptables 模式:
- 默认模式,适用于中小型集群。
- 通过
iptables
规则实现负载均衡和网络路由。 - 性能在集群规模较大时会下降。
- 不直接支持健康检查。
-
ipvs 模式:
- 高性能模式,适用于大型集群。
- 使用 IPVS 模块实现负载均衡和网络路由。
- 支持多种负载均衡算法和内置健康检查。
- 在处理高并发流量时更加稳定和高效。
选择哪种模式取决于你的集群规模和性能需求。对于中小型集群,iptables
模式通常已经足够;而对于大型集群,ipvs
模式是更好的选择。