自学内容网 自学内容网

kubernetes 测试开发面试题三

一、kubernetes cluster部署好之后,我们如何知道这个集群是好的,可用的?

要验证 Kubernetes 集群是否部署成功并处于可用状态,可以通过以下步骤逐步检查和测试集群的健康状况。

1. 基础验证

1.1 确保所有节点都处于 Ready 状态。

kubectl get nodes

NAME          STATUS   ROLES    AGE    VERSION
node-1        Ready    master   5m     v1.28.0
node-2        Ready    worker   5m     v1.28.0

如果节点状态为 NotReady 或 Unknown,需要检查节点的连接、Kubelet 和网络配置。

1.2 检查核心组件 kube-apiserver、kube-scheduler、kube-controller-manager 是否正常运行。

kubectl get pods -n kube-system
输出示例:

NAME                                     READY   STATUS    RESTARTS   AGE
kube-apiserver-node-1                    1/1     Running   0          5m
kube-controller-manager-node-1           1/1     Running   0          5m
kube-scheduler-node-1                    1/1     Running   0          5m
etcd-node-1                              1/1     Running   0          5m

核心组件应该处于 Running 状态,且 RESTARTS 不应过高。

1.3 测试集群 API是否响应

kubectl version --short
输出示例:

Client Version: v1.28.0
Server Version: v1.28.0

2. 网络验证

2.1 测试 Pod 间是否正常通信

部署一个简单的网络工具(如 nginx 和 busybox),测试 Pod 之间的通信。

kubectl run nginx --image=nginx --restart=Never
kubectl run busybox --image=busybox --restart=Never -- sleep 3600
kubectl exec -it busybox -- ping nginx

确保 Pod 之间可以正常通信。

2.2 测试服务访问-----部署一个 Service 并验证访问:
kubectl expose pod nginx --port=80 --target-port=80 --type=ClusterIP
kubectl run curl --image=appropriate/curl --restart=Never -- curl nginx:80

应该能成功返回 nginx 的默认页面。

3. 存储验证

3.1 测试 PersistentVolume

创建一个 PVC 并绑定到 Pod。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
kubectl apply -f pvc.yaml
kubectl describe pvc test-pvc

确保 PVC 状态为 Bound。

3.2 测试PVC 绑定的 Pod 测试读写操作。

4. 应用验证

4.1 部署示例应用—部署一个多容器应用(如 guestbook)。
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-deployment.yaml
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-slave-deployment.yaml
kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml

确保应用所有 Pod 都处于 Running 状态。

4.2 测试负载均衡

创建 LoadBalancer 类型的 Service,并从外部访问应用。

kubectl expose deployment frontend --type=LoadBalancer --name=frontend-lb --port=80

访问分配的 LoadBalancer 地址,验证前端页面是否正常工作。

5. 性能与压力测试

5.1 node, pod 资源使用情况

使用以下命令监控节点和 Pod 的资源使用情况:

kubectl top nodes
kubectl top pods
5.2 简单负载测试

部署工具如 Apache Bench (ab) 或 Siege,模拟流量并观察集群的表现。

6. 日志与监控

6.1 检查日志

查看核心组件的日志以捕获任何潜在问题:

kubectl logs -n kube-system <component-name>
6.2 启用监控工具

配置 Prometheus 和 Grafana,实时监控集群的性能和资源消耗。

7. 总结:验证结果

验证条件
集群被视为可用时满足以下条件:

  1. 所有节点状态为 Ready。
  2. 核心组件运行正常且稳定。
  3. Pod 间网络通信正常。
  4. 存储功能可用。
  5. 服务暴露和负载均衡正常工作。
  6. 部署的实际应用能正常运行。
  7. 资源监控未发现明显瓶颈。

通过上述步骤和测试,可以全面验证 Kubernetes 集群是否处于健康可用状态,并为生产部署做好准备。

二、kubernetes有哪些功能

Kubernetes 是一个强大的容器编排平台,提供了广泛的功能来管理容器化应用。以下是 Kubernetes 的主要功能分类及其核心特性:

1. 集群管理

1.1 节点管理
  • 自动节点注册:新节点可以自动加入集群。
  • 节点健康检查:监控节点的健康状态,自动标记 Ready 或 NotReady。
  • 节点伸缩:支持动态扩展或缩减集群节点数(如与云提供商结合的自动扩展)。
