Kubernetes的核心组件有哪些,各自作用是什么?
- Master节点组件:
a.kube-apiserver:集群的控制入口,提供REST API接口。
b.kube-scheduler:负责Pod调度,决定Pod运行在哪个节点上。
c.kube-controller-manager:运行各种控制器,确保集群状态与期望状态一致。
d.etcd:分布式键值存储,保存集群所有配置信息。
- Node节点组件:
- kubelet:负责节点上的Pod生命周期管理。
- kube-proxy:负责实现服务(Service)负载均衡和网络代理。
- 容器运行时(如Docker、containerd):运行容器镜像的环境。
Pod和Deployment的区别?
- Pod:是Kubernetes最小的资源单位,一组容器的集合,生命周期短暂,可能随时被重建。
- Deployment:控制Pod副本的部署和管理,提供滚动升级、回滚等功能,确保应用的高可用性。
Service有哪些类型,分别适用于什么场景?
- ClusterIP(默认):在集群内访问服务,不对外暴露。
- NodePort:通过节点IP和静态端口对外暴露服务(适合测试或临时访问)。
- LoadBalancer:结合云服务提供商的负载均衡器,直接对外提供服务。
- ExternalName:通过DNS别名映射到外部服务。
ConfigMap和Secret有什么区别?
- ConfigMap:存储明文非敏感配置,如环境变量、配置文件等。
- Secret:存储加密的敏感信息,如密码、Token和证书。
StatefulSet 和 Deployment 的主要区别是什么?
- StatefulSet:用于有状态的服务,Pod具有稳定的标识(网络、存储),Pod启动和销毁严格按照顺序进行(如数据库)。
- Deployment:用于无状态应用,Pod可任意扩展、缩减,无严格顺序要求。
什么是 Ingress,有哪些常用实现方式?
- Ingress:提供集群外部到服务的HTTP/HTTPS访问的规则集合。
- 常用实现方式:
a.NGINX Ingress Controller
b.Traefik
c.HAProxy
如何限制 Kubernetes 中 Pod 资源使用?
- 通过在Pod中定义
resources
字段的requests
(申请)和limits
(限制),如CPU、内存等,防止资源争用或失控。
yaml
复制编辑
resources:
requests:
cpu: "500m"
memory: "256Mi"
limits:
cpu: "1"
memory: "512Mi"
Pod如何实现亲和性与反亲和性?
亲和性与反亲和性通过节点亲和性(NodeAffinity)和Pod亲和性(PodAffinity/PodAntiAffinity)实现。
- 亲和性(Affinity):允许Pod根据节点或其他Pod的特征调度在特定节点。
- 反亲和性(Anti-affinity):防止Pod被调度到具有特定特征的节点或与其他Pod位于同一节点。
使用nodeAffinity
指定Pod倾向于部署到特定节点,而PodAntiAffinity则避免多个相似Pod集中在同一节点上,增强容灾能力。
Kubernetes如何实现健康检查?
通过两种探针:
- Liveness Probe:检测容器是否存活,如失败则重启。
- Readiness Probe:检测容器是否准备好接收流量,如失败则不转发请求。
DaemonSet的典型应用场景是什么?
答案:
- 日志收集代理(如Fluentd)
- 节点监控Agent(如Node Exporter)
- 网络组件(如CNI插件)
DaemonSet确保每个节点运行一个Pod,通常用于基础设施服务。
Kubernetes的存储卷(Volume)有哪些常见类型?
答案:
- emptyDir:生命周期跟随Pod,仅适合临时存储。
- hostPath:挂载节点文件系统,可能有安全风险。
- PersistentVolumeClaim (PVC):与PersistentVolume关联的持久化存储卷。
- configMap与secret:挂载配置或敏感数据。
Kubernetes Pod驱逐(Eviction)原因有哪些?
答案:
- 节点资源不足(CPU/内存压力)
- 节点维护(kubectl drain操作)
- Pod违反QoS策略(超出内存limits)
- 节点NotReady、宕机等异常状态
如何实现节点隔离(Pod不调度到某节点)?
答案:
- 使用
kubectl cordon
标记节点为不可调度。 - 使用
taint
与toleration
实现节点级别Pod调度控制。
bash
复制编辑
kubectl taint nodes node01 key=value:NoSchedule
Kubernetes的调度算法主要考虑哪些因素?
答案:
- 节点资源充足性(CPU/内存)
- 节点亲和性与反亲和性
- 污点(taint)和容忍度(toleration)
- 自定义调度策略(调度扩展器)
什么是Sidecar模式,举一个典型例子?
答案:
Sidecar是指在Pod中使用辅助容器,增强主容器功能。典型例子:Istio中Envoy代理作为Sidecar,实现流量管理、安全策略、监控等功能。
Kubernetes如何保证Secret的安全性?
答案:
- Secret以Base64编码存储在etcd中。
- 生产环境中应启用etcd加密。
- RBAC限制访问Secret的权限。
- 使用第三方密钥管理系统(如Vault)更安全。
Kubernetes中QoS的三种类型有哪些?
答案:
- Guaranteed:设置相同的requests和limits,保证资源。
- Burstable:requests < limits,可能资源被限制或驱逐。
- BestEffort:没有设置requests和limits,资源最低保证。
Kubernetes如何实现扩容缩容(弹性伸缩)?
答案:
- Pod级:Horizontal Pod Autoscaler (HPA),根据CPU、内存等指标自动扩缩容。
- 节点级:Cluster Autoscaler,根据资源不足自动增加或减少节点。
为什么要设置PodDisruptionBudget?
答案:
PodDisruptionBudget定义允许同时不可用Pod的数量,用于保护应用高可用,避免维护或升级时服务中断。
kube-proxy有哪些实现模式,各自优缺点?
答案:
- userspace模式(已弃用):性能低,转发开销大。
- iptables模式(常用):性能中等,规则复杂,容易扩展。
- ipvs模式(推荐):性能高,负载均衡功能更强。
Kubernetes资源配额(ResourceQuota)如何工作?
答案:
通过ResourceQuota限制namespace内可申请资源的总量(CPU、内存、Pod数量),确保多租户环境的公平资源分配。
什么是Admission Controller,常用的有哪些?
答案:
Admission Controller在API Server接收请求时对资源进行准入检查,决定是否允许操作。
常用的有:
- NamespaceLifecycle
- LimitRanger
- ResourceQuota
- PodSecurityPolicy(已弃用,推荐OPA或Kyverno)
- ValidatingAdmissionWebhook与MutatingAdmissionWebhook
什么是Vertical Pod Autoscaler (VPA),如何工作?
答案:
VPA根据Pod历史资源使用情况自动调整Pod资源请求(CPU/内存)。当Pod重建时,以更合适的资源配置重启。
如何排查Pod无法启动的问题?
答案:
- 查看Pod事件:
bash
复制编辑
kubectl describe pod <pod-name>
- 检查容器日志:
bash
复制编辑
kubectl logs <pod-name> -c <container-name>
- 节点资源检查:
bash
复制编辑
kubectl top nodes
- 节点状态检查:
bash
复制编辑
kubectl get nodes
Kubernetes网络策略(NetworkPolicy)如何实现Pod间通信控制?
答案:
NetworkPolicy通过label选择Pod,基于Ingress/Egress规则定义允许或拒绝Pod间网络访问,配合网络插件(如Calico)实现网络隔离策略。
示例:
yaml
复制编辑
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
以上规则将禁止namespace内所有Pod的进出流量。
如何查看 Kubernetes 集群中的资源使用情况?
答案:
可使用 kubectl top
命令:
bash
复制编辑
kubectl top nodes # 节点资源
kubectl top pods # Pod资源
需提前安装 Metrics Server 组件。
Kubernetes PVC 与 PV 的关系是什么?
答案:
- PV(PersistentVolume):管理员提供的持久化存储资源。
- PVC(PersistentVolumeClaim):用户对存储资源的申请,PVC绑定到合适的PV上供Pod使用。
为什么不建议在生产环境中使用 latest 镜像标签?
答案:
- latest标签不明确,难以跟踪版本。
- latest镜像变化频繁,可能出现不可控的行为。
- 影响滚动升级和回滚机制。
Horizontal Pod Autoscaler (HPA) 基于什么指标扩缩容?
答案:
默认基于CPU或内存,也可自定义指标(Custom Metrics)或外部指标(External Metrics)进行扩缩容,如队列长度或HTTP请求数。
什么是 CSI(容器存储接口),有什么作用?
答案:
CSI(Container Storage Interface)是一种标准接口,用于将各种存储系统连接到Kubernetes。通过CSI插件,用户可以使用任意外部存储系统,如Ceph、NFS、AWS EBS、阿里云盘等。
Kubernetes中,Pod资源限制超出时会发生什么?
答案:
- 超过内存(limits):Pod会被OOMKilled,容器自动重启。
- 超过CPU(limits):Pod被CPU限流(CPU被throttle),性能受限,但不会被驱逐或杀掉。
Pod的状态(Pod Phase)有哪些?
答案:
- Pod的状态(Pod Phase)通常包括以下几种:
Pending(等待中)
a.Pod已被创建,但尚未调度到节点上,或正在拉取镜像。
Running(运行中)
- Pod已经成功调度到节点上,且所有容器都已创建并至少有一个容器处于运行状态。
Succeeded(成功)
- Pod中的所有容器都已成功执行并退出(容器状态为0),常见于一次性任务型Pod。
Failed(失败)
- Pod中的至少一个容器异常退出(非0退出码),或者启动过程中发生了严重错误。
Unknown(未知)
- Pod状态无法被Kubernetes节点准确报告,可能节点故障、网络中断或其他通讯异常所致。
Kubernetes中,imagePullPolicy
有哪些可选值,意义是什么?
答案:
- 在 Kubernetes 中,
imagePullPolicy
有以下三个可选值:
Always
a.latest
标签镜像(默认策略)。
b.镜像频繁更新,确保总能拉到最新版本。
- 含义:每次启动容器时,总是尝试重新拉取镜像,即使本地已存在该镜像。
- 适用场景:
IfNotPresent
- 使用固定版本号(例如:
myapp:v1.0.1
)的镜像。 - 降低镜像拉取频率,加速 Pod 启动。
- 含义:只有当本地不存在指定镜像时才会去远程仓库拉取镜像。
- 适用场景:
Never
- 离线环境或镜像提前加载到节点本地的情况。
- 确保严格控制镜像来源,不允许从远程仓库获取。
- 含义:永远不会主动去拉取镜像,必须使用本地已存在的镜像。
- 适用场景:
默认规则:
- 当镜像标签为
latest
时,默认值为:Always。 - 当镜像标签不是
latest
时,默认值为:IfNotPresent。
为什么生产环境中建议给Pod定义readinessProbe和livenessProbe?
答案:
- readinessProbe:避免流量被转发到未就绪Pod。
- livenessProbe:自动重启异常Pod,提高服务可用性。
Kubernetes Pod 重启策略有哪些?
答案:
- Always(默认):容器异常退出后自动重启。
- OnFailure:容器异常退出时才重启,成功完成则不重启。
- Never:无论成功失败,容器退出后都不重启。
Kubernetes容器探针(Probe)的三种探测方式是什么?
答案:
- Exec:执行命令,成功返回0则探测成功。
- HTTPGet:通过HTTP请求健康检查。
- TCPSocket:通过TCP端口检查容器是否正常运行。
Kubernetes PersistentVolume的生命周期如何管理?
答案:
Provisioning(创建)
- 静态创建(Static Provisioning)
- 管理员预先创建 PV,定义存储容量、访问模式和存储介质。
- 动态创建(Dynamic Provisioning)
- 用户提交 PVC (PersistentVolumeClaim) 时,动态创建 PV。
- 需要使用 StorageClass 来定义存储配置和创建规则。
Binding(绑定)
- 当用户创建 PersistentVolumeClaim (PVC) 时,Kubernetes 会根据 PVC 指定的要求(容量、访问模式、存储类别)寻找合适的 PV 并绑定。
- PV 与 PVC 一旦绑定,进入 Bound 状态,两者形成一对一绑定关系。
Using(使用)
- PV 绑定到 PVC 后,Pod 可通过 PVC 挂载并使用存储。
- PV 在 Bound 状态期间持续提供存储服务。
Releasing(释放)
- 用户删除 PVC 后,对应的 PV 状态会变成 Released。
- 此时数据依旧存在,但无法再被其他 PVC 使用,等待管理员处理。
Reclaiming(回收策略)
PV 的回收策略(Reclaim Policy)决定 PV 被释放后的行为。可选的策略包括:
策略 | 说明 | 场景举例 |
Retain | 保留 PV 和其上的数据,管理员手动清理 | 数据保护场景 |
Recycle(已废弃) | 删除数据,清空 PV,回收再利用(K8s 1.23起已移除) | 已废弃,不再使用 |
Delete | 删除 PV 和后端存储的数据 | 临时数据或非关键场景 |
- 推荐策略:
a.对于关键数据或生产环境:使用 Retain
,数据由管理员人工处理。
b.对于临时数据:使用 Delete
,PV 和数据会自动清理。
解释一下Kubernetes中的ResourceQuota和LimitRange的区别?
ResourceQuota限制的是Namespace整体资源申请总量,LimitRange则限制单个Pod容器可申请的资源范围(如CPU、内存),以保证多租户环境下的资源公平分配。
描述Kubernetes的RBAC授权原理?
RBAC通过Role定义资源操作权限,通过RoleBinding将权限绑定给用户或ServiceAccount。ClusterRole与ClusterRoleBinding用于跨Namespace的权限定义。
Ingress Controller如何实现请求路由与流量管理?
Ingress Controller接收Ingress资源定义的HTTP(S)规则,根据Host、路径(path)等将外部请求路由到不同的Service上。常用的Ingress Controller有NGINX、Traefik、HAProxy、Envoy等。
Service Mesh与Ingress有什么区别?
Ingress仅实现外部到集群服务的HTTP(s)流量入口路由,Service Mesh则覆盖服务间通信,包括流量管理、服务发现、负载均衡、熔断、监控、认证等更全面的能力。
什么是容器探针,分别解释Liveness、Readiness、Startup探针?
- Liveness探针:确定容器是否存活,失败时重启容器。
- Readiness探针:容器是否准备好接受流量,未就绪时不会接收请求。
- Startup探针:用于慢启动应用,确保启动完成前不触发其他探针,以防止误判重启。