当前位置: 首页 > news >正文

k8s运维面试总结(持续更新)

一、你使用的promethues监控pod的哪些指标?
CPU使用率
内存使用率
网络吞吐量
磁盘I/O
资源限制和配额:Prometheus可以监控Pod的资源请求和限制,确保它们符合预设的配额,防止资源过度使用。具体指标如container_spec_cpu_quota用于表示容器的CPU配额。
健康检查:存活探针(Liveness Probe)和就绪探针(Readiness Probe)的状态对于评估Pod的健康状况至关重要。Prometheus通过监控这些探针的成功或失败状态来了解Pod的健康情况。

重启次数:
节点指标:Prometheus通过kube-state-metrics监控Kubernetes资源对象如Pod、Deployment、Service等的状态
监控工具:Prometheus通过Exporter如node-exporter和cAdvisor来采集节点和容器的指标数据。这些Exporter将监控数据转换为Prometheus可以理解的格式。

二、如果想对Pod本身调大内存参数 有几种方法?
(1) 直接修改Pod定义文件(推荐)
编辑 Pod 的 YAML 文件:
在 Pod 的定义文件中,找到 resources 字段,调整 limits.memory(内存上限)和 requests.memory(内存请求)的值

(2)使用kubectl edit 命令(快速调整)
kubectl edit pod

三、Kubernetes 中扩容节点的步骤是什么?
1.准备工作
1.1 硬件/虚拟机准备
配置要求:确保新节点满足 Kubernetes 的最低要求(如 CPU、内存、磁盘)。
网络配置:
与主节点网络互通。
关闭防火墙或开放必要端口(如 6443、2379-2380、10250 等)。

1.2 操作系统配置
安装依赖:

# Ubuntu 示例
sudo apt-get update
sudo apt-get install -y docker.io kubelet kubeadm kubectl

配置容器运行时:如 Docker、containerd(需与集群一致)。

关闭 swap:
bash
sudo swapoff -a  # 临时关闭
# 永久关闭需编辑 将其注释 /etc/fstab

2.加入集群
2.1 从主节点获取加入命令
生成 token(若默认 token 过期):

kubeadm token create --print-join-command

获取命令:

# 输出示例(替换为实际值)
kubeadm join <主节点IP:端口> --token <token> --discovery-token-ca-cert-hash <hash>

2.2 在新节点执行加入命令
执行命令:

sudo kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

验证节点状态
查看节点列表:

kubectl get nodes

Ready 状态:新节点状态应为 Ready(可能需要几分钟初始化)。

四、k8s的组件有哪些?作用是什么?

控制平面组件:
kube-apiserver:作为Kubernetes集群的核心,负责处理API请求,是集群内外通信的枢纽。
kube-controller-manager:运行控制器进程,如节点控制器、副本控制器等,确保集群状态符合预期。
kube-scheduler:负责将Pod调度到合适的节点上运行,考虑资源需求和节点状态。
etcd:作为键值存储系统,保存集群的配置和状态数据。

节点组件:
kubelet:运行在每个节点上,负责Pod的生命周期管理,与kube-apiserver通信。
kube-proxy:维护节点上的网络规则,实现Pod的通信和网络服务。
容器运行时(如Docker、containerd):负责容器的运行和管理。

五、案例分析
(1)收到研发反馈,在pod(容器)上查不到redis数据, 但是业务正常(有历史数据)。 (提示:1、redis刚开始使用deployment部署,后续有过调整变动; 2、从service方向多考虑)
请给出分析,结合所掌握的相关知识和命令 判断 可能的原因

1.Service与Pod标签不匹配(最常见原因)
现象:Deployment调整后,Pod标签可能发生变化,但Service的Selector未同步更新,导致Service无法关联到正确Pod。

2.Service DNS解析失败
现象:Pod通过Service名称访问Redis时,DNS解析异常。

3.Endpoints未更新
现象:Service关联的Endpoints未更新,仍指向旧Pod。

4.网络策略拦截
现象:NetworkPolicy阻止了Pod与Redis Service的通信。

(2) 在k8s中部署mysqld , mysqld 容器启动始终失败,提示数据目录非空. 请给出解决办法 (提示: mount 新创建的pv也报相同错误)

