Kubernetes容器编排实战:从集群搭建到业务高可用的全流程配置

Kubernetes集群规划的核心参数

Kubernetes容器编排已成为DevOps实践中的基础设施标配。但”能用”和”好用”之间差距很大——一套生产可用的K8s集群,需要在网络模型、存储方案、安全策略和监控体系上做大量配置。这篇文章以kubeadm部署为例,从初始化到业务上线,覆盖所有关键配置项。

集群初始化与网络插件选型

集群初始化前先确认系统环境:

# 关闭swap
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter

# 内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
sudo sysctl --system

kubeadm init时指定pod CIDR和service CIDR,避免与现有网络冲突:

sudo kubeadm init   --apiserver-advertise-address=192.168.1.10   --pod-network-cidr=10.244.0.0/16   --service-cidr=10.96.0.0/12   --kubernetes-version=v1.30.0

网络插件选择:

Calico:企业级首选,支持BGP路由和NetworkPolicy,性能稳定
Cilium:基于eBPF,观测能力强,适合需要深度网络可观测性的场景
Flannel:简单轻量,仅适合测试和小规模集群

Calico安装:

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27/manifests/calico.yaml

验证节点就绪:

kubectl get nodes
# 所有节点STATUS应为Ready

工作节点加入与标签管理

工作节点加入集群:

kubeadm join 192.168.1.10:6443   --token <token>   --discovery-token-ca-cert-hash sha256:<hash>

生产环境需要给节点打标签,用于Pod调度:

# 按角色标记
kubectl label node worker-1 node-role.kubernetes.io/worker=""
kubectl label node worker-2 node-role.kubernetes.io/worker=""

# 按业务标记
kubectl label node worker-1 business=payment
kubectl label node worker-2 business=payment
kubectl label node worker-3 business=content

持久化存储配置

K8s的持久化存储分三个层次:StorageClass、PersistentVolume、PersistentVolumeClaim。

以NFS作为共享存储为例:

# nfs-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: nfs.csi.k8s.io
parameters:
  server: 192.168.1.100
  share: /data/k8s
reclaimPolicy: Retain
volumeBindingMode: Immediate

生产环境推荐使用CSI驱动对接云盘或Ceph:

# ceph-rbd-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
  clusterID: ceph-cluster
  pool: k8s-pool
  imageFormat: "2"
  imageFeatures: layering
reclaimPolicy: Retain
allowVolumeExpansion: true

allowVolumeExpansion: true允许在线扩容PVC,避免存储不足时需要重建Pod。

Deployment与HPA自动伸缩配置

业务应用部署用Deployment控制器,配合HPA实现自动伸缩:

# app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api-server
  template:
    metadata:
      labels:
        app: api-server
    spec:
      containers:
      - name: api-server
        image: registry.example.com/api-server:v2.1.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"
          limits:
            cpu: "2000m"
            memory: "2Gi"
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: api-server-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api-server
  minReplicas: 3
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

resources.requests必须设置,HPA基于request值计算利用率百分比。limits值设置过低会触发OOMKilled,设置过高浪费资源。经验上是limits/requests的比例控制在2-4倍。

监控告警体系搭建

K8s监控方案推荐Prometheus + Grafana + AlertManager组合。

Prometheus通过ServiceMonitor自动发现监控目标:

# servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: api-server-monitor
spec:
  selector:
    matchLabels:
      app: api-server
  endpoints:
  - port: http
    interval: 15s
    path: /metrics

关键告警规则:

# alert-rules.yaml
groups:
- name: k8s-alerts
  rules:
  - alert: PodCrashLooping
    expr: rate(kube_pod_container_status_restarts_total[5m]) > 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Pod {{ $labels.pod }} is crash looping"
  
  - alert: HighMemoryUsage
    expr: container_memory_working_set_bytes / container_spec_memory_limit_bytes > 0.85
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Container {{ $labels.container }} memory usage above 85%"
  
  - alert: NodeNotReady
    expr: kube_node_status_condition{condition="Ready",status="true"} == 0
    for: 3m
    labels:
      severity: critical
    annotations:
      summary: "Node {{ $labels.node }} is not ready"

CI/CD流水线与滚动更新策略

K8s滚动更新默认策略是RollingUpdate,maxSurge和maxUnavailable两个参数控制更新节奏:

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 最多多出1个Pod
      maxUnavailable: 0  # 不允许任何Pod不可用

maxUnavailable: 0确保更新过程中服务零中断,但更新速度会慢。流量高的业务场景用1/0或25%/0,流量低的可以0/1加快更新。

完整的CI/CD流程:代码推送 → 构建镜像 → 推送Registry → kubectl set image → 等待rollout完成 → 运行冒烟测试:

# 构建并推送
docker build -t registry.example.com/api-server:v2.1.0 .
docker push registry.example.com/api-server:v2.1.0

# 更新部署
kubectl set image deployment/api-server   api-server=registry.example.com/api-server:v2.1.0

# 等待rollout完成
kubectl rollout status deployment/api-server --timeout=300s

# 回滚(如需要)
kubectl rollout undo deployment/api-server

Kubernetes容器编排体系的搭建没有捷径,每个组件的配置都需要根据实际业务负载调优。掌握以上核心配置项后,集群具备了承载生产业务的基础能力,后续围绕安全加固、多租户隔离和灾备方案逐步完善即可。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-rong-qi-bian-pai-shi-zhan-cong-ji-qun-da-jian/

(0)
小编小编
上一篇 11小时前
下一篇 11小时前

相关推荐