
监控是运维的眼睛。我们采用Prometheus采集指标,Grafana可视化,AlertManager实现告警。
核心指标采集(Node Exporter + 自定义Exporter) :
# prometheus.yml 配置
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['192.168.1.10:9100', '192.168.1.11:9100']
- job_name: 'app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app-service:8080']告警规则示例(CPU/内存/磁盘) :
groups:
- name: host_alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "CPU使用率超过80% ({{ $value }})"
- alert: OutOfMemory
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes > 0.9
for: 2m
annotations:
summary: "内存使用率超过90%"告警路由与屏蔽:通过AlertManager的route和inhibit_rules实现分级通知(P0级电话、P3级邮件)及告警风暴抑制。
日志是排查问题的第一手资料。使用Filebeat采集、Logstash解析、Elasticsearch存储、Kibana展示。
Filebeat配置(采集应用日志) :
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/app/*.log
fields:
app: my-service
env: production
output.logstash:
hosts: ["logstash:5044"]Logstash Grok解析(提取关键字段) :
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" }
}
date {
match => [ "timestamp", "ISO8601" ]
}
}日志告警:结合ElastAlert实现日志异常告警(如频繁ERROR日志触发钉钉通知)。
CI/CD是DevOps的核心实践。我们采用声明式Pipeline实现构建、测试、打包、部署的自动化。
Jenkinsfile 示例:
pipeline {
agent any
environment {
DOCKER_REGISTRY = 'registry.example.com'
APP_NAME = 'order-service'
}
stages {
stage('Checkout') {
steps { git 'https://github.com/team/order-service.git' }
}
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Build Image') {
steps {
sh """
docker build -t ${DOCKER_REGISTRY}/${APP_NAME}:${BUILD_NUMBER} .
docker push ${DOCKER_REGISTRY}/${APP_NAME}:${BUILD_NUMBER}
"""
}
}
stage('Deploy to K8s') {
steps {
sh """
kubectl set image deployment/${APP_NAME} ${APP_NAME}=${DOCKER_REGISTRY}/${APP_NAME}:${BUILD_NUMBER} -n production
kubectl rollout status deployment/${APP_NAME} -n production
"""
}
}
}
post {
failure {
emailext subject: "构建失败 - ${APP_NAME} #${BUILD_NUMBER}",
body: "请检查Jenkins控制台日志。"
}
}
}Kubernetes是云原生运维的核心。下面是一个完整的Deployment + Service + Ingress配置。
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
namespace: production
spec:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: app
image: registry.example.com/order-service:latest
ports:
- containerPort: 8080
env:
- name: DB_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: order-service
namespace: production
spec:
selector:
app: order-service
ports:
- port: 80
targetPort: 8080
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: order-service
namespace: production
spec:
rules:
- host: api.example.com
http:
paths:
- path: /orders
pathType: Prefix
backend:
service:
name: order-service
port:
number: 80HPA(自动扩缩容) :
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: order-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: order-service
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70通过脚本实现常见故障的自动修复。
监控触发自愈脚本(清理磁盘) :
#!/usr/bin/env python3
import subprocess, shutil, logging
logging.basicConfig(level=logging.INFO)
def clean_docker_logs():
"""清理Docker容器日志,释放磁盘空间"""
result = subprocess.run(['docker', 'system', 'df', '--format', '{{.Size}}', '--filter', 'type=volume'], capture_output=True, text=True)
logging.info(f"当前磁盘使用: {result.stdout}")
# 清理所有容器的日志文件
shutil.rmtree('/var/lib/docker/containers/*/*-json.log', ignore_errors=True)
subprocess.run(['docker', 'system', 'prune', '-f'])
if __name__ == '__main__':
# 检查磁盘使用率,若超过85%则清理
usage = int(subprocess.check_output("df -h / | awk 'NR==2{print $5}' | sed 's/%//'", shell=True).decode().strip())
if usage > 85:
clean_docker_logs()
logging.info("磁盘清理完成")Ansible自动化运维(批量更新配置) :
- name: Update nginx configuration
hosts: webservers
tasks:
- name: copy new config
copy:
src: /local/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
notify: reload nginx
handlers:
- name: reload nginx
systemd:
name: nginx
state: reloaded通过Chaos Mesh或自行注入故障,验证系统韧性:
# 模拟Pod删除
kubectl delete pod -l app=order-service --force --grace-period=0
# 模拟网络延迟(使用tc命令)
tc qdisc add dev eth0 root netem delay 100ms将演练结果纳入监控,持续优化。
DevOps运维的现代化实践可概括为 “可观测+自动化+韧性” 三位一体:
本文提供的监控告警、日志分析、CI/CD流水线、K8s部署及自动化运维脚本,均已在实际生产环境中验证。DevOps工程师的核心能力在于 将重复性操作代码化、将故障恢复流程自动化——用代码定义基础设施,用代码管理配置,用代码驱动自愈。掌握这套全链路技术,便能在云原生浪潮中从容应对复杂运维挑战。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。