解决方案
1.确保PV/PVC目录绝对干净、清空数据目录、重新部署MySQL
2. 修复目录权限问题,可能PV目录权限非mysql:mysql(如root:root),导致MySQL无法初始化
3 避免子目录挂载冲突:PV挂载到子目录(如/data/mysql),但该子目录已存在文件。
4 使用初始化容器(Init Container)现象:动态环境或CI/CD流程中需自动化清理

六、k8s的日常工作内容
集群管理
监控集群状态,确保节点、Pod和网络等组件正常运行。
管理集群资源,如CPU、内存和存储,确保资源合理分配和利用。
执行集群升级和维护,包括节点软件更新和安全补丁应用。

应用部署
使用Kubernetes部署和管理容器化应用程序,包括滚动更新和回滚。
配置和管理应用程序的服务、副本集和部署策略

监控与日志
设置和监控性能指标:使用Prometheus和Grafana等工具监控集群和应用程序的性能
收集和分析日志:使用Fluentd和Elasticsearch等工具收集和分析日志

故障排查
快速响应和解决故障:使用kubectl describe和kubectl logs等命令排查故障。

安全管理
管理安全策略:使用RBAC和网络策略等工具管理集群和应用程序的安全
定期审计和检查安全性:定期进行安全审计和检查,确保符合安全标准和最佳实践

持续集成与交付
实现CI/CD流程:使用Jenkins、GitLab CI等工具实现持续集成和持续交付。

七、对k8s集群做过哪些安全策略
用户访问api策略
Secret管理加密敏感数据:
etcd策略

如:TLS 加密 
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \-config=ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcdAPI Server 连接 etcd 时强制使用证书:
# api-server 启动参数
--etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
--etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
--etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key

网络隔离:
通过防火墙限制 etcd 端口(默认 2379-2380)仅允许 API Server 和 etcd 节点访问。

备份与加密
定期备份与加密

api审计
启用审计日志:配置审计策略、启动 API Server 时加载策略

八、空网关和istio的Gateway区别?
1.空网关(Empty Gateway)
定义:指未配置任何路由规则或服务的 Ingress 控制器(如 Nginx Ingress Controller),通常作为占位符存在。
特点:
无实际流量路由功能。
可能返回默认的 404 页面或空响应。
典型场景:
预留 Ingress 资源名称,后续再配置。
测试 Ingress 控制器的网络连通性。
开发环境中临时用于服务调试。

2.Istio Gateway
定义:Istio 服务网格中用于管理入站(Ingress)和出站(Egress)流量的核心组件。
特点:
通过 Gateway 资源定义流量入口(如端口、协议)。
结合 VirtualService 配置流量路由规则(如路径匹配、流量拆分)。
支持高级流量管理功能(熔断、负载均衡、TLS 终止)。
典型场景:
生产环境中管理微服务间的流量。
实现金丝雀发布、A/B 测试等策略。
统一处理南北向流量(如外部用户访问集群服务)。

核心区别
空网关:简单的 Ingress 占位符、技术实现:基于 Ingress Controller 的空配置、 流量处理:无实际流量路由 使用场景:开发、测试

Istio Gateway:Istio 服务网格的流量入口控制器、技术实现:Istio 控制平面 + Envoy Sidecar 流量处理:支持复杂流量规则(路由、拆分等) 使用场景:生产级流量管理、微服务治理

如何选择?
用空网关:仅需简单的 Ingress 占位,或快速验证网络基础功能。
用 Istio Gateway:需实现生产级流量管理(如金丝雀发布、熔断)、或集成 Istio 的安全、监控功能。

总结
空网关是轻量级的网络入口占位工具,而 Istio Gateway 是 Istio 服务网格中用于管理复杂流量的核心组件。选择取决于具体需求:简单场景用空网关,生产级流量治理用 Istio Gateway。

九、如果流水线不能自动发布了,怎么处理?
1.获取构建产物
从流水线获取:
如果流水线已完成构建阶段,从流水线的工作目录或存储库中获取构建产物(如 Docker 镜像、JAR/WAR 包、静态文件)。

手动构建:
如果流水线未构建成功,在本地或构建服务器上手动执行构建命令:
示例:Maven 构建 Java 项目
mvn clean package