1.2 资源分配与调度
  • 智能调度器:根据资源需求、节点容量、优先级等因素,智能选择最佳节点运行 Pod。
  • 资源预留:支持为 Pod 设置 CPU、内存等资源请求和限制。
  • 亲和性与反亲和性:定义 Pod 之间的部署规则(如强制一起部署或避免部署在同一节点上)。

2. 应用管理

2.1 工作负载类型
  • Deployment:用于无状态应用的部署和管理。
  • StatefulSet:管理有状态应用,如数据库或需要固定名称的服务。
  • DaemonSet:确保每个节点上运行一个 Pod(例如日志收集器)。
  • Job 和 CronJob:处理一次性任务或定时任务。
2.2 应用编排
  • 滚动更新:逐步替换旧版本的应用,确保零停机。
  • 回滚:在更新失败时自动回退到之前的版本。
  • 蓝绿部署与金丝雀部署:通过策略实现更灵活的发布流程。

3. 服务发现与负载均衡

  • DNS 集成:每个 Service 都会分配一个 DNS 名称,供 Pod 间通信使用。
  • 负载均衡:
    • ClusterIP:集群内部的负载均衡。
    • NodePort:通过节点 IP 和端口暴露服务。
    • LoadBalancer:基于云平台的外部负载均衡器。
  • 服务发现:通过 Kubernetes 内置的机制发现和访问服务。

4. 网络与通信

  • Pod 间通信:每个 Pod 都有一个唯一的 IP,支持直接通信。
  • 跨节点通信:通过网络插件(如 Flannel、Calico)实现。
  • 网络策略:基于规则控制 Pod 之间和 Pod 与外部的通信。
  • Ingress 控制器:用于管理外部访问(如 HTTP、HTTPS)的路由规则。

5. 存储管理

  • 持久化存储(Persistent Storage):
    • 支持多种存储后端(如 NFS、Ceph、AWS EBS)。
    • 使用 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)抽象存储资源。
  • 动态存储分配:通过 StorageClass 自动创建 PV。
  • 数据迁移:支持在不同节点间移动数据卷。

6. 自动化和弹性扩展

  • 自动扩展:
    • Pod 水平自动扩展(HPA):根据负载动态调整 Pod 数量。
    • 集群自动扩展:根据需求动态增加或减少节点数。
  • 自愈能力:
    • 自动重启失败的 Pod。
    • 替换状态不健康的节点或 Pod。
    • 重新调度资源不足的 Pod。

7. 安全性

  • 认证与授权:
    • 支持多种身份认证方式(如证书、令牌、OIDC)。
    • 基于 RBAC(角色权限控制)的权限管理。
  • 网络安全:
    • 网络策略控制 Pod 之间的通信。
  • 机密管理:
    • 使用 Secret 和 ConfigMap 管理敏感信息和配置信息。
  • Pod 安全策略(PSP):限制 Pod 的权限,如禁止特权模式。

8. 日志与监控

  • 日志管理:
    • 提供 kubectl logs 查看 Pod 日志。
    • 集成 Fluentd 等工具将日志收集到集中式存储。
  • 监控:
    • 通过 Metrics Server 提供资源监控数据(如 CPU、内存使用)。
    • 集成 Prometheus、Grafana 等工具实现高级监控和可视化。
    • 事件追踪:记录集群中的事件(如 Pod 创建、调度、失败)。

9. 扩展性

  • API 和自定义资源:
    • 提供 RESTful API 接口。
    • 支持 CRD(Custom Resource Definition),允许用户扩展 Kubernetes 的功能。
  • 控制器扩展:通过 Operator 实现更复杂的自动化任务(如数据库管理)。
  • 插件系统:
    • CNI(网络插件):如 Flannel、Calico、WeaveNet。
    • CSI(存储插件):如 AWS EBS、GCE Persistent Disk。
    • 容器运行时接口(CRI):支持 Docker、Containerd、CRI-O。

10. 社区支持与工具生态

  • 工具支持:
    • Helm:用于应用的打包和部署。
    • Kustomize:支持原生 YAML 配置管理。
  • 社区活跃:定期发布新版本,支持多种部署方式(如 kubeadm、kops、minikube)。
    通过这些功能,Kubernetes 成为管理容器化应用的强大工具,能够简化部署、提高可用性、增强弹性扩展能力,适用于从开发到生产环境的广泛场景。

