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/