示例:npm 构建前端项目
npm install
npm build

2.部署应用
手动操作 Kubernetes:
使用 kubectl 手动部署

更新镜像版本
kubectl set image deployment/my-app my-app=registry.example.com/my-app:1.2.3

或直接应用 YAML 文件
kubectl apply -f deployment.yaml

验证部署
检查应用状态:
确认应用 Pod/容器已启动且无报错(如 kubectl get pods)。
检查服务是否正常运行(如 curl http://app-service)。
检查日志是否有异常(如 kubectl logs )。

十、k8s中的控制器有哪些?作用是什么?

  • Deployment 无状态应用管理、滚动更新、自动扩缩容 Web 服务、API 网关等无状态服务

  • StatefulSet 有状态应用管理、稳定网络标识、顺序部署 数据库集群、消息队列等有状态服务 DaemonSet 每节点部署一个

  • Pod(或指定节点) 日志收集、监控代理等节点级系统服务 Job 执行一次性任务,支持并行处理 批处理作业(如数据清洗)

  • CronJob 按 cron 表达式定时执行任务 定时任务(如备份、报告生成)

  • ReplicaSet 确保指定数量的 Pod副本运行(通常作为 Deployment 的后端 直接使用较少,多用于底层控制逻辑

十二、在Kubernetes中,除了通过 Ingress Controller 和 Istio 实现流量负载均衡外,应用层面负载均衡怎么实现?
Ribbon、loalbalance
原理:
在应用代码中显式实现负载均衡逻辑(如选择后端服务实例)。
实现方式:
自定义负载均衡算法:
如轮询(Round Robin)、加权轮询(Weighted Round Robin)、随机(Random)、最少连接(Least Connections)。
示例代码(伪代码):

示例:轮询算法

def select_instance(instances):current_index = (current_index + 1) % len(instances)return instances[current_index]

十三、怎么将包含DDL(数据定义语言)和DML(数据操作语言)语句的应用打包成Docker镜像并部署到其他服务器执行?
1.准备SQL脚本
将DDL/DML语句保存为.sql文件(如init.sql),例如:
– init.sql
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO users VALUES (1, ‘Alice’), (2, ‘Bob’);

2.编写Dockerfile
创建一个Dockerfile,使用包含数据库客户端的基础镜像(如MySQL客户端):
使用官方MySQL客户端镜像
FROM mysql:8.0
将SQL脚本复制到镜像中
COPY init.sql /docker-entrypoint-initdb.d/
设置容器启动命令(按需调整)
CMD [“mysql”, “-h”, “your-db-host”, “-u”, “user”, “-p密码”, “数据库名”, “<”, “/docker-entrypoint-initdb.d/init.sql”]

docker build -t my-sql-app:1.0

.十四、tcp的握手和挥手是怎样的?

一、TCP三次握手(建立连接)
第一次握手
客户端发送 SYN(同步)报文,附带随机初始序列号 seq=x。
目的:客户端表明自己已准备好通信,请求建立连接。
第二次握手
服务器响应 SYN-ACK(同步-确认)报文,包含:
对客户端 SYN 的确认号 ack=x+1。
自己的初始序列号 seq=y。
目的:服务器确认客户端请求,并告知自己已准备好。
第三次握手
客户端发送 ACK(确认)报文,确认号 ack=y+1。
目的:客户端确认服务器已就绪,连接正式建立。
握手核心逻辑:双方通过交换序列号确认彼此收发能力,防止历史连接干扰。

二、TCP四次挥手(关闭连接)
第一次挥手
客户端发送 FIN(结束)报文,序列号 seq=u。
目的:客户端声明数据已发送完毕,请求关闭连接。
第二次挥手
服务器响应 ACK 报文,确认号 ack=u+1。
目的:服务器确认客户端的关闭请求,但可能还有数据未发送。
第三次挥手
服务器发送 FIN 报文,序列号 seq=v。
目的:服务器声明数据已全部发送,请求关闭连接。
第四次挥手
客户端响应 ACK 报文,确认号 ack=v+1。
目的:客户端确认服务器的关闭请求,连接完全终止。
挥手核心逻辑:确保双向数据均传输完毕,避免数据丢失。

十五、k8s生产环境怎么处理资源限制的问题?

1.限制命名空间(Namespace)级别的总资源使用量。
配置示例:

yaml
apiVersion: v1
kind: ResourceQuota
metadata:name: prod-quotanamespace: production
spec:hard:requests.cpu: "20"       # 总 CPU 请求不超过 20 核requests.memory: "64Gi"  # 总内存请求不超过 64GBlimits.cpu: "40"         # 总 CPU 限制不超过 40 核limits.memory: "128Gi"   # 总内存限制不超过 128GB

2.设置限制范围(Limit Ranges)
作用:为命名空间中的 Pod 设置默认资源请求/限制。
配置示例:

apiVersion: v1
kind: LimitRange
metadata:name: default-limitsnamespace: production
spec:limits:- default:cpu: "1"memory: "512Mi"defaultRequest:cpu: "0.5"memory: "256Mi"type: Container

3.动态调整资源限制
手动调整:
kubectl edit deployment/ -n
修改 containers 部分的 resources.limits 和 resources.requests

自动化调整:
Vertical Pod Autoscaler (VPA):自动推荐并调整 Pod 资源限制。
Horizontal Pod Autoscaler (HPA):根据资源使用率自动扩缩容副本数

4.存储资源限制
使用 PersistentVolumeClaims (PVC):

kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: mysql-storage
spec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 100Gi  # 最小存储需求limits:storage: 200Gi  # 最大存储限制(可选)

5.网络带宽限制(实验性)
使用 Linux TC 规则:
#在节点上通过 tc 命令限制带宽

tc qdisc add dev eth0 root handle 1: htb default 12
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Mbps
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 500Mbps  # 限制到 500Mbps 

十六、pod CrashLoopBackOff怎么处理?
1.查看Pod状态:
使用kubectl get pods命令检查Pod的状态,确认其是否处于CrashLoopBackOff状态。

2.获取Pod日志:
通过kubectl logs 命令查看Pod的日志,寻找错误信息或异常堆栈,这有助于确定崩溃的原因。

3.描述Pod详情:
使用kubectl describe pod 命令获取Pod的详细信息,包括事件记录,这可能提供关于崩溃的更多线索。

4.检查Pod配置:
确认Pod的配置文件(如YAML)是否正确,特别是资源限制、环境变量和卷挂载等部分

5.检查资源使用情况:
使用kubectl top pod 命令查看Pod的资源使用情况,确认是否由于资源不足导致崩溃

6.回滚或重新部署:
如果最近对Pod进行了更改,考虑回滚到之前的稳定版本。
尝试重新部署Pod,有时这可以解决临时性的问题

7.监控与告警
配置 Prometheus + Grafana 监控 Pod 资源使用。
设置 Alertmanager 告警规则(如连续崩溃超过 3 次触发告警)。

8.若仍无法解决,结合日志和事件信息,联系应用开发者。

十七、calico和fannel的区别

特性CalicoFlannel
网络模型三层路由(BGP)叠加网络(VxLAN/host-gw)
网络策略原生支持(细粒度需依赖第三方工具
性能高(无隧道开销)(无隧道开销)
复杂度较高(需配置 BGP)低(简单易用)
适用场景大规模中小型、快速部署场景

十八、pod service endpoint三者的关系?
Pod 是服务实例
Pod 是实际运行服务的容器组(如 Nginx、API 服务)。

Service 是抽象入口
Service 通过标签选择器(selector)匹配一组 Pod(如 app: nginx)。
用户或外部系统通过 Service 的 IP/DNS 访问服务,无需关心具体 Pod。

Endpoint 是动态映射
Kubernetes 自动为每个 Service 创建一个同名的 Endpoint 资源。
Endpoint 列表中的 IP 和端口指向当前健康的 Pod。
若 Pod 崩溃或删除,Endpoint 会自动移除其条目,Service 将流量路由到其他可用 Pod。

示例流程
部署一个 Nginx Pod(标签 app: nginx)。
创建 Service,通过 selector: app=nginx 关联到该 Pod。
Kubernetes 自动创建 Endpoint,记录 Pod 的 IP 和端口(如 10.244.0.5:80)。
其他 Pod 或外部请求通过 Service 的 IP/DNS 访问 Nginx,流量被路由到 Endpoint 中记录的 Pod。

十九、pod 容器 node的关系?
三者关系
Pod:定义容器的运行环境和调度单元。
容器:实际执行业务逻辑,依赖 Pod 的网络和存储。
Node:提供计算资源,运行 Pod 和容器。

二十、istio都有用到哪些功能?

1.流量管理

  • 金丝雀发布:逐步将流量从旧版本切换到新版本。
  • A/B 测试:将流量路由到不同版本的服务。

熔断机制:自动屏蔽故障服务,防止级联故障。

2.安全通信

  • mTLS:服务间自动加密通信(双向 TLS)。
  • RBAC:基于角色的访问控制(如限制服务调用权限)。
    可根据自己经验回答

二十一、Helm目录结构及本地部署chart主要步骤?
Helm目录结构:

  • Chart.yaml:定义Chart的元数据,如名称、版本和依赖关系。

  • values.yaml:包含Chart的默认配置值,用户可以在安装时覆盖这些值

  • templates/:存放Kubernetes资源模板,如Deployment、Service等。

  • templates/NOTES.txt:安装后显示的使用说明。

  • _helpers.tpl:存放可重用的模板片段。

  • charts/:存放依赖的Chart。

mychart/
├── Chart.yaml          # Chart 的元数据(名称、版本、依赖等)
├── values.yaml         # 默认配置值,可覆盖
├── charts/             # 依赖的子 Chart(可手动或动态链接)
├── templates/          # Kubernetes 资源模板(YAML 文件)
│   ├── deployment.yaml # 定义 Deployment
│   ├── service.yaml    # 定义 Service
│   ├── _helpers.tpl    # 可复用的模板片段
│   └── NOTES.txt       # 安装后的使用说明
└── .helmignore         # 打包时忽略的文件列表

1.初始化 Helm 客户端
下载并安装 Helm:

wget https://get.helm.sh/helm-v3.12.3-linux-amd64.tar.gz
tar -zxvf helm-v3.12.3-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm

验证安装:

helm version

2.创建命名空间(可选)
在 Kubernetes 中创建命名空间(如 my-namespace):

kubectl create namespace my-namespace

3.手动打包 Chart(如果未打包)
如果 Chart 是目录形式,需先打包成 .tgz 文件:
helm package mychart
生成文件:mychart-0.1.0.tgz

4.安装 Chart
使用 helm install 命令安装:

helm install my-release mychart-0.1.0.tgz -n my-namespace

参数说明:
my-release:自定义的 Release 名称(唯一标识)。
mychart-0.1.0.tgz:Chart 包路径。
-n my-namespace:指定命名空间。

5.验证部署状态
查看已安装的 Release:

helm list -n my-namespace

检查 Kubernetes 资源状态:

kubectl get all -n my-namespace
原文地址:https://blog.csdn.net/m0_49929446/article/details/146922387
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mrgr.cn/news/96810.html

相关文章:

  • Python入门(5):异常处理
  • 基础算法篇(3)(蓝桥杯常考点)—图论
  • uniapp APP端在线升级(简版)
  • 量子计算与人工智能融合的未来趋势
  • 机器人--ros2--IMU
  • 图片边缘采样
  • dubbo http流量接入dubbo后端服务
  • Android学习之计算器app(java + 详细注释 + 源码)
  • 在Windows下使用Docker部署Nacos注册中心(基于MySQL容器)
  • 华为交换综合实验——VRRP、MSTP、Eth-trunk、NAT、DHCP等技术应用
  • MySQL数据库学习笔记1.SQL(1)
  • 使用 GitHub Pages 快速部署静态网页
  • Mysql之事务(下)
  • Linux安装Ubuntu24.04系统 并安装配置Nvidia 4090 显卡驱动
  • 论文阅读笔记:Denoising Diffusion Implicit Models (2)
  • STM32_HAL之程序编写、编译、烧写、上板测试初体验
  • 使用SpringBoot + Thymeleaf + iText实现动态PDF导出
  • git 按行切割 csv文件
  • echarts+HTML 绘制3d地图,加载散点+散点点击事件
  • C#:第一性原理拆解属性(property)