温馨提示×

centos k8s部署的容器编排策略

小樊
38
2025-12-29 12:59:41
栏目: 智能运维

CentOS 上 Kubernetes 的容器编排策略

一 编排策略总览

  • 工作负载控制器选型:无状态应用优先使用 Deployment(支持滚动更新与回滚);有状态应用使用 StatefulSet(稳定网络标识、有序部署/扩缩);节点级守护进程用 DaemonSet;批处理/定时任务用 Job/CronJob
  • 发布策略:默认采用 RollingUpdate(零停机),可按需配置 Recreate(先删后建);通过 maxSurgemaxUnavailable 控制并发度与可用性。
  • 扩缩容策略:手动 kubectl scale 或基于指标的水平扩缩 HPA(如 CPU/内存利用率),实现弹性与成本平衡。
  • 调度策略:利用 亲和/反亲和污点/容忍拓扑分散 保证高可用与资源隔离。
  • 配置与密钥:使用 ConfigMap 管理配置、Secret 管理敏感信息,结合 RollingUpdate 实现配置热更新。
  • 服务与流量:通过 Service 暴露服务,结合 readinessProbe 控制流量接入时机,必要时使用 Ingress 做七层路由与灰度。
  • 可观测性:日志(如 EFK/Loki)、指标(Prometheus/Grafana)、事件与审计共同支撑排障与容量规划。
  • 安全基线:镜像安全扫描、RBAC 最小权限、NetworkPolicy 网络隔离、关闭 Swap、内核与容器运行时调优。

二 发布与回滚策略

  • 策略选择
    • RollingUpdate:逐步替换旧 Pod,适合大多数在线业务,保证服务连续性。
    • Recreate:先终止全部旧实例再创建新实例,适合需要强一致或无法共存版本的变更。
  • 关键参数(Deployment.spec.strategy)
    • maxSurge:可超出期望副本数的最大 Pod 数量或百分比(如 25%)。
    • maxUnavailable:滚动期间允许不可用的最大 Pod 数量或百分比(如 25%)。
  • 操作流程
    • 更新镜像:kubectl set image deployment/<name> <container>=<image:vX>
    • 查看状态:kubectl rollout status deployment/<name>
    • 回滚版本:kubectl rollout undo deployment/<name>(可指定 --to-revision
  • 适用场景
    • 常规发布与快速回滚(RollingUpdate);数据库迁移/破坏性变更(Recreate)。

三 扩缩容与弹性策略

  • 手动扩缩:
    • kubectl scale deployment/<name> --replicas=<N>
  • 自动扩缩 HPA(以 autoscaling/v2 为例):
    • 指标类型:资源(CPU/内存)、自定义指标、外部指标。
    • 示例(CPU 平均利用率 50%,副本 1–10):
      apiVersion: autoscaling/v2
      kind: HorizontalPodAutoscaler
      metadata:
        name: app-hpa
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: app
        minReplicas: 1
        maxReplicas: 10
        metrics:
        - type: Resource
          resource:
            name: cpu
            target:
              type: Utilization
              averageUtilization: 50
      
    • 建议为 HPA 目标设置合理的 requests.cpu,避免调度偏差。

四 调度与高可用策略

  • 亲和与反亲和
    • 反亲和提升容灾:podAntiAffinity 将同一应用的副本分散到不同节点(按 kubernetes.io/hostname 拓扑)。
  • 污点与容忍
    • 专用节点:kubectl taint nodes <node> key=value:NoSchedule;关键业务 Pod 配置相应 tolerations 以准入。
  • 拓扑分散与打散
    • 通过 topologyKey 控制分散粒度(如节点、机架),避免单点故障域。
  • 资源与 QoS
    • 设置 requests/limits,避免资源争抢与 OOM;为关键负载预留资源或使用节点亲和保障。
  • 示例(反亲和 + 资源):
    affinity:
      podAntiAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          podAffinityTerm:
            labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values: [myapp]
            topologyKey: "kubernetes.io/hostname"
    resources:
      requests:
        cpu: "250m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "256Mi"
    

五 在 CentOS 上的落地要点

  • 系统与安全基线
    • 关闭 Swapswapoff -a 并注释 /etc/fstab 中的 swap 行;禁用 SELinux 或设为 permissive;内核开启桥接流量到 iptables:
      modprobe br_netfilter
      echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
      echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
      
  • 容器运行时与驱动
    • Containerd(推荐):/etc/containerd/config.toml 中设置 SystemdCgroup = truesystemctl enable --now containerd
    • Docker(可选):/etc/docker/daemon.json 设置 "exec-opts": ["native.cgroupdriver=systemd"]
  • 集群初始化与网络
    • 安装 kubelet/kubeadm/kubectlkubeadm init --pod-network-cidr=10.244.0.0/16
    • 安装 Flannelkubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    • 节点加入:kubeadm join ...;验证 kubectl get nodeskubectl get pods -A
  • 可观测与安全加固
    • 日志:集中式 EFK/Loki+Grafana;节点 logrotate 防止磁盘占满。
    • 监控:Prometheus/Grafana 看板与告警。
    • 网络与合规:NetworkPolicy 隔离;RBAC 最小权限;镜像漏洞扫描。

0