三、物理资源测试 vs. Kubemark 测试:对比、优缺点

1. 定义

  • 物理资源测试
    • 定义:直接在真实的物理硬件和节点上运行 Kubernetes 集群,利用实际资源(CPU、内存、网络)进行测试。
    • 应用场景:用于评估生产环境的性能、稳定性和可扩展性。
  • Kubemark 测试
    • 定义:一种 Kubernetes 集群模拟工具,用于创建虚拟节点(Hollow Nodes)以模拟大规模集群负载,而无需实际分配大量物理资源。
    • 应用场景:适合进行大规模扩展性测试,在资源受限的情况下评估控制平面的能力。

2. 对比

特性物理资源测试Kubemark 测试
资源依赖需要真实的物理节点和硬件资源仅需要少量资源即可模拟大规模集群
测试规模受限于硬件资源可轻松模拟数千个节点、数万个 Pod
测试精度真实环境,测试结果接近生产情况虚拟环境,可能存在部分偏差
网络测试包括真实网络延迟、吞吐等模拟网络通信,可能无法完全反映真实情况
控制平面压力与生产环境一致,全面评估控制平面性能专注于测试控制平面的可扩展性
成本高成本,需投入大量物理资源成本较低,充分利用虚拟化技术
调试和诊断直接观察真实环境中的问题更适合调试控制平面,节点级问题不易复现
适用场景用于生产环境性能验证或资源利用优化适合进行大规模负载测试和控制平面评估

3. 优缺点

3.1 物理资源测试
  • 优点
    • 真实结果:测试环境与生产一致,结果具有更高可信度。
    • 全面性:可以测试所有组件(如网络性能、存储 IO)和应用工作负载。
    • 硬件限制验证:能够识别硬件瓶颈(如磁盘 IO、CPU 性能等)。
  • 缺点
  • 高成本:需要大量物理资源,特别是在模拟大规模集群时。
  • 扩展性受限:物理节点数量限制了测试规模。
  • 调试复杂:真实环境中问题可能受到多个外部因素影响,调试难度增加。
3.2 Kubemark 测试
  • 优点
    • 低成本:无需大量硬件资源,通过模拟节点进行大规模测试。
    • 高扩展性:可以轻松模拟数千节点和数万个 Pod 的场景。
    • 控制平面专注:专注于测试控制平面的扩展能力(如调度性能、API Server 吞吐量)。
    • 快速测试:部署和运行速度快,便于频繁进行大规模测试。
  • 缺点
    • 缺乏真实感:无法模拟真实的物理硬件性能、网络延迟和 IO。
    • 结果偏差:因为 Hollow Node模拟的负载是理想化的,无法完全代表真实节点。
    • 功能覆盖有限:主要用于控制平面压力测试,对数据平面(如网络、存储)的测试能力较弱。
    • 依赖经验配置:需要调整 Hollow Node 的负载模拟参数以贴近实际情况。

4. 选择依据

4.1 选择物理资源测试

如果需要:

  • 真实环境的性能基准测试。
  • 测试网络性能、存储 IO 或硬件相关性能。
  • 验证应用在生产环境的表现。
4.2 选择 Kubemark

如果需要:

  • 在资源受限的情况下进行大规模集群扩展性测试。
  • 评估控制平面组件(如 API Server、Scheduler)的性能。
  • 快速模拟和调整多种大规模场景。

5. 综合建议

5.1 混合使用:
  • 先用 Kubemark 进行大规模测试,快速找出控制平面的瓶颈。
  • 再用 物理资源测试 验证生产环境的性能和真实表现。
5.2 调试和优化流程:
  • Kubemark 提供快速的反馈,用于优化控制平面。
  • 物理资源测试用于更精确的调优和最终验证。
5.3 预算考虑:
  • 如果预算有限,优先使用 Kubemark,在少量资源下完成扩展性测试。
  • 如果预算充足,并关注实际表现,选择 物理资源测试。
    这种组合测试方法能够平衡测试成本和结果的可信度,为 Kubernetes 集群的性能优化提供全面的指导。

原文地址:https://blog.csdn.net/suzimuyu99/article/details/144386949

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!