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

关于k8s调度、安全、监控的进阶操作

一、调度(Scheduling)—— 让 Pod 跑在“对的地方”
1.1 基础调度机制回顾
kube-scheduler 默认基于资源请求(requests)、亲和性(affinity)、污点(taints)等策略调度。 但生产环境需要更精细控制。

1.2 进阶调度策略
1.2.1 Taints & Tolerations(污点与容忍)
用于“排斥”某些 Pod,常用于专用节点(如 GPU、隔离测试环境)。

# 给节点打污点
kubectl taint nodes node-gpu dedicated=gpu:NoSchedule# Pod 容忍该污点
spec:
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "gpu"
    effect: "NoSchedule"

1.2.2 Node Affinity(节点亲和性)
比 nodeSelector 更强大,支持 requiredDuringScheduling(硬约束)和 preferredDuringScheduling(软约束)

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: topology.kubernetes.io/zone
            operator: In
            values: ["us-east-1a"]

1.2.3 Pod Affinity/Anti-Affinity
控制 Pod 之间的共置关系。例如:避免两个相同服务实例跑在同一节点(高可用)。

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchLabels:
          app: my-app
      topologyKey: kubernetes.io/hostname

1.2.4 Pod Topology Spread Constraints(拓扑分布约束)
K8s 1.19+ 推荐方式,实现跨 zone/region 的均匀分布。

topologySpreadConstraints:
- maxSkew: 1
  topologyKey: topology.kubernetes.io/zone
  whenUnsatisfiable: DoNotSchedule
  labelSelector:
    matchLabels:
      app: my-app

1.2.5 PodDisruptionBudget(PDB)
保障滚动更新或节点维护时,最小可用副本数。

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-pdb
spec:
  minAvailable: 2  # 或 maxUnavailable: 1
  selector:
    matchLabels:
      app: my-app

二、安全(Security)—— 构建零信任的 K8s 环境
2.1 RBAC(Role-Based Access Control)
控制“谁能在哪个命名空间做什么”。

步骤: 创建 ServiceAccount 定义 Role / ClusterRole(权限集合) 绑定 RoleBinding / ClusterRoleBinding

# Role:仅允许读取 pods
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]---
# 绑定 SA 到 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: dev
subjects:
- kind: ServiceAccount
  name: ci-bot
  namespace: dev
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

2.2 NetworkPolicy(网络策略)
默认 Pod 之间全通!NetworkPolicy 实现微隔离(Zero Trust)。

示例:只允许前端访问后端

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: prod
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          team: frontend
      podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

前提:CNI 插件支持(如 Calico、Cilium、Weave)。Flannel 不支持!

2.3 其他安全实践
启用 Pod Security Admission(PSA) 或 OPA/Gatekeeper
使用 Seccomp / AppArmor / SELinux 限制容器系统调用
镜像签名(Cosign) + 扫描(Trivy)
三、监控与弹性伸缩(Observability & Autoscaling)
3.1 HPA(Horizontal Pod Autoscaler)
基于 CPU、内存或自定义指标自动扩缩容。

步骤:部署 Metrics Server(必须!)

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

创建 HPA

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Pods
    pods:
      metric:
        name: http_requests_per_second
      target:
        type: AverageValue
        averageValue: "100"

高级:结合 Prometheus Adapter 支持任意指标(如 QPS、延迟) 3.2 VPA(Vertical Pod Autoscaler)【可选但加分】 自动调整 Pod 的 requests/limits(需重启 Pod)。

# 安装 VPA
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler/
./hack/vpa-up.sh
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       Deployment
    name:       my-app
  updatePolicy:
    updateMode: "Auto"  # 或 "Off"(仅建议模式)

3.3 日志与监控体系
3.3.1 日志收集(Logging)
EFK Stack:Elasticsearch + Fluentd/Fluent Bit + Kibana Loki + Promtail + Grafana(轻量级,推荐)

# Fluent Bit DaemonSet 示例(采集 /var/log/containers/*.log)
# 输出到 Elasticsearch 或 Loki

3.3.2 监控(Monitoring)
Prometheus + Grafana:黄金标准 Prometheus Operator(含 Alertmanager) kube-state-metrics Node Exporter 关键看板:集群资源、Pod 状态、API Server 延迟、etcd 健康度

3.3.3 分布式追踪(Tracing)
Jaeger / OpenTelemetry

四、面试高频问题示例
面试题 1:
“如何确保一个关键应用在节点维护期间始终有至少 3 个副本在线?”

✅ 参考答案要点:

使用 PodDisruptionBudget(PDB) 设置 minAvailable: 3
结合 多可用区部署 + Topology Spread Constraints 避免单点故障
滚动更新策略设置 maxUnavailable: 0(蓝绿发布更佳)
面试题 2:
“开发团队反馈他们的 Pod 无法访问数据库 Pod,但网络是通的,可能是什么原因?如何排查?”

✅ 参考答案要点:

检查是否启用了 NetworkPolicy,数据库 Pod 是否只允许特定标签/命名空间访问
使用 kubectl describe netpol 查看策略
临时创建 debug Pod 测试连通性:

kubectl run debug --image=busybox -it --rm -- sh
wget -qO- http://db-svc:5432

检查 CNI 插件是否支持 NetworkPolicy(如 Calico)

面试题 3:
“HPA 基于自定义指标(如每秒请求数)扩缩容,如何实现?”

✅ 参考答案要点:

部署 Prometheus 采集应用指标(如通过 /metrics 暴露 http_requests_total)
安装 Prometheus Adapter,将 Prometheus 指标暴露给 Kubernetes API
在 HPA 中引用该指标:

metrics:
- type: Object
  object:
    metric:
      name: requests_per_second
    describedObject:
      apiVersion: apps/v1
      kind: Deployment
      name: my-app
    target:
      type: Value
      value: "100"

验证:kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"

http://www.jsqmd.com/news/53388/

相关文章:

  • 短信发送-阿里云
  • Codeforces Round 1051 (Div. 2) 补题记录
  • 常用 trick 记录
  • Motia:未来平台
  • 移动端开发
  • 代码随想录算法训练营第四章 字符串part01
  • 用ikuai软路由提供内网NTP服务
  • US$213.75 Xhorse Key Tool Midi Basic Version Update to Advanced Version Service
  • AutoVEI Truck Explorer Locksmith 2025: 700 Tokens for Truck Programming Diagnostics
  • DC-2渗透测试 - fish666
  • AutoVEI Truck Explorer 2025 Updated: 700 Tokens Programming Diagnostic Tool for Euro/Amer Trucks
  • k8s核心组件详解
  • BLOG迁移: 从Halo + CF Tunnel 到 Hugo + github + Cloudflare page
  • JDK:Linux下载安装jdk1.8
  • 图论中的核心C++算法,包括存储结构、核心思路、速记口诀以及学习方法, 一站式上机考试学习
  • hive 中 group by 和 distinct 孰优孰劣?
  • DDD抽奖项目业务回顾
  • API设计最佳实践 - 智慧园区
  • Python高阶知识点整理
  • 第4单元检测卷
  • javascript下载文件五种方式
  • ubunutu连接蓝牙键盘鼠标
  • 详细介绍:从 1.0 到 13.0:C# 十八年进化史,一部写给开发者的语言成长记
  • 生研界:技术赋能,AI如何重塑医学科研生态?
  • 2025ICPC区域赛成都站记——为者败之,执者失之
  • quickfox windows 海外回国加速器 会导致部分国外网站不能使用
  • 4433
  • 在VMware Workstation设置虚拟机的VNC连接功能
  • rust基础第三篇:所有权
  • Houdini软件简介