2026 DevOps + AWS 面试
1. 你部署过哪些类型的应用?
- Web 应用 (例如,Java Spring Boot, Node.js),
- 微服务架构,
- 数据库 (例如, MySQL, MongoDB),
- 消息代理 (例如, Apache Kafka),
- 监控工具 (例如, Prometheus, Grafana),
- CI/CD 流水线 (例如, Jenkins),
- 使用 Docker 和 Kubernetes 的容器化应用
2. 你如何将 secrets 注入到 ConfigMaps 中?
Secrets 不应注入到 ConfigMaps 中,因为 ConfigMaps 并非为敏感数据设计。
应使用 Kubernetes Secrets。Secrets 可以通过环境变量注入到 pods 中或挂载为文件。
3. 你如何使用 kubectl 查找哪个 pod 在跨节点上占用更多系统资源?
使用
kubectl top pod --all-namespaces
来列出 pods 的资源使用情况。
结合使用 kubectl describe pod <pod-name> 来获取详细的资源使用情况。
4. 你如何使用 kubectl 了解集群中哪个工作节点消耗更多资源?
使用 kubectl top nodes 来查看各节点的资源消耗。
这将显示每个节点的 CPU 和内存使用情况。
5. 配置 Prometheus 和 Grafana 监控 Kubernetes 集群的步骤是什么?
- 使用 Helm 或自定义 YAML 配置部署 Prometheus。
- 为 Prometheus 设置 Kubernetes 服务发现。
- 部署 Grafana 并配置其使用 Prometheus 作为数据源。
- 在 Grafana 中导入 Kubernetes 监控仪表板。
- 根据需要,在 Prometheus 中设置告警规则
6. 如果有 20 个 pods 在运行,你如何在 Grafana 中可视化这些 pods 的指标?
配置 Grafana 使用 Prometheus 作为数据源。使用现有的 Kubernetes 仪表板或创建自定义仪表板来可视化所有 pods 的指标。
7. 什么是 Apache Kafka?
Apache Kafka 是一个分布式事件流处理平台,用于构建实时数据管道和流式应用。它设计用于以分布式、容错的方式处理大量数据。
8. 你如何设置 Docker Hub 私有仓库并将其与 CI/CD 流水线集成?步骤是什么?
- 在 Docker Hub 上创建私有仓库。
- 配置 CI/CD 流水线以使用凭据向 Docker Hub 进行身份验证。
- 在 CI 流水线中构建 Docker 镜像并将其推送到私有仓库。
- 在 CD 过程中从私有仓库拉取镜像。
9. 硬链接和软链接之间有什么区别?
硬链接:对磁盘上文件数据的直接引用。
删除原始文件不会影响硬链接。
软链接(符号链接):指向原始文件路径的指针。
如果原始文件被删除,软链接将失效。
核心定义
- 软链接(Symbolic Link):快捷方式,存路径,指向原文件
- 硬链接(Hard Link):同一文件别名,共用同一个
inode
五大关键区别
- inode 软链接:不同inode 硬链接:相同inode
- 跨分区 软链接:支持跨分区、跨磁盘 硬链接:不支持,只能同分区
- 目录链接 软链接:可以链接文件夹 硬链接:不能链接目录
- 删原文件 软链接:原文件删完失效(红报错) 硬链接:原文件删除依然可用
- 大小 软链接:大小=路径字符长度 硬链接:大小和原文件一致
创建命令
# 软链接
ln -s 原文件 链接名
# 硬链接
ln 原文件 链接名
一句话总结
- 软链接:Windows快捷方式,删源就废,常用
- 硬链接:文件多名字,删源还能用,少用
10. shell 脚本中 break 命令的用途是什么?你在什么场景下使用过它?
break 命令用于提前退出循环。通常在满足特定条件且不再需要继续循环时使用。
11. 你如何统计 15 个 HTML 文件中 "devops" 单词的数量?
要统计 15 个 HTML 文件中 "devops" 单词出现的次数,可以使用以下 shell 命令:
grep -o -i "devops" *.html | wc -l
-
grep -o -i "devops" *.html: 在所有 HTML 文件中搜索单词"devops"(-i 表示不区分大小写),并将每个匹配项单独输出一行(-o)。 -
wc -l: 计算 grep 输出的行数,即 "devops" 出现的次数。
12. 什么是 terraform taint 命令?
terraform taint 命令用于在下一次 terraform apply 时手动标记特定资源需要重新创建。
当一个资源被标记为 tainted 后,Terraform 将在下次 apply 时销毁它并创建一个新的实例。
这在你知道某个资源需要替换但 Terraform 未自动识别时很有用。
语法: terraform taint <资源地址>
示例: terraform taint aws_instance.example
13. 在 Terraform 中保护 state 文件的可能方法有哪些?
- 加密 State 文件:使用诸如 AWS S3 桶加密、Azure Blob 加密或 Google Cloud Storage 加密等工具以加密格式存储 state 文件。
- 使用具有安全控制的远程后端:使用如带有 IAM 角色和策略的 AWS S3、带有 ACLs 的 HashiCorp Consul 或管理访问控制和加密的 Terraform Cloud 等远程后端。
- 启用版本控制:在 state 文件存储上使用版本控制,以便从任何意外的更改或删除中恢复。
- 访问控制:使用 IAM 策略、RBAC(基于角色的访问控制)或类似机制限制对 state 文件的访问。
-
使用后端锁定:使用后端(如带有 DynamoDB 的 S3 或 Consul)提供的 state 锁定机制,以防止并发操作破坏 state 文件。
-
远程存储 State(最核心): 禁止本地 state,统一存远端
- 开启状态锁定(防多人同时修改冲突)
- S3+DynamoDB 锁
- Terraform Cloud 自动锁 作用:防止多人同时apply篡改覆盖
- 加密 State 文件
- 远端存储服务端加密(S3/OSS 默认开启)
- Terraform 本地加密:terraform encrypt
- 敏感变量单独加密存放
- 权限严格管控
- 远端存储桶私有只读 / 读写权限
- 限制仅运维账号可访问 state 存储
- 禁止开发者直接下载 state 文件
-
忽略本地 state 提交
- .gitignore 强制忽略
*.tfstate *.tfstate.backup .terraform/
远程存储 State(S3/OSS/TFC) / 开启状态锁定防并发冲突 / 服务端 + 客户端双重加密 / 严格存储权限控制 / Git 忽略 state,不上传代码库 / 敏感数据不硬编码,用密钥管理服务
14. 如果你配置了 100 台服务器,有人手动删除了其中 50 台 VMs,那么当你执行 terraform apply 命令时会发生什么?
当你运行 terraform apply 时,Terraform 会将 state 文件与实际基础设施进行比较。
它会发现有 50 台 VMs 缺失,并会尝试重新创建这些缺失的 VMs,以匹配你配置中定义的状态。
最终结果将恢复到 100 台 VMs。
15. Terraform 中 for_each 的语法是什么?
Terraform 中的 for_each 元参数允许你基于映射或集合中的项创建多个资源或模块实例。
语法如下:
resource "aws_instance" "example" {
for_each = var.instances
ami = each.value["ami"]
instance_type = each.value["instance_type"]
tags = {
Name = each.key
}
}
在这个例子中,var.instances 是一个映射,each.key 指的是映射中当前的键,而 each.value 指的是关联的值。
16. Docker 中多阶段构建的优点和缺点是什么?
优点
- 更小的镜像大小:通过将构建环境与运行时环境分离,最终镜像中只包含必要的组件,从而减小镜像大小。
- 提高安全性:通过从最终镜像中排除构建工具和其他不必要的组件,减少了攻击面。
- 更好的缓存:可以更有效地利用 Docker 的缓存机制,可能加快构建过程。
- 关注点分离:不同的阶段可以专注于特定任务,使 Dockerfile 更有条理且易于维护。
缺点
- 复杂性:多阶段 Dockerfile 可能更复杂,更难以理解,尤其对 Docker 新手而言。
- 更长的构建时间:在某些情况下,使用多个阶段可能导致更长的构建时间,因为需要额外的步骤和阶段间切换。
- 故障排除:调试和故障排除可能更具挑战性,因为默认情况下中间阶段不会被保留。
17. 你如何在 Docker 集群内将容器部署到不同的主机上,而不是同一台主机?
要在 Docker 集群内将容器部署到不同的主机上,可以使用 Docker Swarm 或 Kubernetes。
Docker Swarm:使用 Docker Swarm 内置的编排能力。
部署服务时,Swarm 会自动将容器分布在集群中的不同节点上。你可以使用放置约束来影响此行为。
示例:
docker service create --name myservice --replicas 2 --constraint 'node.role == worker' myimage
Kubernetes:使用 Kubernetes,它会根据可用资源以及任何指定的节点选择器或亲和性,将 pods 调度到不同的节点上。
18. 如果你有一个 Docker Compose 设置,如何将 web 容器部署在一台主机上,将 DB 容器部署在另一台主机上?
要使用 Docker Compose 将 web 容器部署在一台主机,将 DB 容器部署在另一台主机上,你可以:
使用 Docker Swarm:将 Compose 文件转换为 stack 文件,并使用 docker stack deploy 进行部署。Docker Swarm 将服务分布在节点上。
手动放置:在你的 docker-compose.yml 文件中使用放置约束来指定哪些容器应该在哪些节点上运行。
version: '3.7'
services:
web:
image: my-web-image
deploy:
placement:
constraints: [node.hostname == web-node]
db:
image: my-db-image
deploy:
placement:
constraints: [node.hostname == db-node]
19. Docker 中桥接网络和主机网络有什么区别?
桥接网络:默认的 Docker 网络驱动。
-
连接到同一桥接网络的容器可以相互通信。
-
每个容器获得自己的 IP 地址,并与主机网络隔离。你可以使用 -p 选项将端口暴露给主机。
主机网络:容器共享主机的网络栈,
-
意味着它没有自己的 IP 地址,容器的网络与主机的网络相同。
-
这可以提高性能,但降低了主机与容器之间的隔离性。
20 git fetch 和 rebase 的区别
git fetch 与 git rebase 核心区别(面试精简版)
-
一句话分清
-
git fetch:只拉不取,下载远程代码,不合并、不改动本地
-
git rebase:整理提交、变基合并,改写提交历史,线性合并代码
-
详细区别
1)git fetch
- 作用:拉取远程仓库最新代码到本地远程追踪分支
- 不修改本地工作区、不合并代码
- 只更新
origin/xxx远程镜像分支 - 安全无冲突,纯下载
用法
git fetch
# 查看差异
git diff main origin/main
2) git rebase
- 作用:把本地提交挪到远程最新代码之上
- 改写本地 commit 历史,形成干净线性提交
- 会合并代码、产生冲突
- 常用于:多人协作、保持提交线整洁
常用流程
git fetch # 先拉最新
git rebase origin/main # 变基合并
最常用组合流程(企业标准)
git fetch拉远程最新git rebase origin/分支变基合并- 解决冲突继续
git rebase --continue -
推送
git push -
对比口诀
-
fetch = 下载更新
- rebase = 整理合并
延伸:和 git pull 区别
git pull = git fetch + git merge
推荐不用pull,用 fetch + rebase 历史更干净
面试简答
fetch只下载远程最新代码,不合并;rebase用于将本地提交基于远程最新代码重构,实现线性合并,整理提交历史。
20. 你如何解决合并冲突?
解决合并冲突的步骤如下:
- 识别冲突:Git 将使用冲突标记(<<<<<<<, =======, >>>>>>>)标记文件中的冲突区域。
- 手动解决:打开冲突文件,决定如何合并更改。移除冲突标记并修改内容以解决冲突。
- 暂存已解决的文件:解决后,使用 git add 暂存文件。
- 提交更改:使用 git commit 提交已解决的冲突。如果你正处于合并过程中,这将完成合并过程。
- 测试:运行测试以确保合并没有引入任何问题。
git add <已解决的文件>
git commit -m "已解决 X, Y, Z 文件中的合并冲突"
21. 你使用什么命令来更改现有的提交信息?
要更改最近的提交信息,可以使用以下 Git 命令:
git commit --amend -m "新的提交信息"
如果已经将提交推送到远程仓库,则需要强制推送更改:
git push --force
22. 什么是会话亲和性?
会话亲和性,也称为粘性会话,是负载均衡中的一个概念,即来自特定用户的请求在有多服务器的环境中被持续定向到同一台服务器(或 pod)。
这确保了用户存储在服务器本地的会话数据在整个会话期间保持可访问性。
23. 什么是 Pod 亲和性及其用例?
Pod 亲和性是 Kubernetes 中的一项功能,允许你为 pod 调度指定规则,使其运行在已经运行了其他指定 pods 的节点上。
当你希望某些 pods 由于数据局部性、网络延迟或共享资源等因素而位于一起时,这可能很有用。
用例:一个前端和后端服务频繁通信的应用程序可能会使用 Pod 亲和性来确保两者被调度到同一节点,以减少网络延迟。
24. Pod 亲和性和 Pod 反亲和性有什么区别?
Pod 亲和性:确保 pods 被调度在同一节点上或彼此邻近。
Pod 反亲和性:确保 pods 不被调度在同一节点上或彼此远离
示例用例:
Pod 亲和性:为了低延迟通信,将前端和后端运行在同一节点上。
Pod 反亲和性:确保同一应用的副本分布在不同的节点上,以提高可用性和容错能力。
25. 什么是就绪探针和存活探针?
就绪探针:用于确定 pod 何时准备好开始接收流量。如果就绪探针失败,pod 将从服务端点中移除,确保其在准备就绪之前不会接收流量。
存活探针:用于确定 pod 是否仍在运行。如果存活探针失败,Kubernetes 将重启该 pod,假设其处于故障状态。
26. 请为一个 Java Spring Boot 应用编写一个简单的 Groovy 流水线,该流水线等待用户输入批准以进入下一阶段,阶段包括代码检出、构建、推送和部署
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://github.com/your-repo/java-spring-boot-app.git'
}
}
stage('Build') {
steps {
sh './mvnw clean package'
}
}
stage('Push') {
steps {
sh 'docker build -t your-docker-repo/java-spring-boot-app .'
sh 'docker push your-docker-repo/java-spring-boot-app'
}
}
stage('Approval') {
steps {
input 'Do you want to deploy to production?'
}
}
stage('Deploy') {
steps {
sh 'kubectl apply -f deployment.yaml'
}
}
}
}
27. 你如何在 Jenkins 中导出测试报告?
要在 Jenkins 中导出测试报告:
- 确保你的测试以标准格式(如 JUnit XML 或 HTML)生成报告。
- 使用 "Publish JUnit test result report" 构建后操作来归档测试报告。
- 你还可以使用 "Archive the artifacts" 构建后操作来存储其他类型的报告。
- 测试报告随后可以从 Jenkins 构建页面访问和下载。
28. 如果有 5 个 pods 在运行,你如何使用 Kubernetes 命令行将 pods 数量扩展到 10 个?
要将 pods 数量从 5 个扩展到 10 个,使用以下命令:
kubectl scale --replicas=10 deployment/<你的部署名称>
29. 你能解释一下 terraform import 命令的用法吗?
terraform import 是干什么的?
把【已经手动创建好的云资源】,纳入 Terraform 管理。
场景:
- 别人手动创建了一台云服务器
- 你想用 Terraform 统一管理它
- 但 Terraform 不知道这个资源存在
→ 用 import 把它“抓”进 state 文件
terraform import 用于将已存在的云资源纳入 Terraform 管理,它只会把资源信息写入 state 文件,不会自动生成 .tf 配置代码。
terraform import命令用于将现有的基础设施资源导入到 Terraform 的 state 文件中,以便 Terraform 对其进行管理。
核心原理
terraform import 只做两件事:
- 读取云平台上的真实资源信息
- 写入 Terraform state 文件
⚠️ 重要:它不会自动生成 .tf 配置文件!
你必须自己写资源配置,再 import。
标准使用步骤(必背)
- 先写资源配置(空的也行)
resource "aws_instance" "my_server" {
# 先不写内容
}
- 执行 import
terraform import aws_instance.my_server i-1234567890abcdef0
格式:
terraform import <资源类型>.<资源名> <云平台真实资源ID>
- 查看 state,把配置补全
terraform show
把输出内容复制到你的 .tf 文件里。
- 验证
terraform plan
如果没有变化,说明导入成功!
最关键的特点(面试高频)
- 只修改 state,不生成代码
- 必须先写 resource 配置,才能 import
- 是单向操作:云资源 → state
- 不能导入数据资源(如 data 块)
- 导入后 plan 无变化,才算成功
当你想要在不重新创建资源的情况下,将现有基础设施纳入 Terraform 管理时,这特别有用。
terraform import <资源类型>.<资源名称> <资源ID>
terraform import <resource_type>.<resource_name> <resource_id>
terraform import aws_instance.my_instance i-1234567890abcdef0
30. 在 AWS 中,你将 state 文件存储在哪里,以及如何管理它?
在 AWS 中,Terraform state 文件通常存储在 S3 桶中,并且可以使用 S3 和 DynamoDB 的组合进行锁定管理。
示例配置:
terraform {
backend "s3" {
bucket = "my-terraform-state-bucket"
key = "path/to/my/terraform.tfstate"
region = "us-west-2"
dynamodb_table = "terraform-lock-table"
encrypt = true
}
}
管理
S3:安全地存储 state 文件,支持版本控制,并且可以加密。
DynamoDB:提供锁定机制,防止对同一 state 文件进行多个并发操作,避免冲突。
此设置确保你的 Terraform state 被安全存储,并受到防止并发访问问题的保护。
31. 你在使用 Terraform 时遇到的最大问题是什么,你是如何解决的?
我遇到的一个主要问题是当多个团队在同一基础设施上工作时管理 Terraform state。
这通过将基础设施组织成独立的模块以及使用带有适当锁定机制的远程 state 管理得以解决。
32. AWS S3 中有哪些类型的存储类别?
在 AWS S3 中,不同的存储类别包括:
-
S3 Standard
-
S3 Intelligent-Tiering
- S3 Standard-IA (不频繁访问)
- S3 One Zone-IA
- S3 Glacier
- S3 Glacier Deep Archive
33. 你熟悉 S3 桶的生命周期管理吗?如何设置生命周期策略?
是的,S3 生命周期管理允许你定义规则,在特定时间段后将对象在不同存储类别之间转换或将其删除。
可以通过 S3 管理控制台、AWS CLI 或 Terraform 来设置生命周期策略,即在 JSON 配置文件中指定转换和过期操作。
34. 负载均衡器之间有什么区别,为什么我们需要它们?
负载均衡器将传入的网络流量分配到多台服务器。主要类型有:
-
应用负载均衡器 (ALB):在应用层(第7层)运行,用于具有高级路由功能的 HTTP/HTTPS 流量。
-
网络负载均衡器 (NLB):在传输层(第4层)运行,用于超低延迟的 TCP/UDP 流量。
-
经典负载均衡器 (CLB):同时支持第4层和第7层,但现在大多已被 ALB 和 NLB 取代。
负载均衡器提高了容错能力、可扩展性并确保了高可用性。
35. 你用过 Auto Scaling Groups (ASG) 吗?
是的,我曾使用 ASGs 根据需求自动调整实例数量。
ASGs 配置了根据 CPU 使用率等指标调整所需容量的策略,有助于维持应用性能并优化成本。
36. 你能写一个简单的 Dockerfile 吗?
是的,这里有一个用于 Node.js 应用的简单 Dockerfile 示例:
FROM node:14
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
37. 如果你想将你的应用暴露给公共互联网,或者在集群内部访问你的应用,在 Kubernetes 中你会怎么做?
要将你的应用暴露给公共互联网,你可以使用类型为 LoadBalancer 或 NodePort 的 Kubernetes Service。
对于集群内部访问,你可以使用 ClusterIP 服务。此外,你可能还需要使用 Ingress 控制器来实现更高级的路由。
38. 为什么我们在 Kubernetes 中需要 ConfigMap?
ConfigMap 用于以键值对的形式存储非机密的配置数据。
它允许你将配置工件与镜像内容解耦,使你无需重建容器镜像即可修改应用设置。
39. 在为微服务应用设置 CI/CD 流水线时,你会考虑哪些 AWS 服务?
对于 CI/CD 流水线,我会考虑使用:
AWS CodeCommit 进行源代码控制。
AWS CodeBuild 进行构建和测试。
AWS CodeDeploy 或 Amazon EKS 进行部署。
AWS CodePipeline 来编排 CI/CD 过程。
Amazon S3 用于工件存储。
AWS Lambda 用于任何自定义自动化任务。
40. 在一个电商应用流量异常高的日子,作为云工程师,你将如何管理当前设置以平稳处理负载?
我将确保 Auto Scaling Groups 配置正确,以通过自动添加更多实例来处理增加的需求。
我还将验证负载均衡器是否均匀分配流量,并考虑启用缓存(例如使用 Amazon CloudFront)以减少后端服务器的负载。将使用 CloudWatch 等监控工具来跟踪性能指标并实时调整资
策略:
- 自动扩缩容:自动扩展实例以处理增加的负载。
- 缓存:使用缓存层来减少应用服务器的负载。
- 负载均衡:在可用实例间均匀分配流量。
- 数据库优化:确保数据库配置正确并针对性能进行优化。
- 监控:密切监控系统指标以识别瓶颈并相应调整资源。
41. 如果流量当前由单个实例处理,你将如何在 AWS 中进行高可用性升级?
为了进行高可用性升级,我将:
-
部署多个 实例到不同的可用区 (AZs),使用 Auto Scaling Group。
-
设置负载均衡器 (ALB 或 NLB) 在这些实例间分配流量。
-
配置健康检查 以确保流量只路由到健康的实例。
-
对数据库(如 RDS)使用多可用区部署 以确保数据可用性。
42. 在自动扩缩容实例时,你如何管理后端 RDS 数据库?
在自动扩缩容期间管理后端 RDS 数据库:
启用多可用区 以实现高可用性和自动故障转移。
使用 RDS 只读副本来处理读取密集型流量,减少主数据库的负载。
根据数据库工作负载垂直扩展(实例大小)或水平扩展(只读副本)RDS。
使用 Amazon CloudWatch 监控性能,并根据需要进行调整。
43. 你曾经为 S3 设置过跨账户访问吗?例如,如果 QA 团队需要访问生产数据库。
是的,我通过以下方式设置过跨账户访问:
在生产账户中创建一个具有必要 S3 权限的 IAM 角色。
建立信任关系,允许 QA 账户担任该角色。
使用 S3 桶策略 授予 QA 账户访问权限。
QA 团队成员随后可以使用 AWS STS(安全令牌服务)来担任该角色,以访问生产 S3 桶。
44. 账户 A 中的 S3 如何访问账户 B 中的 S3 账户?
账户 A 可以通过以下方式访问账户 B 的 S3 桶:
在账户 B 中设置桶策略,授予账户 A 必要的权限。
在账户 B 中创建一个 IAM 角色,该角色具有 S3 权限,并允许账户 A 通过信任策略担任该角色。
使用 AWS STS 从账户 A 担任该角色,以访问账户 B 中的 S3 桶。
45. 你能区分 IAM 策略和 IAM 角色吗?
IAM 策略:这些是附加到用户、组或角色的权限集合,定义了允许或拒绝哪些操作。
IAM 角色:这些是具有特定权限的身份,可以被实体(如用户、应用或 AWS 服务)担任。角色通常用于临时访问或跨账户访问。
46. 你能解释一下 STS 担任角色策略吗?
STS(安全令牌服务)担任角色策略允许用户或服务在不同账户或同一账户内担任一个角色。
这提供了与所担任角色关联的临时安全凭据,从而实现跨账户访问或权限委派。
47. 你在项目中是否遇到过任何具有挑战性的问题或事件?你和你的团队是如何识别和解决它们的?
是的,一个挑战是流量突然激增导致性能下降。
我们使用 CloudWatch 指标和日志识别了问题,找到了数据库中的瓶颈。
解决方案包括垂直扩展数据库并添加只读副本来分散负载,同时优化运行缓慢的查询。
48. Docker 中 CMD 和 ENTRYPOINT 有什么区别?
CMD:为入口点或要运行的命令提供默认参数,如果没有提供其他命令的话。
ENTRYPOINT:定义将始终运行的可执行文件,CMD 作为其默认参数。当你希望容器表现得像一个特定的可执行文件时,ENTRYPOINT 很有用。
示例:ENTRYPOINT ["python", "app.py"]确保 app.py 始终被执行,而 CMD 允许传递不同的参数。
核心作用
- ENTRYPOINT:容器启动主执行命令,固定执行入口
- CMD:默认参数 / 备用启动命令,给入口传默认参数
三种组合用法
- 只有 CMD
CMD ["java","-jar","app.jar"]
- 容器启动直接执行这条命令
- 运行时传参直接覆盖整条 CMD
docker run 镜像 ls # 执行 ls,替代原来java命令
只有 ENTRYPOINT
ENTRYPOINT ["/bin/sh","-c"]
- 固定执行这个入口
- 运行传参无效,无法覆盖
两者搭配(企业最常用)
ENTRYPOINT ["/usr/local/bin/start.sh"]
CMD ["--env","prod"]
- ENTRYPOINT = 主程序
- CMD = 主程序默认参数
- 运行时传参只会覆盖CMD,不会改主程序
docker run 镜像 --env test
# 最终执行:start.sh --env test
三、关键区别
-
优先级 ENTRYPOINT > CMD
-
是否可被覆盖
-
CMD:运行
docker run后面全部覆盖 -
ENTRYPOINT:无法被直接覆盖,只能追加参数
-
执行顺序
先执行ENTRYPOINT,再拼接CMD参数
-
用途
-
ENTRYPOINT:固定启动脚本、固定主程序
- CMD:设置默认启动参数
Shell格式 & Exec格式区别
- Exec格式(数组)
[]:推荐,可传参、PID1正常 - Shell格式 不带[]:会嵌套shell,无法接收宿主机参数
一句话面试总结
ENTRYPOINT 指定容器固定启动入口,CMD提供默认启动参数;运行容器传参仅覆盖CMD,不会修改ENTRYPOINT主命令。
最简口诀
入口用ENTRYPOINT,参数用CMD
49. 你曾经独立管理过应用吗?
是的,我曾独立管理过应用,处理诸如部署、监控、故障排除和扩缩容等任务。
这涉及设置基础设施、CI/CD 流水线,并确保高可用性和安全性
50. 基础设施即代码 (IaC) 有什么好处?
一致性:通过自动化配置过程确保环境一致。
版本控制:基础设施可以被版本化和跟踪,支持回滚和审计。
自动化:减少人工干预,最大限度地减少错误并加快部署速度。
可扩展性:允许通过脚本轻松扩展和管理资源。
协作:团队可以使用代码审查和版本控制系统更有效地协作。
51. 创建基础设施即代码有哪些不同的方法?
Terraform:一个流行的开源工具,允许你使用声明式配置语言定义基础设施即代码。它可与各种云提供商协作。
AWS CloudFormation:AWS 提供的一项服务,使你能够使用 JSON 或 YAML 模板定义 AWS 资源。
Azure Resource Manager (ARM) 模板:Azure 的基础设施即代码解决方案,允许你用 JSON 定义资源。
Google Cloud Deployment Manager:Google 的基础设施即代码工具,使用 YAML 定义资源。
Ansible:虽然主要是配置管理工具,但也可以使用 YAML 编写的 playbook 来配置基础设施。
Pulumi:一个现代化的基础设施即代码工具,支持多种编程语言,如 Python、JavaScript 和 Go
52. 公共网络和私有网络之间有什么区别?
公共网络:指可从互联网访问的网络。使用公共 IP 地址,资源对外部访问是暴露的。
私有网络:指与公共互联网隔离的网络。
私有网络内的资源使用私有 IP 地址进行安全通信,外部访问通常受到限制。
53. 什么是 Docker 仓库,为什么我们需要它?
Docker 仓库:一个用于 Docker 镜像的存储和分发系统。它允许你存储、共享和管理 Docker 容器镜像。Docker Hub 是一个流行的公共仓库,但你也可以设置私有仓库。
为什么我们需要它:Docker 仓库使团队能够轻松地对 Docker 镜像进行版本控制、共享和部署。它们通过支持自动构建和部署来支持 CI/CD 流水线。
54. 什么是 Secrets Manager?
Secrets Manager:一个安全存储和管理敏感信息的工具或服务,例如 API 密钥、密码、证书和令牌。示例包括 AWS Secrets Manager、HashiCorp Vault 和 Azure Key Vault。
目的:在不将密钥硬编码到应用代码或配置文件中的情况下安全地存储和访问它们。
55. 管理敏感信息的安全方法是什么?
使用 Secrets Manager:将密钥存储在专用服务中,如 AWS Secrets Manager、Azure Key Vault 或 HashiCorp Vault。
环境变量:使用环境变量在运行时注入密钥,而不是将其存储在代码中。
加密存储:将敏感数据存储在加密的数据库或文件中,确保密钥被安全管理。
访问控制:实施严格的访问控制和审计,确保只有授权的人员和应用可以访问敏感信息
56. 你用过 Kubernetes (K8s) 吗?
如果你有 Kubernetes 经验,可以讨论:
- 使用 Kubernetes 部署和管理容器化应用。
- 配置 Kubernetes 集群和使用 kubectl 等工具。
- 在 Kubernetes 中管理服务、Ingress 和网络。
- 使用 Helm charts 打包和部署应用。
57. Docker 和 Kubernetes 有什么区别?
Docker:一个用于在容器内开发、交付和运行应用的平台。它简化了管理应用依赖项和环境一致性的过程。
Kubernetes:一个用于自动化容器化应用的部署、扩展和管理的开源编排系统。Kubernetes 管理跨集群的多个容器,提供负载均衡、扩展和自我修复等功能。
58. 你能解释一下应用的端到端部署过程吗?
端到端部署过程可能涉及以下步骤:
- 代码提交:开发人员将代码更改推送到像 Git 这样的版本控制系统。
- CI/CD 流水线:持续集成流水线构建代码,运行测试并创建 Docker 镜像。
- 镜像存储:Docker 镜像被推送到 Docker 仓库。
- 部署:镜像被 Kubernetes、Docker Swarm 或其他编排工具从仓库拉取,并部署到暂存或生产环境。
- 监控与日志:监控应用的性能和错误,收集并分析日志。
- 扩展与更新:根据需求扩展应用,并使用蓝绿部署或金丝雀部署等策略推出更新。
59. 如果你想使用 Kubernetes 而不是 EC2 实例,你会怎么做?你用过 Helm charts 或其他 CD 工具吗?你如何处理 Kubernetes 上具有多个微服务的项目
使用 Kubernetes 替代 EC2:你将在 Kubernetes 集群上部署你的应用,而不是直接在 EC2 实例上。这涉及在 AWS 中设置 EKS(弹性 Kubernetes 服务)集群或使用其他托管的 Kubernetes 服务。
Helm Charts:Helm 是 Kubernetes 的包管理器,可帮助你管理 Kubernetes 应用。你可以使用 Helm charts 以一致且可重复的方式部署和管理多个微服务。
处理多个微服务:使用 Kubernetes 命名空间来隔离微服务,并使用 Helm charts 或像 Jenkins、ArgoCD 或 GitLab CI/CD 这样的 CI/CD 工具来管理它们的部署。实施服务发现、网络和安全策略,以确保微服务之间的无缝通信。
60. 你如何将堡垒主机连接到私有网络?你能解释一下 VPC 和 VPC 对等连接吗?
连接堡垒主机:堡垒主机通常设置在虚拟私有云 (VPC) 的公共子网中,并可以访问私有网络。
用户通过 SSH 连接到堡垒主机,然后从那里可以访问私有子网中的资源。
VPC(虚拟私有云):云提供商网络中的一个逻辑隔离部分,你可以在其中启动和管理资源。它允许你定义 IP 范围、子网、路由表和网络网关。
VPC 对等连接:两个 VPC 之间的网络连接,允许使用私有 IP 地址在它们之间路由流量。这对于在不通过公共互联网的情况下连接不同 VPC 之间的资源很有用。
61. 你是否配置过一个系统,在开发者完成 Jira 中的票后,代码会自动合并和发布?你具体管理了什么?
是的,我设置过一个 CI/CD 流水线,当开发者完成 Jira 中的票时,代码会自动合并和发布。这个过程通常包括:
与 Jira 集成:配置 Jira 在票被标记为“完成”或移动到特定工作流阶段时触发 CI/CD 流水线。
代码合并:使用 GitLab CI、GitHub Actions 或 Jenkins 等工具在测试通过后自动将功能分支合并到主分支。
自动化测试:运行单元测试、集成测试和端到端测试,以确保代码质量,然后进行合并。
部署:使用部署工具,如 Kubernetes、Helm 或 Docker Swarm,自动将合并后的代码部署到暂存或生产环境。
62. 你如何在服务器上设置 Nginx?
在服务器上设置 Nginx 涉及:
- 安装:
对于 Ubuntu/Debian:sudo apt-get update && sudo apt-get install nginx
对于 CentOS/RHEL:sudo yum install nginx
- 配置:
编辑位于 /etc/nginx/nginx.conf的配置文件或 /etc/nginx/sites-available/中的各个站点配置。
- 定义 server blocks(虚拟主机)以指定不同的站点及其根目录。
-
根据需要配置反向代理、负载均衡、SSL/TLS 证书和缓存。
-
启动并启用 Nginx:
启动服务:sudo systemctl start nginx
启用开机启动:sudo systemctl enable nginx
- 测试:
测试配置:sudo nginx -t
确保 Nginx 正在运行并正确提供内容。
63. 什么是负载均衡器及其好处?什么是 Cloud NAT?
负载均衡器:负载均衡器将传入的网络流量分配到多台服务器或服务,以确保可靠性、可扩展性和高可用性。好处包括:
提高容错能力:分配流量以防止单个服务器过载。
可扩展性:通过添加更多服务器轻松管理增加的流量。
提高性能:根据性能指标平衡负载,减少延迟。
Cloud NAT 是什么?
它允许私有子网中的实例连接到互联网,而不将它们暴露给入站互联网流量,在保持安全的同时实现出站连接。
一句话定义:
云厂商托管的 NAT 网关服务,让 VPC 里没有公网 IP 的私有资源(VM/容器/Serverless)能安全访问外网,同时不被外网主动访问<mark。
- 全名:Cloud Network Address Translation
- 定位:托管、分布式、高可用、免运维 的 SNAT(源地址转换)服务
- 典型场景:GCP 的 Cloud NAT、AWS 的 NAT Gateway、阿里云/腾讯云的 NAT 网关
核心作用(解决什么问题) 你有一批内网机器(只有私有 IP):
- 需要 下载更新、拉镜像、调用外部 API、发日志到公网 SaaS
- 但不想给它们配公网 IP(不安全、成本高、难管理)
→ Cloud NAT 就是帮它们做“地址伪装”,共享少量公网 IP 出去访问。
工作原理(极简版)
1)SNAT(出网)
- 内网 VM:
10.1.1.10:8080→ 访问外网api.example.com:443 - Cloud NAT:把源 IP:Port 换成 NAT 公网 IP:随机端口
- 外网看到的只是 NAT 网关,完全看不到内网真实 IP
2)回包(DNAT)
- 外网响应 → 回到 NAT 公网 IP
- NAT 查连接映射表 → 把目的 IP:Port 换回内网原 IP:Port
- 数据包送回发起请求的 VM
3)关键限制
- 只负责出网(主动访问外网)
- 不支持外网主动入站访问(默认安全)
- 多台内网主机共享一个/少数几个公网 IP
通俗流程图(文字版)
内网VM(10.1.1.10)
↓ 访问外网
┌─────────────────┐
│ Cloud NAT │
│ (SNAT+映射表) │
└─────────────────┘
↓ 伪装成 NAT 公网 IP
互联网/外部API
五、对比:有公网 IP vs Cloud NAT
| 对比项 | 给 VM 直接配公网 IP | Cloud NAT |
|---|---|---|
| 外网能否主动连 | ✅ 可以(有暴露风险) | ❌ 不可以(默认安全) |
| 成本 | 每台一个公网 IP,贵 | 整个子网共享少量 IP,便宜 |
| 攻击面 | 大(直接暴露) | 极小(只暴露 NAT 网关) |
| 运维 | 分散、难管控 | 集中托管、免运维 |
典型使用场景
- 私有 GKE/ECS 集群:节点无公网 IP,但要拉镜像、访问外网服务
- 内网数据库/中间件:需要下载补丁、访问外部监控/日志服务
- Serverless 私有访问:Cloud Run/函数通过 VPC 连接器出网
- 合规安全:禁止给业务机配公网 IP,统一 NAT 出口审计
一句话面试总结(必背)
Cloud NAT 是云厂商托管的 SNAT 服务,让 VPC 内无公网 IP 的私有资源安全访问外网,共享公网 IP、隐藏内网地址、默认禁止外网主动入站。
64. 负载均衡器和 Cloud NAT 网关有什么区别?
负载均衡器:
- 将传入流量分配到多台服务器或服务。
- 主要用于负载分配、冗余和高可用性。
- 在不同层(TCP 用 L4,HTTP/HTTPS 用 L7)工作。
Cloud NAT 网关:
- 为私有网络中的实例提供出站互联网访问,而不将其暴露给入站流量。
- 用于需要互联网访问但不希望直接从互联网访问的安全私有实例。
65. 你如何看待自己适合这个特定职位?
我认为自己适合这个职位,因为我拥有基础设施管理、自动化和云技术方面的专业知识。
我在设置 CI/CD 流水线、管理部署和优化资源分配方面的经验与该职位的职责相符。我还带来了解决问题的技能和积极主动的方法来确保系统可靠性,这将有助于团队和组织的成功。
66. 你采取了哪些成本优化措施来减少云支出?结果如何?
在一个之前的项目中,我注意到我们的云基础设施存在过度配置,导致不必要的成本。
我根据实际使用指标实施了自动扩缩容,并对非关键工作负载利用了 Spot 实例。
此外,我通过将不经常访问的数据移动到成本更低的存储类别来重构存储解决方案。
这些变化使我们的月度云支出显著减少,且未影响性能。
67. 描述一个整个生产实例崩溃,你必须快速修复的情况。你经历过这种情况吗?
是的,我经历过这种情况。有一次,由于应用中的内存泄漏,我们的生产服务器崩溃了。
我使用像 Prometheus 这样的监控工具和 ELK Stack 的日志快速识别了问题。
为了解决它,我重启了受影响的服务,并临时扩展了基础设施以处理负载。然后我与开发团队合作,识别并修复了内存泄漏,确保不再发生。
68. 什么是蓝绿部署,为什么需要它?
蓝绿部署:
- 一种部署策略,其中维护两个相同的环境(蓝色和绿色)。
- 蓝色环境是活跃的生产环境,而绿色是闲置的。在部署期间,新版本被部署到绿色环境。
- 经过测试后,流量切换到绿色,使其成为新的生产环境。
为什么需要:
最小化停机时间:由于环境之间的切换是即时的,减少了停机时间。
易于回滚:如果出现问题,切换回蓝色环境很简单。
提高可靠性:降低了部署失败影响用户的风险。
69. 你还知道哪些其他部署策略?
金丝雀部署:在全面部署之前,将新版本逐步推送给一小部分用户。
滚动部署:使用新版本逐步更新实例或服务器,确保至少有一些实例始终运行旧版本。
A/B 测试:类似于蓝绿部署,但用于通过实时用户流量比较不同版本/功能,以确定哪个表现更好。
功能开关:允许动态开启/关闭功能,使得部署不完整的功能而不会影响用户。
70. 你用过哪些高级的 AWS 资源类型?
AWS Lambda:无服务器计算,用于响应事件运行代码而无需管理服务器。
AWS Fargate:容器的无服务器计算引擎,允许部署容器化应用而无需管理底层基础设施。
Amazon RDS:用于关系数据库的托管数据库服务,包括自动备份、扩展和多可用区部署等功能。
AWS CloudFormation:用于自动化资源配置和管理的基础设施即代码 (IaC) 工具。
Amazon VPC 对等连接和 Transit Gateway:用于创建跨多个 VPC 和账户的复杂网络架构。
AWS Step Functions:用于将 AWS Lambda 函数和其他服务组合成无服务器工作流的编排服务。
71. 在 DevOps 工程师的帮助下,托管模块(如 AI/ML)如何在 AWS 中根据不同的前端/后端需求进行部署、定制和扩展?
在 AWS 中部署、定制和扩展托管模块
部署:DevOps 工程师使用像 AWS CodePipeline 这样的工具来自动化托管 AI/ML 模块的部署。这涉及:
- 容器化:将模块打包到 Docker 容器中以实现可移植性。
- 基础设施配置:使用 IaC(例如 CloudFormation)来设置必要的 AWS 资源(EC2 实例、S3 桶等)。
- 部署自动化:使用像 AWS CodeDeploy 这样的工具将容器部署到已配置的基础设施上。
定制:定制通常涉及:
- 配置管理:使用像 Ansible 或 Puppet 这样的工具根据特定需求配置模块。
- 环境变量:使用环境变量为不同环境(开发、测试、生产)注入不同的配置。
扩展:DevOps 工程师利用以下 AWS 服务:
- Auto Scaling Groups:根据负载自动调整实例数量。
- Elastic Load Balancing:在多个实例间分配流量以实现高可用性。
- 无服务器计算:使用像 AWS Lambda 这样的服务来动态扩展 AI/ML 工作负载
72. 你能描述一下一个你以前没听说过但通过自学掌握并使用的技术吗?
学习一项新技术
示例:我最近学习了 Apache Kafka,一个分布式流处理平台。我最初不熟悉其概念,但对其实时数据处理的潜力很感兴趣。
学习过程:我从阅读文档、观看教程和自行尝试使用 Kafka 开始。我还加入了在线社区和论坛,与其他用户联系并从他们的经验中学习。
应用:我成功地在项目中实现了 Kafka 来处理高容量事件流,提高了数据处理效率和实时洞察力。
73. 你作为 DevOps 工程师面临过哪些挑战?
复杂性:管理具有多个服务和依赖项的复杂云环境。
自动化:在自动化和人工干预之间找到适当的平衡。
安全性:确保云基础设施和应用程序的安全。
协作:与开发人员、运维团队和其他利益相关者有效合作。
持续学习:跟上云计算领域的快速变化步伐。
76. 在发生数据丢失时,你使用什么策略来确保没有数据丢失,特别是在像银行这样的关键应用中?
数据丢失预防策略
-
策略:对于像银行这样的关键应用,采用多层次的方法是必要的:
-
冗余:使用多个数据中心或云区域进行复制和故障转移。
- 备份:实施频繁且自动化的备份到多个位置。
- 版本控制:跟踪数据更改并维护历史版本。
- 监控:监控数据库健康状况和性能以尽早发现潜在问题。
- 灾难恢复计划:制定全面的灾难恢复计划,以便在发生中断时恢复数据和服务
77. 你是否遇到过针对你构建和实施的系统的网络攻击?你采取了哪些预防措施?
网络攻击与预防措施
经验:我曾遇到过安全事件,如暴力攻击和试图利用漏洞的行为。
预防措施:
安全最佳实践:实施强密码、多因素认证和最小权限访问。
漏洞扫描:定期扫描系统漏洞并及时修补。
安全监控:使用安全信息和事件管理 (SIEM) 工具来监控可疑活动。
事件响应计划:制定计划以有效响应安全事件。
78. 你遵循哪些网络设置规则?
网络设置规则
规则:
- 安全组:使用安全组来控制进出实例的流量。
- 网络分段:将网络分成更小的段以隔离资源并限制安全漏洞的影响。
- 防火墙规则:实施防火墙规则以阻止未经授权的访问。
- VPN 和隧道:使用 VPN 和隧道来保护网络之间的通信。
- 网络监控:监控网络流量和性能以识别潜在问题。
79. 作为一名 DevOps 工程师,你的日常职责是什么?
日常职责
- 监控:监控系统健康、性能和安全性。
- 自动化:自动化部署、基础设施配置和备份等任务。
- 故障排除:解决问题和事件。
- 协作:与开发人员、运维团队和其他利益相关者合作。
- 持续改进:识别改进领域并实施更改以提高效率和可靠性。
80. 你精通哪些 DevOps 工具?
DevOps 工具熟练度
基础设施即代码:Terraform, CloudFormation, Ansible, Puppet。
容器化:Docker, Kubernetes。
CI/CD:Jenkins, GitLab CI/CD, AWS CodePipeline。
监控与日志:Prometheus, Grafana, ELK Stack。
配置管理:Ansible, Puppet, Chef。
版本控制:Git。
81. 你能描述一下你项目中的 CI/CD 工作流程吗?
CI/CD 工作流程描述
示例:在最近的一个项目中,我们的 CI/CD 工作流程包括:
- 代码提交:开发人员将代码更改提交到 Git 仓库。
- 构建和测试:一个 CI 服务器(如 Jenkins, GitLab CI)自动构建应用程序,运行单元测试并执行代码质量检查。
- 工件存储:成功的构建作为工件存储在仓库(如 S3)中。
- 部署:CD 服务器(如 AWS CodeDeploy)将工件部署到目标环境(开发、测试、生产)。
- 监控:持续监控工具(如 Prometheus, Grafana)跟踪应用健康状况和性能。
82. 在你的项目中,你如何处理持续交付 (CD) 方面?
持续交付 (CD) 处理
方法:
自动化部署:使用像 AWS CodeDeploy 这样的工具将部署自动化到不同的环境。
蓝绿部署:将新版本的应用与现有版本一起部署,允许无缝切换。
金丝雀部署:逐步向一小部分用户推出新版本,在全面部署前监控问题。
功能开关:使用功能开关来启用或禁用应用中的功能而无需更改代码,允许受控发布。
83. 你用什么方法来检查代码漏洞?
代码漏洞检查方法
静态代码分析:使用 SonarQube 或 Snyk 等工具分析代码中的漏洞和安全问题。
动态代码分析:使用 Burp Suite 或 ZAP 等工具在运行时测试应用程序的漏洞。
安全扫描:使用 AWS Inspector 或 Qualys 等工具扫描基础设施和应用程序的漏洞。
84. 你精通哪些 AWS 服务?
AWS 服务熟练度
服务:
计算:EC2, Lambda, ECS, EKS。
存储:S3, EBS, EFS。
网络:VPC, Route 53, Load Balancers。
数据库:RDS, DynamoDB, Redshift。
CI/CD:CodePipeline, CodeBuild, CodeDeploy。
安全:IAM, Security Groups, KMS。
监控:CloudWatch。
85. 如果你的应用运行在账户 B 的 EC2 实例上,你如何访问账户 A 的 S3 桶中的数据?
从账户 B 访问 S3
方法:使用 IAM 角色和跨账户权限:
-
创建角色:在账户 A 中创建一个具有访问 S3 桶权限的 IAM 角色。
-
担任角色:在账户 B 中,配置 EC2 实例以担任在账户 A 中创建的角色。
-
访问 S3:EC2 实例现在可以使用担任角色的凭据访问 S3 桶。
86. 你如何提供对 S3 桶的访问,需要在桶端设置哪些权限?
S3 桶访问和权限
访问:你可以通过以下方式提供对 S3 桶的访问:
-
IAM 策略:向用户、组或角色附加策略以授予特定权限。
-
桶策略:直接在桶上定义访问控制规则。
权限:常见权限包括:
- 读取:允许用户从桶中读取对象。
- 写入:允许用户向桶中写入对象。
- 删除:允许用户从桶中删除对象。
- 列出:允许用户列出桶中的对象。
87. 具有静态 IP 的实例 2 如何与位于私有子网并映射到多可用区负载均衡器的实例 1 通信?
与私有子网中的实例通信
方法:使用 NAT 网关或堡垒主机。
- NAT 网关:一个托管服务,为私有子网中的实例提供互联网访问。
- 堡垒主机:公共子网中的一个安全服务器,允许访问私有实例。
88. 对于私有子网中的 EC2 实例,如果不使用 NAT 网关或堡垒主机,它如何验证并从互联网下载所需的软件包?是否有其他 AWS 服务可以促进这一点?
私有子网中的 EC2 实例访问互联网
方法:使用私有 DNS 主机名:
- 私有 DNS:在你的 VPC 内配置一个私有 DNS 区域。
- 私有主机名:为 EC2 实例分配一个私有主机名。
- DNS 解析:EC2 实例可以解析私有主机名以访问互联网资源。
89. 负载均衡器的典型延迟是多少?如果遇到高延迟,你会采取哪些监控步骤?
负载均衡器延迟和监控
典型延迟:负载均衡器延迟通常从几毫秒到几百毫秒不等,具体取决于网络状况和负载等因素。
监控步骤:
CloudWatch 指标:使用 CloudWatch 指标监控负载均衡器延迟。
网络跟踪:使用像 AWS X-Ray 这样的工具跟踪通过负载均衡器的请求并识别瓶颈。
性能测试:运行负载测试以模拟真实流量并识别性能问题。
90. 如果你的应用托管在 S3 上,而用户位于不同的地理位置,你如何减少延迟?
为 S3 托管的应用减少延迟
方法:
- 边缘站点:使用 AWS CloudFront 将内容缓存在离用户更近的边缘站点,减少延迟。
- 区域桶:在与用户相同的区域存储数据在 S3 桶中,减少网络跳数。
- 内容分发网络 (CDNs):使用 CDN 在全球多个位置分发内容,减少全球用户的延迟。
- 哪些服务可以与 CDN(内容分发网络)集成?
91. 哪些服务可以与 CDN(内容分发网络)集成?
CDN 集成
服务:CDN 可以与各种服务集成,包括:
- Web 服务器:Apache, Nginx, IIS。
- 内容管理系统 (CMS):WordPress, Drupal, Joomla。
- 云存储:AWS S3, Google Cloud Storage, Azure Blob Storage。
- 流媒体服务:Netflix, YouTube, Twitch。
- API 网关:AWS API Gateway, Google Cloud Endpoints。
92. 你如何动态地从 AWS 检索 VPC 详细信息以使用 IaC 创建 EC2 实例?
动态检索 VPC 详细信息
方法:使用 Terraform 的数据源:
-
aws_vpc 数据源:通过其 ID 或名称检索特定 VPC 的详细信息。
-
aws_subnet 数据源:检索 VPC 中子网的详细信息。
- aws_security_group 数据源:检索与 VPC 关联的安全组的详细信息。
- aws_instance 数据源:检索 VPC 内现有 EC2 实例的详细信息。
93. 在 Terraform 中管理非托管资源
方法:使用 terraform import 命令将现有的非托管资源纳入 Terraform 的控制。这允许你将它们与你的 IaC 代码一起管理。
94. 在导入 VPC 时传递参数
方法:使用 terraform import 命令的 --var 标志传递参数:
terraform import aws_vpc.example "vpc-1234567890abcdef0" --var="cidr_block=10.0.0.0/16"
95. Jenkins 中的主从架构是什么?
Jenkins 中的主从架构允许你将构建任务分布到多个节点(从节点)。这提供了:
并行执行:在多个节点上并发运行构建,减少构建时间。
资源优化:为不同的构建任务利用不同的硬件配置。
可扩展性:通过添加更多从节点来扩展 Jenkins 基础设施。
96. 你如何将 LDAP 与 AWS 和 Jenkins 集成?
你可以通过以下方式将 LDAP 与 AWS 和 Jenkins 集成:
- 配置 LDAP:设置 LDAP 服务器并配置其以进行用户身份验证。
- AWS IAM:创建一个具有访问 LDAP 服务器权限的 IAM 角色。
- Jenkins 配置:配置 Jenkins 以使用 LDAP 服务器进行身份验证。
97. GitHub 的一些主要功能是什么?
- 版本控制:随时间跟踪代码更改。
- 协作:促进开发人员之间的协作。
- Pull Requests:支持代码审查和批准。
- Issues:跟踪错误、功能请求和其他任务。
- Projects:组织和管理工作项。
98. Jenkins 的一些主要功能是什么?
-
持续集成 (CI):自动化构建、测试和部署过程。
-
持续交付 (CD):将应用程序部署到不同环境。
-
流水线即代码:使用代码(Jenkinsfile)定义流水线。
-
插件:通过广泛的插件扩展 Jenkins 功能。
-
主从架构:将构建任务分布到多个节点。
99. CI/CD 的好处和用途是什么?
-
更快交付:减少交付新功能和更新的时间。
-
提高质量:在开发过程中尽早发现错误和问题。
-
提高效率:自动化重复性任务,让开发人员专注于创新。
-
降低风险:更频繁、更低风险地部署更改。
CI/CD 的用途:
- 软件开发:自动化构建、测试和部署过程。
- 基础设施管理:自动配置和配置基础设施。
- 数据流水线:自动化数据处理和分析任务。
100. 什么是 GitHub 工作流,它是如何使用的?
GitHub 工作流是一组自动化任务,由 GitHub 仓库中的事件触发。
你可以使用工作流来:
-
构建和测试代码:自动化构建和测试过程。
-
部署应用程序:将应用程序部署到不同环境。
-
运行代码分析:执行代码质量检查和安全扫描。
101. 你如何处理 Git 中的合并冲突?
识别冲突:Git 在合并分支时会识别冲突。
解决冲突:通过编辑受影响的文件手动解决冲突。
暂存更改:使用 git add 暂存已解决的文件。
提交更改:使用 git commit 并附带描述性消息提交更改。
102. 当 Jenkins 中的构建失败时,你采取哪些步骤?
当 Jenkins 中的构建失败时,你应该:
- 分析日志:查看构建日志以确定失败原因。
- 故障排除:调查问题并尝试解决。
- 修复代码:如果失败是由于代码错误,修复代码并重新构建。
- 更新配置:如果失败是由于配置问题,更新 Jenkins 配置。
- 回滚:如有必要,回滚到之前的工作版本。
103. 你如何在 AWS 中执行作业?
你可以在 AWS 中使用以下方式执行作业:
AWS Batch:一个完全托管的批处理计算服务,用于运行大规模、计算密集型作业。
AWS Lambda:一个无服务器计算服务,用于响应事件运行代码。
AWS ECS:一个容器编排服务,用于部署和管理容器化应用。
104. 什么是 Ansible 角色,你如何使用它们?
Ansible 角色是组织和重用 Ansible playbooks 的一种方式。
它们封装了与特定组件或服务相关的任务、变量和依赖项。你使用角色来:
-
模块化 Playbooks:将复杂的 playbooks 分解为更小的、可重用的单元。
-
简化部署:使用单个角色部署多个组件或服务。
-
提高可维护性:使管理和更新 Ansible 配置更容易。
什么是 Role(角色)
Role 是 Ansible 标准化、模块化的代码目录结构
把变量、任务、模板、文件、处理器、依赖统一封装,实现代码复用、一键部署。
简单说:把部署一套服务拆成标准包,到处调用
核心作用
- 规范目录结构,代码清晰好维护
- 一次编写,多处复用(多项目、多环境通用)
- 统一部署标准,减少重复写playbook
- 支持角色依赖,自动依次部署
Role 默认目录结构
roles/
├── nginx/ # 角色名
│ ├── tasks/ # 核心执行任务 main.yml
│ ├── handlers/ # 触发器(重启服务等)main.yml
│ ├── templates/ # jinja2模板配置文件
│ ├── files/ # 普通静态文件
│ ├── vars/ # 角色内置变量
│ ├── defaults/ # 默认变量(优先级最低)
│ ├── meta/ # 角色依赖
│ └── defaults/main.yml # 最常用:自定义默认参数
如何使用 Role(实操三步)
创建角色
ansible-galaxy init nginx
编写角色内容
- tasks/main.yml:写安装、配置、启动步骤
- templates:放nginx.conf模板
- handlers:定义重启nginx
在主 playbook 调用角色
# site.yml
- hosts: web
roles:
- nginx
- mysql
- redis
传参覆盖默认变量
roles:
- role: nginx
vars:
nginx_port: 8080
nginx_user: www
变量优先级(必背)
命令行变量 > 主机清单变量 > playbook变量 > roles/vars > roles/defaults
使用场景
- 批量统一部署 Nginx、MySQL、Redis、Java 环境
- 多环境(开发/测试/生产)统一初始化
- 企业批量服务器初始化、运维标准化
- 上传至 Ansible Galaxy 公共角色直接使用
一句话面试总结
Ansible Role 是标准化封装的部署模块,通过固定目录拆分任务、配置、变量,实现运维代码复用与批量统一部署,大幅简化批量服务器运维工作。
常用命令
# 创建角色
ansible-galaxy init 角色名
# 下载公共角色
ansible-galaxy install 角色名
# 执行调用角色剧本
ansible-playbook site.yml
105. 你如何通过 Docker 卷确保数据持久性?
使用 Docker 卷将数据持久化在容器外部:
-
命名卷:创建可以在容器之间共享的命名卷。
-
数据卷:将数据卷从主机机器挂载到容器中。
-
绑定挂载:将目录从主机机器挂载到容器中。
容器删除默认丢失内部数据,使用Docker Volume 数据卷,把容器内目录挂载到宿主机真实磁盘,数据脱离容器独立存储,删容器数据不丢。
三种持久化方式
- 匿名卷(自动创建)
docker run -v /容器内路径 镜像名
Docker 自动管理存放路径,自动持久化。
- 命名卷(最常用、推荐)
docker run -v nginx_data:/usr/share/nginx/html nginx
卷名自定义,方便复用、备份、迁移,优先使用。
- 绑定挂载(绑定宿主机指定目录)
docker run -v /宿主机目录:/容器内目录 nginx
直接映射本地文件夹,灵活但权限问题多。
实操保证持久化步骤
- 启动容器时 -v 挂载数据目录
- 业务数据全部存入挂载目录,不存容器临时目录
- 停止/删除容器,卷数据依然保留
- 新容器直接挂载同一个卷,恢复原有数据
- 定期对数据卷备份,防止磁盘损坏
关键特点
- 数据卷独立于容器生命周期
- 支持多容器共享同一个卷
- 不受容器删除、重建影响
- 适合数据库、日志、配置、业务文件持久化
面试一句话总结
通过 -v 挂载 Docker 数据卷,将容器内数据目录映射到宿主机磁盘,让数据脱离容器独立存储,删除容器不会丢失数据,以此实现容器数据持久化。
106. Docker 和 Kubernetes 之间的主要区别是什么?
范围:Docker 专注于容器化,而 Kubernetes 专注于容器编排。
管理:Docker 管理单个容器,而 Kubernetes 管理容器集群。
可扩展性:Kubernetes 提供了用于扩展和管理大规模部署的高级功能。
网络:Kubernetes 为容器通信提供了更复杂的网络功能。
107. 你如何在 GitHub 中安全地存储凭据?
你可以使用以下方式在 GitHub 中安全地存储凭据:
-
GitHub Secrets:使用 GitHub Secrets 安全地存储敏感信息。
-
环境变量:在你的 GitHub 工作流中设置环境变量以访问凭据。
-
GitHub Actions:使用 GitHub Actions 管理凭据并在你的工作流中访问它们。
108. Jenkinsfile 通常存储在哪里?
Jenkinsfile 通常存储在你的 Git 仓库的根目录中。
109. 你如何在 Python 脚本中执行 shell 脚本?
使用 subprocess 模块:
import subprocess
subprocess.run(["/path/to/script.sh"])
110. 你如何与 Jenkins 服务器和 Kubernetes 集群通信?
你可以使用以下方式与 Jenkins 服务器和 Kubernetes 集群通信:
Jenkins 插件:使用像 Kubernetes 插件这样的 Jenkins 插件来与 Kubernetes 集群交互。
API 调用:使用 Kubernetes API 以编程方式与集群交互。
kubectl:从 Jenkins 内部使用 kubectl 命令来管理 Kubernetes 资源。
111. 在 Kubernetes 中,你只更新 Docker 镜像吗?还是也更新副本数量、存储级别和 CPU 分配?
你可以更新各种 Kubernetes 资源,包括:
-
Docker 镜像:更新部署所使用的容器镜像。
-
副本数量:向上或向下扩展部署的副本数量。
-
存储级别:调整持久卷的存储容量。
-
CPU 分配:修改容器的 CPU 和内存资源请求和限制。
112. 你可以在 Jenkins 流水线中定义环境变量吗?
是的,你可以在 Jenkins 流水线中定义环境变量,使用:
-
流水线脚本:在你的 Jenkinsfile 中使用 environment 指令来定义环境变量。
-
全局变量:在 Jenkins 设置中配置全局环境变量。
-
凭据:将敏感信息存储为凭据并在流水线内访问它们。
113. 工件在 Jenkins 中的作用是什么,为什么我们需要将它们推送到 Nexus 而不是在本地构建和存储它们?
工件是构建过程的输出,例如编译的代码、容器镜像或测试报告。 将工件推送到 Nexus(一个仓库管理器)提供了:
-
版本控制:跟踪不同版本的工件。
-
依赖管理:管理项目之间的依赖关系。
-
安全性:控制对工件的访问并确保其完整性。
114. 如果你正在开发一个基于 Python 的应用,你如何分离本地部署所需的包,以避免干扰全局安装的包?
使用虚拟环境:
创建虚拟环境:使用 python -m venv <环境名称> 创建一个虚拟环境。
激活环境:使用 source <环境名称>/bin/activate 激活环境。
安装包:使用 pip install <包名> 安装特定于项目的包。
115. 在 Terraform 中导入 VPC 之前有哪些先决条件?
在导入 VPC 之前,你需要:
Terraform 配置:一个 Terraform 配置文件,定义了你想要导入的 VPC 资源。
资源 ID:VPC 在 AWS 中的唯一标识符 (ID)。
资源类型:正确的 Terraform 资源类型(例如,aws_vpc)。
116. 如果一个 S3 桶是通过 Terraform 创建的,但有人手动为其添加了策略,你如何使用 IaC 处理这种情况?
你可以使用 Terraform 的 terraform plan 命令来检测 S3 桶当前状态与你的 IaC 配置之间的差异。这将突出显示手动添加的策略。然后你可以:
更新 IaC:修改你的 Terraform 配置以包含手动添加的策略,确保一致性。
忽略:如果策略是可接受的,使用 Terraform 中的 ignore_changes 选项将其从未来的计划中排除。 [文件内容结束]
SRE part
1 Prometheus工作原理详解:运维监控的“智能保安队长”
在中高级运维工程师的面试场景中,Prometheus的工作原理是高频考点。这款被运维人员称为“免费上班助手”的监控工具,凭借其高效的数据采集、存储与告警能力,成为Linux运维、IT架构监控领域的核心工具。本文将结合通俗类比与技术细节,拆解Prometheus的完整工作流程,帮你轻松掌握面试核心考点与实际应用逻辑。
核心定位:为什么说Prometheus是“保安队长”?
Prometheus的核心价值是自动化监控系统与服务状态,无需人工实时盯守,就能完成数据收集、异常识别与告警通知。如果把IT系统比作一个大型园区,Prometheus就像一位全能保安队长,通过“线人布控、定期查岗、账本记录、异常报警”的全流程,确保园区(系统)的稳定运行。
其核心优势在于:
- 主动采集:无需被监控对象推送数据,主动拉取减少依赖;
- 动态适配:支持服务发现,适配K8S等动态环境;
- 轻量化存储:时序数据库+数据压缩,兼顾性能与成本;
- 灵活查询:自定义PromQL语法,精准提取所需数据;
- 可视化联动:与Grafana无缝集成,数据呈现更直观。
工作原理全拆解:四步实现全链路监控
Prometheus的工作流程可拆解为“数据采集-数据存储-查询分析-异常告警”四大核心步骤,每个环节都对应明确的技术实现逻辑:
第一步:数据采集——“线人布控+中转站兜底”
Prometheus本身不直接监控硬件或应用,而是依赖“线人”(Exporter)和“中转站”(Pushgateway)获取数据,确保采集无死角。
1. 专职线人:Exporter
Exporter是部署在被监控对象(服务器、数据库、容器等)上的“数据采集代理”,不同类型的监控目标对应专属Exporter:
- 监控服务器CPU、内存:使用Node Exporter;
- 监控MySQL数据库:使用MySQL Exporter;
- 监控Redis缓存:使用Redis Exporter。
这些Exporter会持续“蹲点”收集指定指标(如CPU使用率、内存剩余量、数据库连接数),并通过固定端口(默认如9100端口)暴露数据接口,等待Prometheus主动获取。
2. 中转站:Pushgateway
针对一次性批处理任务等“临时干活的程序”——这类任务执行完毕后会立即退出,无法等待Prometheus来拉取数据,Pushgateway就起到了“临时存储中转站”的作用:
- 临时任务执行完成后,主动将数据推送到Pushgateway;
- Prometheus定期从Pushgateway拉取这些临时数据,避免监控遗漏。
3. 动态适配:服务发现
在K8S等动态环境中,服务器、容器会随时新增或下线,手动配置监控目标显然不现实。Prometheus支持服务发现功能,能自动识别环境中新增的“线人”(Exporter),无需人工干预即可完成监控范围扩展。
第二步:数据存储——“时序账本+智能压缩”
Prometheus将拉取到的所有监控数据,按照时间序列(以时间为轴记录指标变化)的格式存储在自带的时序数据库中,就像保安队长用“专属账本”记录每一次查岗结果:
1. 存储特性
- 时序化存储:每个数据点包含“指标名称+标签+时间戳+数值”,标签可标注数据归属(如“服务器A”“应用B”),方便后续精准查询;
- 自动压缩:默认对重复、冗余数据进行压缩处理,节省存储空间;
- 存储周期:默认保留15天数据,若需长期存储,可外接MinIO、S3等第三方存储工具扩展。
2. 核心设计:标签化管理
标签(Labels)是Prometheus存储的核心设计,例如监控服务器CPU使用率的指标可能为:
cpu_usage{host="server-01", region="north"} 45.2
通过标签可快速筛选不同服务器、不同区域的监控数据,为后续查询提供灵活性。
第三步:查询分析——“PromQL口令精准查账”
存储在数据库中的数据,需要通过查询语法提取有价值的信息。Prometheus提供了专属查询语言PromQL,相当于“查账口令”,支持自定义条件查询任意时间段、任意维度的监控数据:
常用查询场景示例
- 查询服务器A最近5分钟的CPU使用率:
cpu_usage{host="server-01"}[5m]; - 查询所有MySQL数据库的连接数:
mysql_connections{job="mysql"}; - 计算某应用的平均响应时间:
avg(http_request_duration_seconds{app="web-api"})。
PromQL的灵活性在于支持聚合运算、条件过滤、时间范围限定等复杂操作,满足运维人员的多样化查询需求。
第四步:异常告警——“规则预设+多渠道通知”
监控的核心目的是及时发现异常,Prometheus通过“预设规则+告警转发”实现自动化告警:
1. 告警规则配置
运维人员可自定义告警阈值,例如:
- CPU使用率超过50%,持续2分钟触发告警;
- 数据库连接数超过1000,立即触发告警;
- 服务响应时间超过3秒,持续1分钟触发告警。
这些规则会被Prometheus持续校验,一旦监控数据满足告警条件,就会触发告警流程。
2. 告警通知转发
Prometheus本身不直接发送邮件、钉钉等通知,而是通过“告警小弟”——Alertmanager(需单独部署)完成通知转发:
- Prometheus触发告警后,将告警信息发送给Alertmanager;
- Alertmanager根据配置的渠道(邮件、钉钉、企业微信等),将告警内容推送给相关运维人员,确保及时响应。
可视化增强:Grafana让数据“一眼看懂”
Prometheus存储的原始数据以数字形式呈现,不够直观。在实际运维中,通常会搭配Grafana这款可视化工具,将Prometheus的数据转化为折线图、仪表盘、柱状图等可视化图表:
- 服务器CPU、内存使用率趋势一目了然;
- 应用请求量、错误率实时监控面板;
- 数据库性能指标多维度对比图。
通过Grafana的拖拽式配置,可快速搭建专属监控大屏,让运维人员无需分析原始数据,就能直观判断系统运行状态。
四、核心流程总结
Prometheus的工作原理可概括为“四步闭环”:
- 布控:通过Exporter采集常驻服务数据,Pushgateway兜底临时任务数据;
- 拉取:Prometheus定时(默认15秒)拉取数据,支持服务发现适配动态环境;
- 存储:时序数据库+标签化管理,压缩存储节省空间;
- 应用:PromQL查询分析,告警规则触发异常通知,Grafana可视化呈现。
2 Ansible核心原理与面试指南:运维自动化的“瑞士军刀”
在Linux运维、IT架构自动化的面试场景中,“Ansible是什么”“Ansible核心原理”是高频必考题。这款被运维工程师称为“自动化神器”的工具,凭借无代理部署、简洁易用、跨平台兼容的特性,成为企业级自动化运维的首选方案。
一、Ansible核心定义:不止是“命令执行工具”
Ansible是一款基于Python开发的自动化运维工具,核心定位是“通过简单配置实现批量任务执行与设备管理”。
它无需在被管理节点安装代理程序(Agentless),仅通过SSH协议(或WinRM协议用于Windows节点)实现远程通信,支持自动化部署、配置管理、任务编排、应用发布等全流程运维操作。
与传统运维工具(如Shell脚本、Chef、Puppet)相比,Ansible的核心差异在于:
- 无代理架构:无需在目标主机部署客户端,降低部署与维护成本;
- 声明式语法:通过YAML格式的Playbook定义“目标状态”,而非“执行步骤”,简化配置编写;
- 模块化设计:内置数千个核心模块,支持灵活扩展,适配不同厂商设备与业务场景;
- 跨平台兼容:支持Linux、Windows、Unix等操作系统,以及网络设备(Cisco、华为)、云平台(AWS、阿里云)等异构环境。
简单来说,Ansible就像运维工程师的“瑞士军刀”——小巧轻便、功能全面,能快速解决批量管理、自动化部署等运维痛点。
二、核心工作原理:从“指令”到“执行”的全流程
Ansible的工作流程可拆解为“Inventory定义→Playbook编写→模块执行→结果反馈”四大环节,核心依赖“控制节点→被管理节点”的星型架构:
1. 核心组件:分工明确的“自动化团队”
Ansible的功能实现依赖五大核心组件,各司其职完成自动化流程:
- 控制节点(Control Node):执行Ansible命令或Playbook的主机(通常是运维人员的工作机),需安装Ansible核心程序;
- 被管理节点(Managed Nodes):需要被自动化管理的目标主机(服务器、网络设备等),无需安装Ansible,仅需开启SSH服务;
- Inventory(资产清单):定义被管理节点的配置文件,记录主机IP、端口、用户名、密码(或密钥)等信息,支持分组管理(如按业务线、机房划分);
- Playbook(剧本):YAML格式的配置文件,定义“要做什么”“在哪些主机做”“按什么顺序做”,是Ansible自动化的核心载体;
- 模块(Modules):Ansible的“功能原子”,每个模块对应一项具体操作(如文件创建、软件安装、服务启停),Playbook通过调用模块实现任务执行。
2. 执行流程:三步实现自动化任务
以“批量安装Nginx服务”为例,Ansible的执行逻辑如下:
- 准备阶段:运维人员在控制节点编写Inventory(指定目标主机组)和Playbook(定义“安装Nginx→启动服务→设置开机自启”的目标状态);
- 通信阶段:Ansible通过Inventory中的配置,基于SSH协议与所有被管理节点建立连接,无需人工干预;
- 执行阶段:控制节点按Playbook顺序调用对应模块(如
yum模块安装软件、service模块启动服务),在被管理节点执行操作,执行结果实时反馈至控制节点。
核心逻辑:Ansible采用“推送式执行”,控制节点主动将任务指令推送至被管理节点,无需目标主机主动拉取,确保执行效率与一致性。
三、Ansible核心优势:为什么成为运维首选?
在面试中,“Ansible的优势”是高频延伸问题,核心可总结为四点:
1. 无代理架构:降低运维成本
无需在被管理节点安装Agent,避免了代理程序的部署、升级、故障排查等额外工作,尤其适合大规模集群或异构环境管理。例如,管理100台服务器时,无需逐台部署客户端,仅需确保SSH服务正常即可。
2. 简单易用:降低学习门槛
- 语法简洁:Playbook采用YAML格式,结构清晰,非专业开发人员也能快速上手;
- 命令丰富:支持
ansible(单条命令执行)、ansible-playbook(批量任务编排)、ansible-vault(敏感信息加密)等命令,覆盖不同场景; - 内置模块:提供
file(文件管理)、package(软件安装)、copy(文件复制)、user(用户管理)等常用模块,无需重复编写脚本。
示例:通过单条命令批量查看目标主机磁盘使用情况:
ansible web-server -m command -a "df -h"
(web-server是Inventory中定义的主机组,command是模块名,df -h是执行命令)
3. 强大的编排能力:支持复杂任务自动化
通过Playbook可实现多步骤、跨主机的任务编排,例如“先在数据库服务器部署MySQL,再在应用服务器部署Tomcat,最后配置负载均衡”。Playbook支持条件判断、循环、变量引用、模板渲染等高级功能,满足复杂业务场景的自动化需求。
示例Playbook(简化版):
- name: 批量安装并启动Nginx
hosts: web-server # 目标主机组
remote_user: root # 远程登录用户
tasks:
- name: 安装Nginx
yum: name=nginx state=present # 调用yum模块安装软件
- name: 启动Nginx服务
service: name=nginx state=started enabled=yes # 启动并设置开机自启
4. 高扩展性与兼容性:适配全场景运维
- 模块扩展:支持自定义Python模块,适配企业私有业务系统(如自研运维平台、监控工具);
- 生态丰富:与Jenkins、GitLab、Prometheus等工具无缝集成,构建“代码管理→自动化部署→监控告警”的DevOps闭环;
- 跨平台支持:不仅能管理服务器,还能对接网络设备、云平台、容器(Docker、K8s),实现全栈自动化。
四、典型应用场景:Ansible能解决哪些运维痛点?
在实际工作中,Ansible的应用场景覆盖运维全流程,尤其适合解决以下核心问题:
1. 配置管理:批量标准化主机配置
通过Playbook定义主机的标准配置(如防火墙规则、用户权限、软件版本),确保所有被管理节点的配置一致性,避免“人为操作导致的配置漂移”。例如,批量关闭所有服务器的无用端口、统一配置SSH登录密钥。
2. 应用部署:自动化发布与回滚
支持从代码拉取、编译打包、部署启动到回滚的全流程自动化。例如,通过Playbook实现Java应用的“Git拉取代码→Maven编译→Tomcat部署→服务重启”,减少人工操作失误,提升发布效率。
3. 批量任务执行:替代重复的Shell脚本
批量执行命令或脚本,如批量更新系统补丁、批量备份日志文件、批量创建用户。相比Shell脚本,Ansible支持并发执行、结果统一反馈,且无需处理SSH连接细节。
4. 基础设施即代码(IaC):运维配置版本化
将运维配置(Playbook、Inventory、变量文件)纳入Git等版本控制系统,实现“配置即代码”。支持配置回溯、多人协作、环境一致性保障(开发环境、测试环境、生产环境配置统一)。
5. 云与容器管理:跨平台自动化
对接AWS、阿里云等云平台的API,实现云资源(EC2实例、云服务器、负载均衡)的自动化创建与配置;支持Docker容器的启停、镜像拉取、容器编排,以及Kubernetes集群的资源管理。
五、面试高频考点总结:核心知识点速记
- Ansible核心特性:无代理(Agentless)、声明式语法、模块化、跨平台、支持IaC;
- 工作原理:控制节点通过SSH协议与被管理节点通信,基于Playbook调用模块执行任务;
- 核心组件:控制节点、被管理节点、Inventory、Playbook、模块;
- Playbook核心元素:
hosts(目标主机)、tasks(任务列表)、modules(模块)、variables(变量)、templates(模板); - 与其他工具的区别:对比Chef/Puppet(需代理)、Shell脚本(过程式语法、无模块化);
- 安全机制:支持SSH密钥认证、
ansible-vault加密敏感信息(密码、API密钥)、权限控制(最小权限原则配置远程用户)。
3 Ansible vs Terraform 最全对比(面试必背)
核心定位(一句话分清)
-
Terraform:基础设施即代码 IAC 管云资源:创建ECS、虚拟机、数据库、网络、负载均衡、VPC
-
Ansible:配置管理/应用部署 管系统内部:装软件、改配置、启动服务、部署项目
核心区别
| 对比项 | Terraform | Ansible |
|---|---|---|
| 领域 | 云上资源编排 | 服务器配置运维 |
| 作用 | 建机器、搭网络、开通云服务 | 初始化系统、部署软件、上线业务 |
| 语言 | HCL 声明式 | YAML 过程式 |
| 执行模式 | 状态比对,只改差异 | 顺序执行任务,无脑跑流程 |
| 有无状态 | 有State状态文件 | 无状态,无记录 |
| 依赖代理 | 无需客户端,API调用 | 依赖SSH连通,无需装Agent |
| 销毁能力 | 支持destroy一键销毁所有资源 |
只部署,不批量销毁机器 |
| 幂等性 | 极强 | 也支持,偏弱 |
| 擅长 | 跨多云统一管理资源 | 批量服务器运维、应用发布 |
工作流程差异
Terraform 流程
- 编写HCL定义需要哪些云资源
init初始化plan比对云端与本地状态apply创建/修改资源destroy销毁资源
Ansible 流程
- 编写playbook写执行步骤
- 配置主机清单
- 直接执行剧本,批量执行命令/安装/改配置
使用场景
Terraform 适用
- 跨阿里云/华为云/私有云统一搭建环境
- 批量创建虚拟机、K8s集群、中间件云服务
- 环境一键重建、一键销毁
- 标准化机房/测试环境快速搭建
Ansible 适用
- 服务器系统初始化(关闭防火墙、优化内核)
- 批量安装Nginx、MySQL、JDK
- 推送配置文件、重启服务
- 项目打包发布、灰度上线
企业最佳组合(主流架构)
Terraform 搭架子 → Ansible 填内容
- Terraform 批量拉出一批云服务器、打通网络
- Ansible 登录机器做初始化、装环境、部署业务
- 完美完成从0到业务上线全流程
优缺点
Terraform
- 优点:跨云强、状态管理、环境一致性高
- 缺点:不能做精细系统配置,不会装软件
Ansible
- 优点:上手快、运维能力强、部署灵活
- 缺点:不能创建云主机,无资源状态管理
Terraform用来创建管理云上所有基础设施资源,Ansible用来对已有服务器做系统配置与应用部署;生产环境二者搭配使用,先建资源再部署业务。
3 正向代理vs反向代理:面试必懂的核心区别与技术原理
在Linux运维、IT架构面试中,“正向代理与反向代理的区别”是高频核心考点。这两种代理技术作为网络架构的“流量中转站”,广泛应用于访问控制、负载均衡、安全防护等场景。
一、先搞懂:代理的本质是“流量中转站”
无论是正向代理还是反向代理,核心作用都是转发网络请求,充当客户端与目标服务器之间的“中间人”。
但二者的“服务对象”“部署位置”“核心目标”完全不同,这也是面试考察的核心切入点。
简单类比:
- 正向代理:像“出国中介”——帮客户端(个人)对接目标服务器(国外网站),服务器不知道真实客户端是谁;
- 反向代理:像“公司前台”——帮服务器(公司内部服务)对接客户端(访客),客户端不知道真实服务器是谁。
二、正向代理:为客户端服务的“隐形跳板”
1. 核心定义
正向代理(Forward Proxy)是部署在客户端一侧的代理服务器,代表客户端向目标服务器发起请求。
目标服务器仅能感知到代理服务器的存在,无法获取真实客户端的IP、端口等信息。
2. 工作原理
以“客户端通过正向代理访问国外网站”为例,流程如下:
- 客户端配置正向代理服务器地址(如在浏览器、系统中设置代理IP和端口);
- 客户端向目标服务器(如国外网站)发起请求,该请求先被转发至正向代理;
- 正向代理验证请求合法性后,代替客户端向目标服务器发送请求;
- 目标服务器处理请求后,将响应结果返回给正向代理;
- 正向代理将响应转发给客户端,完成整个通信流程。
3. 典型应用场景
- 突破网络限制:访问受地域、政策限制的网站(如跨国企业员工访问海外办公系统);
- 隐藏客户端身份:保护客户端IP不被目标服务器获取,提升隐私安全;
- 缓存加速:代理服务器缓存常用资源(如静态页面、图片),后续同类请求可直接返回缓存结果,减少网络延迟;
- 访问控制:企业内网通过正向代理限制员工访问违规网站,统一管控网络行为。
4. 核心特征
- 服务对象:客户端(个人、内网设备);
- 部署位置:客户端一侧(如企业内网出口、个人电脑);
- 客户端感知:客户端需手动配置代理信息(IP、端口),明确知道代理的存在;
- 服务器感知:目标服务器仅能看到代理服务器的IP,无法识别真实客户端。
三、反向代理:为服务器服务的“智能网关”
1. 核心定义
反向代理(Reverse Proxy)是部署在服务器一侧的代理服务器,代表服务器接收客户端的请求,并将请求转发至后端真实的业务服务器。客户端仅能感知到代理服务器的存在,无法获取真实业务服务器的IP、端口等信息。
2. 工作原理
以“用户通过反向代理访问电商网站”为例,流程如下:
- 电商网站将反向代理服务器暴露在公网(如域名解析至代理IP),真实业务服务器(商品服务、订单服务、支付服务)部署在内网;
- 用户(客户端)通过域名发起访问请求,请求直接到达反向代理服务器;
- 反向代理服务器根据预设规则(如负载均衡算法、路径匹配),将请求转发至后端对应的业务服务器;
- 业务服务器处理请求后,将响应结果返回给反向代理;
- 反向代理将响应转发给用户,完成整个通信流程。
3. 典型应用场景
- 负载均衡:将海量客户端请求分发至后端多台业务服务器,避免单台服务器过载,提升系统可用性(如Nginx、HAProxy的核心功能);
- 隐藏服务器身份:保护后端业务服务器不直接暴露在公网,减少黑客攻击风险(如SQL注入、DDoS攻击);
- 缓存加速:代理服务器缓存静态资源(如首页、商品图片),无需转发至后端服务器即可返回结果,降低后端压力;
- 统一入口:多台后端服务器(如不同业务模块)通过反向代理提供统一的访问域名,简化客户端访问逻辑,同时便于统一配置SSL证书、防盗链等。
4. 核心特征
- 服务对象:服务器(后端业务集群);
- 部署位置:服务器一侧(如公网与内网之间的网关层);
- 客户端感知:客户端无需配置代理,仅需访问代理服务器的域名/IP,不知道真实后端服务器的存在;
- 服务器感知:后端服务器仅能看到代理服务器的IP,无法识别真实客户端。
四、核心区别:一张表搞定面试考点
| 对比维度 | 正向代理 | 反向代理 |
|---|---|---|
| 服务对象 | 客户端(个人/内网设备) | 服务器(后端业务集群) |
| 部署位置 | 客户端一侧(靠近客户端) | 服务器一侧(靠近服务器) |
| 客户端配置 | 需手动配置代理信息(IP/端口) | 无需配置,直接访问代理域名/IP |
| 隐藏对象 | 隐藏真实客户端IP(服务器不可见) | 隐藏真实服务器IP(客户端不可见) |
| 核心目标 | 突破访问限制、保护客户端隐私、缓存加速 | 负载均衡、保护服务器安全、统一入口 |
| 典型工具 | Shadowsocks、Squid、Privoxy | Nginx、HAProxy、Apache |
| 应用场景 | 跨国访问、企业内网访问控制、个人隐私保护 | 电商网站、APP后端、大型系统集群部署 |
五、面试易错点:这些坑一定要避开
- 混淆“服务对象”:记住核心口诀——“正向代客,反向代服”(正向代理服务客户端,反向代理服务服务器);
- 误解“部署位置”:正向代理靠近客户端(如内网出口),反向代理靠近服务器(如公网网关),位置不同决定了其核心作用差异;
- 忽略“客户端感知”:正向代理需要客户端手动配置,反向代理对客户端透明,这是快速区分二者的关键特征;
- 混淆工具用途:Nginx是反向代理的典型工具,而非正向代理;Squid、Shadowsocks是正向代理工具,不适合做负载均衡。
六、实际架构案例:更直观理解应用场景
1. 正向代理案例:企业内网访问控制
某公司为管控员工网络行为,在企业内网出口部署Squid正向代理服务器:
- 员工电脑需配置代理IP和端口,所有外网请求必须经过Squid;
- Squid根据企业策略,拦截违规网站(如游戏、视频网站)访问请求;
- 缓存常用办公资源(如行业文档、软件安装包),提升访问速度。
2. 反向代理案例:电商网站负载均衡
某电商平台使用Nginx作为反向代理服务器:
- 公网域名解析至Nginx服务器IP,用户访问域名时直接对接Nginx;
- Nginx通过轮询算法,将用户请求分发至后端3台商品服务服务器;
- 缓存首页静态资源(图片、CSS、JS),高峰期减少后端服务器压力;
- 当某台后端服务器故障时,Nginx自动将请求转发至其他正常服务器,保障服务可用性。
4 Linux三剑客实战指南:面试必懂的文本处理神器
在Linux运维、后端开发面试中,“Linux三剑客(grep、sed、awk)”是高频考点,更是日常工作中文本处理的“效率利器”。这三款工具分别聚焦“查找匹配”“流式编辑”“格式化处理”,搭配使用可解决90%以上的文本处理需求。本文将从核心原理、实战用法、面试考点三个维度,拆解三剑客的技术逻辑,帮你既能轻松应对面试,又能快速提升工作效率。
一、三剑客核心定位:各司其职的文本处理组合
Linux三剑客并非单一工具,而是功能互补的“黄金组合”,各自聚焦文本处理的不同环节:
- grep:文本查找的“探测器”——核心功能是按模式匹配筛选文本行,快速定位目标信息;
- sed:文本编辑的“手术刀”——核心功能是流式替换、删除、插入文本,无需打开文件即可批量修改;
- awk:文本分析的“计算器”——核心功能是按字段分割文本、执行格式化输出与逻辑计算,擅长处理结构化数据。
简单类比:处理日志文件时,grep负责“找出包含错误信息的行”,sed负责“替换行中的敏感数据”,awk负责“统计错误出现的次数与时间分布”,三者协同可高效完成复杂文本处理任务。
二、grep:精准查找的“文本探测器”
1. 核心定义与原理
grep(Global Regular Expression Print)是基于正则表达式的文本查找工具,核心作用是“在文件或输入流中匹配符合模式的文本行,并输出结果”。它支持基本正则(BRE)、扩展正则(ERE),可快速从海量文本中筛选目标信息。
2. 高频实战用法(面试必考)
- 基础匹配:查找文件中包含“error”的所有行
bash
grep "error" app.log # 精准匹配字符串
grep -i "error" app.log # -i:忽略大小写
grep -n "error" app.log # -n:显示匹配行号
- 正则匹配:查找以“ERROR”开头、以“[0-9]”结尾的行
bash
grep "^ERROR.*[0-9]$" app.log # ^匹配行首,$匹配行尾,.*匹配任意字符
grep -E "ERROR|WARN" app.log # -E:支持扩展正则,|表示“或”
- 递归查找:在目录下所有.log文件中查找“Timeout”
bash
grep -r --include="*.log" "Timeout" /var/log/ # -r:递归查找,--include指定文件类型
- 反向匹配:查找不包含“success”的行
bash
grep -v "success" app.log # -v:反向匹配
3. 核心优势与应用场景
- 优势:查找速度快、支持正则、用法简洁,无需加载整个文件到内存,适合处理大日志;
- 场景:日志排查(查找错误信息)、配置文件筛选(提取关键参数)、批量文件内容检索。
三、sed:流式编辑的“文本手术刀”
1. 核心定义与原理
sed(Stream Editor)是流式文本编辑工具,核心作用是“按规则修改文本流中的内容”。它逐行读取文本,按预设命令处理后输出,无需打开文件即可实现批量替换、删除、插入等操作,修改过程不直接改动原文件(除非指定 -i 参数)。
2. 高频实战用法(面试必考)
- 文本替换:将文件中所有“old”替换为“new”
bash
sed 's/old/new/' app.log # 只替换每行第一个匹配项
sed 's/old/new/g' app.log # g:全局替换(每行所有匹配项)
sed -i 's/old/new/g' app.log # -i:直接修改原文件(谨慎使用)
- 删除行:删除包含“test”的行,或删除第3-5行
bash
sed '/test/d' app.log # /pattern/d:删除匹配模式的行
sed '3,5d' app.log # 3,5d:删除第3至5行
- 插入行:在第2行前插入“Start”,在最后一行后追加“End”
bash
sed '2i Start' app.log # 行号i:在指定行前插入
sed '$a End' app.log # $a:在最后一行后追加
- 正则替换:将“2024-xx-xx”格式日期替换为“YYYY-MM-DD”
bash
sed 's/2024-\([0-9]\{2\}\)-\([0-9]\{2\}\)/YYYY-\1-MM/' app.log
3. 核心优势与应用场景
- 优势:流式处理、支持批量修改、不依赖文本编辑器,适合自动化脚本;
- 场景:配置文件批量更新(替换服务器地址)、日志格式化(清理敏感数据)、文本内容批量修正。
四、awk:结构化分析的“文本计算器”
1. 核心定义与原理
awk是处理结构化文本的强大工具,核心优势是“按字段分割文本”。它默认以空格/制表符为分隔符,将每行文本拆分为多个字段($1表示第一个字段,$2表示第二个字段,$0表示整行),支持逻辑判断、循环、计算等复杂操作,擅长数据统计与格式化输出。
2. 高频实战用法(面试必考)
- 字段提取:提取日志中第1个字段(时间)和第3个字段(状态)
bash
awk '{print $1, $3}' app.log # print输出指定字段,空格分隔
- 条件筛选:提取状态为“ERROR”且第4个字段(耗时)大于100的行
bash
awk '$3 == "ERROR" && $4 > 100 {print $0}' app.log # 条件表达式+动作
- 数据统计:统计不同状态(第3字段)出现的次数
bash
awk '{count[$3]++} END {for (status in count) print status, count[status]}' app.log
# count[$3]++:以状态为键累加计数,END表示处理完所有行后执行
- 自定义分隔符:以“,”为分隔符,提取CSV文件中第2列(姓名)和第5列(电话)
bash
awk -F ',' '{print $2, $5}' user.csv # -F:指定分隔符
3. 核心优势与应用场景
- 优势:字段处理能力强、支持复杂逻辑与计算、格式化输出灵活;
- 场景:日志统计分析(错误次数、耗时分布)、CSV数据处理、系统信息提取(如
df -h | awk '{print $1, $5}'查看磁盘使用率)。
五、三剑客核心区别与协同用法
1. 核心区别(面试高频考点)
| 工具 | 核心功能 | 适用场景 | 核心优势 | 关键特性 |
|---|---|---|---|---|
| grep | 文本查找匹配 | 筛选目标行 | 速度快、支持正则 | 只筛选不修改 |
| sed | 流式文本编辑 | 批量替换/删除/插入 | 无交互、批量处理 | 按行修改文本 |
| awk | 结构化分析计算 | 字段提取/统计 | 支持逻辑与计算 | 按字段处理文本 |
2. 协同用法:组合解决复杂问题
实际工作中,三剑客常搭配使用,发挥1+1+2的效果:
- 案例1:查找app.log中包含“ERROR”的行,删除空行,提取时间与错误信息并保存
bash
grep "ERROR" app.log | sed '/^$/d' | awk '{print $1, $0}' > error_summary.log
- 案例2:统计近24小时内,耗时超过500ms的接口调用次数(日志中第5字段为接口名,第6字段为耗时)
bash
grep "$(date -d '24 hours ago' +'%Y-%m-%d')" app.log | awk '$6 > 500 {count[$5]++} END {for (api in count) print api, count[api]}'
六、面试高频考点总结
- 核心定位:记住“grep查、sed改、awk算”,快速明确工具用途;
- 关键参数:grep的
-i(忽略大小写)、-r(递归)、-E(扩展正则);sed的s/old/new/g(全局替换)、-i(修改原文件);awk的-F(自定义分隔符)、END(结束动作); - 正则应用:掌握基础正则(
^$行首行尾、.*任意字符、[0-9]数字),是三剑客进阶的核心; - 协同场景:能举例说明三剑客搭配用法(如“grep筛选+awk统计”“sed修改+grep验证”);
- 避坑要点:sed
-i参数直接修改原文件,建议先备份;awk字段分隔符默认是空格,处理CSV需指定-F ','。
5 运维面试必懂:系统安全核心工具清单与实战指南
运维安全,我们到底在防什么?
运维安全三大方向:
网络安全、主机安全、应用安全
目标:保障系统“可用性、完整性、机密性”
思维:从外到内,层层设防
第一道防线:网络安全
- 安全隐患:端口扫描、DDoS攻击、未授权访问
- 核心影响:服务中断、数据泄露入口经
经典工具/技术:
- 防火墙(iptables/firewalld):访问控制
- Nginx:反向代理与Web应用防火墙(WAF)
- VPN / SSH:安全通道
第二道防线:主机安全
- 安全隐患:弱口令、权限滥用、系统漏洞、恶意脚本核
- 核心影响:服务器被控制、成为攻击跳板、数据被窃
经典工具/技术:
- SSH密钥登录:告别弱口令
- Auditd / 日志审计:记录所有操作
- ClamAV / 杀毒软件:查杀木马病毒
- Fail2ban:自动封禁异常IP
第三道防线:应用安全
- 安全隐患:SQL注入、跨站脚本(XSS)、代码漏洞
- 核心影响:数据库被拖库、用户信息泄露、页面被篡改
- 经典工具/技术: Nginx(WAF模块):拦截常见Web攻击
- 漏洞扫描器(Nessus/OpenVAS):主动发现弱点安全编码规范:从源头杜绝问题
- 容器安全扫描(Clair/Trivy):保障供应链安全
在Linux运维面试中,“维护系统安全会用到哪些工具”是考察运维工程师安全防护能力的核心考题。系统安全防护覆盖“漏洞扫描、入侵检测、权限管控、日志审计”等全流程,选择合适的工具并熟练运用,是保障服务器与业务安全的关键。
一、安全工具分类逻辑:构建“纵深防御”体系
系统安全防护并非依赖单一工具,而是需搭建“多层次、全链路”的防御体系。核心工具可按防护目标分为五大类,覆盖从“主动防护”到“被动检测”的全场景:
- 漏洞扫描工具:主动发现系统与应用的安全隐患;
- 入侵检测/防御工具:实时监控并阻断恶意攻击行为;
- 权限与访问控制工具:管控用户权限,防范越权操作;
- 日志审计与分析工具:追溯安全事件,定位攻击源头;
- 数据安全工具:保障数据传输与存储的保密性、完整性。
简单类比:系统安全防护如同“小区安保”——漏洞扫描是“定期安全检查”,入侵检测是“实时巡逻监控”,权限管控是“门禁管理”,日志审计是“监控录像回溯”,数据安全是“贵重物品加密存储”,多环节协同才能构建稳固的安全防线。
二、核心安全工具详解:实战用法+面试考点
1. 漏洞扫描工具:主动排查安全隐患
核心目标:提前发现系统、软件、配置中的漏洞,避免被黑客利用。
(1)Nessus:企业级漏洞扫描标杆
- 核心功能:支持数千种漏洞检测(如系统漏洞、Web应用漏洞、配置错误),提供漏洞详情与修复建议;
- 实战场景:定期扫描服务器集群,排查未修复的高危漏洞(如Heartbleed、Log4j);
-
面试考点:“Nessus的扫描原理是什么?”——基于插件库(包含漏洞特征、检测脚本),通过端口扫描、服务探测、漏洞验证三步实现漏洞识别;
-
关键用法:
bash
# 启动扫描任务(图形化界面操作为主,命令行辅助)
nessuscli scan start --scan-id 1 # 启动ID为1的扫描任务
nessuscli report get --scan-id 1 --format pdf > 漏洞扫描报告.pdf # 导出扫描报告
(2)OpenVAS:开源免费的漏洞扫描方案
- 核心优势:开源免费、更新及时,适合中小企业或个人运维使用;
- 实战场景:扫描内网服务器,检测操作系统补丁缺失、弱口令、开放端口等问题;
- 面试考点:“Nessus与OpenVAS的区别?”——Nessus功能更全、支持企业级特性(如多用户管理、合规检查),OpenVAS开源免费、轻量化。
2. 入侵检测/防御工具:实时阻断恶意攻击
核心目标:监控网络流量与系统行为,识别恶意攻击(如暴力破解、SQL注入、DDoS)并及时阻断。
(1)Snort:开源网络入侵检测系统(NIDS)
- 核心功能:基于规则匹配监控网络流量,支持实时报警、日志记录,可自定义攻击规则;
- 实战场景:部署在网络网关处,监控外网对服务器的异常访问(如频繁端口扫描、异常数据包);
- 面试考点:“Snort的工作模式有哪些?”——嗅探模式(仅监控)、日志模式(记录流量)、报警模式(触发规则时报警)、防御模式(阻断攻击流量);
- 关键用法:
bash
# 加载默认规则集,监控eth0网卡流量
snort -i eth0 -c /etc/snort/snort.conf
# 自定义规则:阻断来自192.168.1.100的所有TCP连接
echo 'drop tcp 192.168.1.100 any -> any any (msg:"Block malicious IP"; sid:1000001;)' >> /etc/snort/rules/local.rules
(2)Fail2ban:防范暴力破解的“轻量级卫士”
- 核心功能:监控系统日志(如SSH、FTP日志),发现多次登录失败等暴力破解行为时,自动封禁攻击IP;
- 实战场景:保护SSH服务,避免黑客通过暴力破解获取服务器权限;
- 面试考点:“Fail2ban的工作原理?”——通过分析日志文件,匹配预设模式(如SSH登录失败次数),触发后调用iptables封禁IP,支持设置封禁时长;
- 关键配置:
ini
# /etc/fail2ban/jail.local 配置示例
[sshd]
enabled = true # 启用SSH防护
filter = sshd # 引用SSH日志过滤规则
logpath = /var/log/secure # 监控的日志文件
maxretry = 3 # 最大失败次数
bantime = 3600 # 封禁时长(秒)
3. 权限与访问控制工具:筑牢内部安全防线
核心目标:管控用户权限与访问行为,防范内部人员越权操作或账号泄露风险。
(1)sudo:精细化权限管控工具
- 核心功能:允许普通用户在授权范围内执行管理员命令,避免直接使用root账号;
- 实战场景:给运维人员授权“重启Nginx服务”权限,无需开放完整root权限;
- 面试考点:“sudo的配置文件是什么?如何限制用户仅执行特定命令?”——配置文件是
/etc/sudoers,通过
visudo命令编辑,示例配置:
bash
# 允许user1用户执行重启Nginx的命令
user1 ALL=(ALL) /usr/bin/systemctl restart nginx
(2)ACL:文件系统访问控制列表
- 核心功能:突破Linux传统的“所有者-组-其他”权限模型,实现对单个用户/组的精细化文件权限控制;
- 实战场景:允许开发用户访问特定项目目录,但禁止修改核心配置文件;
- 关键用法:
bash
# 给user2授予/data/project目录的读权限
setfacl -m u:user2:r /data/project
# 查看目录的ACL权限
getfacl /data/project
(3)SSH密钥认证:替代密码登录的安全方案
- 核心优势:相比密码登录,更难被暴力破解,是服务器远程访问的首选安全方案;
- 实战场景:禁用SSH密码登录,仅允许通过密钥认证登录服务器;
- 面试考点:“如何配置SSH密钥登录并禁用密码登录?”——步骤:生成密钥对(
ssh-keygen)→ 上传公钥到服务器(ssh-copy-id)→ 编辑/etc/ssh/sshd_config,设置PasswordAuthentication no并重启SSH服务。
4. 日志审计与分析工具:追溯安全事件源头
核心目标:收集、分析系统与应用日志,及时发现安全异常,为安全事件追溯提供依据。
(1)ELK Stack:企业级日志分析平台、
- 核心组件:Elasticsearch(日志存储与检索)、Logstash(日志收集与处理)、Kibana(日志可视化);
- 实战场景:集中收集多台服务器的系统日志、应用日志、安全日志,通过Kibana可视化面板监控异常登录、错误操作等行为;
- 面试考点:“ELK Stack的工作流程?”——Logstash收集日志并格式化→ Elasticsearch存储日志→ Kibana提供查询与可视化分析。
(2)auditd:系统审计守护进程
- 核心功能:监控系统关键文件(如
/etc/passwd、/etc/sudoers)和系统调用,记录文件修改、权限变更等操作; - 实战场景:监控
/etc/passwd文件,一旦有用户添加/删除操作,自动记录操作人、时间、具体变更; - 关键用法:
bash
# 监控/etc/passwd文件的修改
auditctl -w /etc/passwd -p w -k passwd-change # -w:监控文件,-p w:记录写操作,-k:添加标签
# 查看审计日志
ausearch -k passwd-change
5. 数据安全工具:保障数据传输与存储安全
核心目标:防止数据在传输或存储过程中被窃取、篡改。
(1)OpenSSL:加密与证书管理工具
- 核心功能:提供SSL/TLS加密、证书生成与管理,保障HTTPs、SSH等协议的数据传输安全;
- 实战场景:生成自签名SSL证书,配置Nginx支持HTTPS;
- 关键用法:
bash
# 生成自签名证书(有效期365天)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx.key -out nginx.crt
2)GPG:数据加密与签名工具
- 核心功能:对文件、邮件等数据进行加密,或对数据进行数字签名,确保数据完整性与保密性;
- 实战场景:加密备份文件,防止备份数据泄露;
- 关键用法:
bash
# 加密文件(生成encryptedfile.gpg)
gpg -c sensitivefile.txt
# 解密文件
gpg -d sensitivefile.txt.gpg > sensitivefile.txt
三、面试高频考点总结
- 工具选型类:
- “中小企业预算有限,选择哪些开源安全工具?”——OpenVAS(漏洞扫描)、Snort(入侵检测)、Fail2ban(防暴力破解)、ELK Stack(日志分析);
-
“如何防范SSH暴力破解?”——禁用密码登录(启用密钥认证)、配置Fail2ban、修改SSH默认端口、限制允许登录的用户。
-
原理理解类:
- “入侵检测系统(IDS)与入侵防御系统(IPS)的区别?”——IDS仅监控报警,不阻断攻击;IPS在监控基础上,可主动阻断恶意流量;
-
“日志审计的核心价值是什么?”——安全事件追溯、异常行为发现、合规性检查(如满足等保要求)。
-
实战操作类:
- “如何配置sudo让普通用户仅执行特定命令?”——编辑
/etc/sudoers文件,指定用户、允许执行的命令,使用visudo命令避免语法错误; - “如何监控系统关键文件的修改?”——使用auditd工具,通过
auditctl命令配置监控规则,ausearch查看审计日志。
6 Docker与K8S
1. Docker与K8S的核心定位与关系(必考题)
- 核心类比:Docker是“应用打包交付工具”(行李箱),K8S是“容器集群管理系统”(智能调度中心);
- 关系:Docker解决“应用如何标准化打包运行”,K8S解决“多主机、大规模容器如何高效管控”,二者互补,是容器化部署的核心组合。
2. Docker核心组件(高频提问)
| 组件 | 定义/类比 | 核心作用 |
|---|---|---|
| 镜像 | 只读模板(安装包/模具) | **存储应用及依赖、配置,作为容器创建的基础 ** |
| 容器 | 镜像运行实例(饼干) | 应用实际运行的载体,进程级隔离 |
| 仓库 | 镜像存储分发平台(App Store) | 存放、共享镜像,支持跨环境拉取使用 |
3. Docker核心优势(面试必答)
- 环境一致性:打包“应用+依赖”,解决“跨环境运行失败”问题;
- 轻量高效:共享宿主机内核,启动秒级、资源占用低;
- 敏捷交付:适配CI/CD,简化部署流程,支持快速迭代;
- 进程隔离:应用独立运行,互不干扰,降低冲突风险。
4. Docker的局限性(面试加分题)
- 单主机管理:仅擅长单台主机的容器管理,不支持集群级调度;
- 功能短板:缺乏原生的扩容缩容、故障转移、跨主机网络编排能力;
- 复杂场景依赖第三方:多容器联动、大规模部署需借助K8S等工具。
5. 关键记忆点(快速应答口诀)
- Docker:“镜像(静态模板)、容器(动态实例)、仓库(存储分发)”;
- 核心价值:“标准化交付、环境一致性、轻量隔离”;
- 与K8S的关系:“Docker打包,K8S管跑”。
SQS VS SNS VS SWF
📌 SQS 核心特性总结
| 特性 | 说明 |
|---|---|
| 扩展性 | 可处理数百万条消息,支持多读写并发 |
| 高可用 | 多服务器冗余存储 |
| 交付保证 | 标准队列:至少一次;FIFO 队列:精确一次 |
| 顺序保证 | 标准队列:无顺序;FIFO 队列:严格顺序 |
| 保留期 | 默认 4 天,可配置 1 分钟 ~ 14 天 |
| 删除机制 | 消费者处理完成需显式删除 |
| 可见性超时 | 消息被读取后对其他消费者暂时不可见 |
| 批处理 | 最多 10 条消息/批,按实际消息数收费 |
| 短轮询 vs 长轮询 | 短轮询立即返回(可能不全),长轮询等待固定时间(返回全量、节省成本) |
| 延迟队列 | 消息延迟可见,可用于区分优先级 |
| 死信队列 | 失败消息重定向,避免无限重试 |
📌 设计模式总结
| 模式 | 应用场景 |
|---|---|
| Job Observer 模式 | 根据队列长度自动扩缩 EC2 实例数量,优化成本与性能 |
| 优先级队列模式 | 使用不同队列 + 延迟队列 / 不同扩缩容策略来实现消息优先级处理 |
📌 面试要点提示(针对 Platform Ops 岗位)
- 标准队列 vs FIFO 队列 — 面试官常问区别
- At-Least-Once 导致重复消息 — 消费者需幂等设计
- 可见性超时 — 若超时内未删除,消息会重新被其他消费者读取(可能导致重复处理)
- 长轮询 — 比短轮询更省钱、更高效,推荐使用
- 死信队列 — 排查失败消息的关键点
修正后的简洁面试笔记(推荐背诵版)
SQS 要点
标准队列:高吞吐、无序、至少一次交付
FIFO 队列:严格顺序、精确一次交付、吞吐量限制
保留期:默认 4 天,可调 1 分钟~14 天
消费者必须显式删除消息
可见性超时:读取后暂时屏蔽其他消费者
短轮询:立即返回,可能不全,成本高
长轮询:等待 20 秒,返回全量,省钱
批处理:10 条/批
延迟队列、死信队列
设计模式
Job Observer:队列长度驱动 Auto Scaling
Priority Queue:多队列 + 差异化处理
好的,这是您提供的 SNS 段落的逐句翻译、检查与修正,以及最后的归总。
SNS
SNS
将消息传递或发送给订阅的终端节点或客户端,属于发布-订阅模型。
生产者和消费者通过向主题(Topic)生成并发送消息,与订阅者进行异步通信。
支持 Email(纯文本或 JSON)、HTTP/HTTPS、SMS、SQS。
支持移动推送通知,可通过 ADM、APNS、GCM 等服务直接向移动设备推送通知。
不保证消息顺序,且不支持消息召回。
与 Lambda 集成,可在收到通知时触发函数执行。
对于邮件通知,直接使用 SNS 或 SES,SQS 不适用。
📌 SNS 核心特性总结
| 特性 | 说明 |
|---|---|
| 模型 | 发布-订阅(Pub/Sub) |
| 通信方式 | 异步 |
| 核心概念 | Topic(主题)、Subscriber(订阅者) |
| 协议/终端 | Email、HTTP/HTTPS、SMS、SQS、移动推送(ADM/APNS/GCM) |
| 顺序保证 | ❌ 不保证顺序 |
| 消息召回 | ❌ 不支持 |
| 与 Lambda 集成 | ✅ 支持,可触发 Serverless 函数 |
| 邮件通知 | 用 SNS 或 SES,SQS 不行 |
📌 SNS vs SQS 对比(高频面试题)
| 维度 | SNS | SQS |
|---|---|---|
| 模型 | 发布-订阅(一对多) | 队列(点对点) |
| 消息流向 | 生产者 → Topic → 多个订阅者 | 生产者 → Queue → 单个消费者 |
| 消息保留 | 不保留,立即推送 | 保留 1 分钟 ~ 14 天 |
| 消费者模式 | 推送(Push) | 轮询(Pull) |
| 重复消息 | 可能重复 | 标准队列可能重复;FIFO 保证精确一次 |
| 顺序保证 | 不保证 | 标准队列不保证;FIFO 保证 |
| 典型场景 | 广播、通知、事件驱动 | 任务缓冲、解耦、削峰填谷 |
📌 典型架构模式(面试加分点)
[SNS Topic] ─┬─> SQS Queue A (死信队列处理)
├─> SQS Queue B (不同消费者组)
├─> Lambda (实时处理)
├─> Email / SMS (告警)
└─> HTTP Endpoint (第三方回调)
常见问题: “如何用 SNS + SQS 实现可靠广播?”
答案: 让多个下游服务各自订阅一个 SQS 队列到同一个 SNS Topic。SQS 负责持久化、重试、死信;SNS 负责扇出(Fanout)。这样即使下游服务暂时不可用,消息也不会丢失。
📌 面试要点提示(针对 Platform Ops 岗位)
- Fanout 模式 — SNS + 多个 SQS 是最经典的解耦方式
- SNS 不支持持久化 — 如果订阅者离线,消息会丢失(除非用 SQS 做缓冲)
- SNS 不保证顺序 — 需要顺序的场景不能只用 SNS
- 邮件选型 — 批量营销用 SES,系统告警用 SNS(简单)
SNS 要点
Pub/Sub 模型,一对多广播
异步推送(Push)给 Email、HTTP、SMS、SQS、移动设备
不保序、不可召回
与 Lambda 集成
邮件用 SNS/SES,不要用 SQS
SNS vs SQS 一句话记
SNS = 广播喇叭(一对多,不存消息)
SQS = 任务信箱(一对一,可持久化)
好的,这是您提供的 SWF 段落的逐句翻译、检查与修正,以及最后的归总。
SWF
SWF (Simple Workflow Service)
协调分布式组件之间工作的编排服务。
帮助定义任务、存储状态、将任务分配给 Worker、定义业务逻辑、跟踪监控任务,并以持久方式维护工作流状态。
帮助定义可在 AWS 云或本地环境执行的任务。
帮助协调应用程序中的任务,包括根据应用程序的逻辑流管理任务间依赖、调度和并发。
支持内置的重试、超时和日志记录。
支持人工任务。
特点
精确一次交付
使用长轮询,减少空轮询次数
通过 API 可查看任务状态
支持计时器、信号、标记、子工作流
支持版本控制
按用户指定的时间保留工作流历史记录
SWF vs SQS
面向任务 vs 面向消息
跟踪所有任务和事件 vs 需要自定义处理
📌 SWF 核心特性总结
| 特性 | 说明 |
|---|---|
| 定位 | 工作流编排服务 |
| 执行环境 | AWS 云 或 本地(on-premises) |
| 交付保证 | 精确一次(Exactly Once) |
| 通信方式 | 长轮询 |
| 内置能力 | 重试、超时、日志、人工任务 |
| 状态管理 | 持久化存储工作流状态,支持 API 查询 |
| 高级特性 | 计时器、信号、标记、子工作流、版本控制 |
| 历史记录 | 用户指定保留时长 |
📌 SWF vs SQS 详细对比(高频面试题)
| 维度 | SWF | SQS |
|---|---|---|
| 定位 | 工作流编排(Orchestration) | 消息队列(Message Queue) |
| 面向 | 面向任务(Task-oriented) | 面向消息(Message-oriented) |
| 状态管理 | 自动跟踪所有任务和事件 | 需要自定义状态管理 |
| 交付保证 | 精确一次(Exactly Once) | 标准队列至少一次;FIFO 精确一次 |
| 任务依赖 | 内置支持任务间依赖 | 需要自己实现 |
| 人工任务 | ✅ 原生支持 | ❌ 不支持 |
| 版本控制 | ✅ 支持工作流版本 | ❌ 不适用 |
| 历史记录 | ✅ 持久化工作流历史 | ❌ 不保留处理历史 |
| 适用场景 | 复杂多步骤业务流程(订单处理、视频转码、审批流) | 简单任务解耦、削峰填谷 |
📌 SWF vs Step Functions(面试加分点)
注意: AWS 现在更推荐 Step Functions 而非 SWF。面试中可能会问区别。
| 维度 | SWF | Step Functions |
|---|---|---|
| 编写方式 | 需编写 Decider 逻辑(代码) | 声明式 JSON/ASL(Amazon States Language) |
| 执行环境 | 需要运行 Worker(EC2/本地) | 完全托管,无服务器 |
| 集成能力 | 主要靠代码调用 API | 原生集成 Lambda、ECS、DynamoDB、SQS 等 200+ 服务 |
| 人工任务 | 支持(需自己实现回调) | 支持(通过 .waitForTaskToken) |
| 推荐度 | 遗留服务,新项目不推荐 | 官方推荐,持续更新 |
📌 典型使用场景
┌─────────────────────────────────────────────────────────┐
│ SWF Workflow │
├─────────────────────────────────────────────────────────┤
│ Task 1 (人工审批) → Task 2 (订单验证) │
│ ↓ ↓ │
│ Task 3 (扣库存) → Task 4 (发货) │
│ ↓ │
│ Task 5 (通知客户) ←─────────┘ │
└─────────────────────────────────────────────────────────┘
📌 面试要点提示(针对 Platform Ops 岗位)
- SWF 的核心价值 — 处理分布式任务编排,自动管理依赖、重试、状态
- Exactly Once — 面试官可能会问 "SQS 是 At-Least-Once,SWF 是什么?"
- 人工任务 — 这是一个区别于纯消息队列的关键特性(如审批流程)
- 长轮询 — 减少空轮询,降低成本
- 与 Step Functions 的关系 — 说明你知道 SWF 是旧服务,新项目用 Step Functions,体现技术前瞻性
四、简洁面试笔记(推荐背诵版)
SWF 要点
工作流编排服务,管理任务依赖、调度、并发
支持云上 + 本地任务执行
精确一次交付
长轮询
内置重试、超时、日志、人工任务
支持版本控制、工作流历史
SWF vs SQS 一句话记
SWF = 指挥家(编排任务顺序、状态、依赖)
SQS = 信箱(只管存消息,不关心流程)
面试小心机
- 主动提 "Step Functions 是 SWF 的现代替代品,新项目用 Step Functions 更合适"
好的,这是您提供的 SES 段落的逐句翻译、检查与修正,以及最后的归总。
SES
"guarantees first hop" — 这是 SES 的核心概念,面试官可能追问:
| 术语 | 含义 |
|---|---|
| First Hop | 从你的应用程序 → SES API 端点 这一段 |
| SES 保证的内容 | 只要 API 调用成功返回 200,SES 就承诺会尝试发送该邮件 |
| SES 不保证的内容 | 邮件最终是否进入收件人的收件箱(可能被垃圾邮件过滤、收件箱满、邮件服务器拒收等) |
| 改善送达率的措施 | 使用 DKIM、SPF、DMARC 验证域名;预热 IP;处理投诉和退信 |
修正后的完整中文版本
SES (Simple Email Service)
高度可扩展且高性价比的邮件发送服务。
使用内容过滤技术扫描外发邮件,检查邮件标准和内容中的垃圾邮件及恶意软件。
支持发送完整的、功能齐全的邮件(含 HTML、附件等),而 SNS 发送邮件时只发送纯文本消息体。
非常适合大规模发送批量邮件(如营销邮件、通知邮件)。
保证第一跳(First Hop):即从你的应用到 SES API 的提交成功;但最终是否进入收件人收件箱由接收方邮件服务器决定。
无需自行搭建或维护邮件传输代理(MTA)等自定义软件/应用来处理邮件发送的繁重工作。
📌 SES 核心特性总结
| 特性 | 说明 |
|---|---|
| 定位 | 邮件发送服务(SaaS 版邮件服务器) |
| 扩展性 | 极高,可处理大规模批量发送 |
| 成本 | 高性价比(每千封邮件约 $0.10) |
| 内容安全 | 自动扫描垃圾邮件和恶意软件 |
| 邮件能力 | 支持完整邮件(HTML、附件、多部分格式) |
| 批量发送 | ✅ 专门优化,适合营销/通知邮件 |
| First Hop 保证 | ✅ 保证提交到 SES 成功 |
| 运维成本 | 无需自建邮件服务器 |
📌 SES vs SNS(邮件场景对比)
| 维度 | SES | SNS |
|---|---|---|
| 定位 | 专业邮件发送 | 推送通知服务(邮件只是其中一种协议) |
| 邮件格式 | 完整邮件(HTML、附件、个性化) | 纯文本消息体 |
| 批量发送 | ✅ 专门优化 | ❌ 不适合 |
| 发送限制 | 支持高吞吐(可申请提升) | 受 SNS 整体限制 |
| 适用场景 | 营销邮件、事务邮件、通知邮件 | 简单告警邮件(不需要复杂格式) |
| First Hop 保证 | ✅ 有 | 不适用(SNS 是推送,不保证最终送达) |
| 邮件送达优化 | DKIM/SPF/DMARC、IP 预热、退信处理 | 无 |
📌 SES 典型使用场景
┌─────────────────────────────────────────────────────────────┐
│ SES 工作流 │
├─────────────────────────────────────────────────────────────┤
│ 1. 用户注册 → 发送验证邮件 │
│ 2. 密码重置 → 发送重置链接 │
│ 3. 订单确认 → 发送订单详情(HTML + 附件) │
│ 4. 营销活动 → 批量发送促销邮件(个性化) │
│ 5. 系统告警 → 发送纯文本告警(也可用 SNS) │
└─────────────────────────────────────────────────────────────┘
📌 SES + SNS + SQS 联动架构(面试加分点)
[应用程序] ──发送邮件──> [SES]
│
↓ (退信/投诉通知)
[SNS Topic]
│
├──> [SQS Queue] ──> 处理退信逻辑
└──> [Lambda] ──> 实时更新黑名单
解释: SES 可以通过 SNS 将退信(Bounce)和投诉(Complaint)通知发送到 SQS 或 Lambda,实现自动化处理。
📌 面试要点提示(针对 Platform Ops 岗位)
- First Hop 保证 — 会被问到:"SES 保证邮件一定送达吗?" 答案:只保证第一跳。
- SES vs SNS 邮件区别 — 核心区别是邮件完整度(SES 可发 HTML/附件,SNS 只能发纯文本)。
- 批量发送 — SES 支持,SNS 不适合。
- 反垃圾机制 — 自动扫描外发邮件,防止被标记为垃圾邮件。
- 与 SNS/SQS 联动 — 处理退信和投诉是生产环境必备能力。
四、简洁面试笔记(推荐背诵版)
SES 要点
专业邮件发送服务,高扩展、低成本
支持完整邮件(HTML、附件)
自动扫描垃圾邮件和恶意软件
适合批量发送(营销、事务邮件)
保证 First Hop(到 SES 的成功),不保证最终进入收件箱
无需自建邮件服务器
SES vs SNS 一句话记
SES = 专业邮局(发完整邮件)
SNS(邮件) = 小纸条(只传文字)
面试小心机
主动提 "SES 需要预热 IP 和配置 DKIM/SPF 提高送达率"
提 "通过 SNS + SQS 处理退信和投诉"