ingress-nginx备份策略:配置和数据备份
概述
在现代Kubernetes环境中,ingress-nginx作为最流行的Ingress控制器之一,承载着关键的网络流量路由功能。一个完善的备份策略不仅能确保业务连续性,还能在灾难恢复时快速重建整个ingress基础设施。本文将深入探讨ingress-nginx的完整备份方案,涵盖配置、证书、数据等多个维度。
需要备份的关键组件
1. 配置类资源
# ConfigMap配置备份
apiVersion: v1
kind: ConfigMap
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
data:
map-hash-bucket-size: "128"
ssl-protocols: "TLSv1.2 TLSv1.3"
# 其他NGINX配置参数
2. TLS证书和密钥
- Ingress资源中引用的TLS证书
- 默认SSL证书(如配置)
- OCSP响应缓存
3. 核心Kubernetes资源
备份策略设计
策略一:基于Velero的完整备份
Velero是Kubernetes生态中最成熟的备份工具,支持应用感知的备份和恢复。
# 安装Velero
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.5.0 \
--bucket my-backup-bucket \
--backup-location-config region=us-west-2 \
--snapshot-location-config region=us-west-2
# 创建ingress-nginx命名空间备份
velero backup create ingress-nginx-backup \
--include-namespaces ingress-nginx \
--wait
策略二:基于kubectl的配置导出
对于简单的配置备份,可以使用kubectl进行资源导出:
#!/bin/bash
# ingress-nginx备份脚本
BACKUP_DIR="/backup/ingress-nginx/$(date +%Y%m%d-%H%M%S)"
mkdir -p $BACKUP_DIR
# 导出所有相关资源
kubectl get -n ingress-nginx all -o yaml > $BACKUP_DIR/all-resources.yaml
kubectl get -n ingress-nginx configmap -o yaml > $BACKUP_DIR/configmaps.yaml
kubectl get -n ingress-nginx secret -o yaml > $BACKUP_DIR/secrets.yaml
kubectl get -n ingress-nginx ingress -o yaml > $BACKUP_DIR/ingresses.yaml
# 导出CRD定义
kubectl get crd -l app.kubernetes.io/name=ingress-nginx -o yaml > $BACKUP_DIR/crds.yaml
策略三:GitOps风格的配置管理
将配置存储在Git仓库中,实现版本控制和审计:
# .github/workflows/ingress-backup.yaml
name: Ingress-NGINX Config Backup
on:
schedule:
- cron: '0 2 * * *' # 每天凌晨2点
workflow_dispatch:
jobs:
backup:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup kubectl
uses: azure/setup-kubectl@v3
- name: Backup resources
run: |
mkdir -p backup/$(date +%Y%m%d)
kubectl get -n ingress-nginx all -o yaml > backup/$(date +%Y%m%d)/all-resources.yaml
kubectl get -n ingress-nginx configmap -o yaml > backup/$(date +%Y%m%d)/configmaps.yaml
kubectl get -n ingress-nginx secret -o yaml > backup/$(date +%Y%m%d)/secrets.yaml
- name: Commit and push
run: |
git config user.name "GitHub Actions"
git config user.email "actions@github.com"
git add backup/
git commit -m "Backup ingress-nginx config $(date)"
git push
证书管理备份策略
TLS证书是ingress-nginx中最关键的安全资产,需要特别关注:
证书备份方案
# 导出所有TLS证书
kubectl get secret -n ingress-nginx --field-selector type=kubernetes.io/tls -o yaml > tls-secrets.yaml
# 单独备份默认SSL证书
DEFAULT_CERT=$(kubectl get deployment -n ingress-nginx ingress-nginx-controller \
-o jsonpath='{.spec.template.spec.containers[0].env[?(@.name=="SSL_CERT")].value}')
if [ ! -z "$DEFAULT_CERT" ]; then
kubectl get secret -n ingress-nginx $DEFAULT_CERT -o yaml > default-cert.yaml
fi
证书恢复验证流程
数据持久化备份
如果ingress-nginx使用了持久化存储(如访问日志):
PVC备份方案
# values.yaml - 启用持久化存储
controller:
metrics:
enabled: true
serviceMonitor:
enabled: true
stats:
enabled: true
# 访问日志持久化配置
volumeMounts:
- name: access-logs
mountPath: /var/log/nginx
volumes:
- name: access-logs
persistentVolumeClaim:
claimName: nginx-access-logs
对应的备份策略:
# 使用Velero备份PVC
velero backup create ingress-nginx-pvc-backup \
--include-resources persistentvolumeclaims,persistentvolumes \
--include-namespaces ingress-nginx \
--snapshot-volumes \
--wait
备份验证和恢复测试
恢复验证清单
检查项 | 预期结果 | 验证方法 |
---|---|---|
ConfigMap配置 | 与备份一致 | kubectl get cm -o yaml |
TLS证书状态 | Valid/Ready | kubectl describe certificate |
Ingress路由 | 路由规则正确 | kubectl get ingress -o yaml |
服务端点 | Endpoints正常 | kubectl get endpoints |
NGINX配置 | 语法正确 | kubectl logs -c nginx |
证书链 | 完整且有效 | openssl s_client -connect |
自动化验证脚本
#!/bin/bash
# restore-validation.sh
# 验证ConfigMap
kubectl get cm -n ingress-nginx ingress-nginx-controller -o jsonpath='{.data}' | jq . > current-config.json
diff current-config.json backup/config.json
# 验证证书
for cert in $(kubectl get certificate -n ingress-nginx -o name); do
status=$(kubectl get $cert -n ingress-nginx -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}')
if [ "$status" != "True" ]; then
echo "ERROR: Certificate $cert not ready"
exit 1
fi
done
# 验证Ingress路由
kubectl get ingress -A -o jsonpath='{.items[*].spec.rules[*].host}' | tr ' ' '\n' > current-hosts.txt
diff current-hosts.txt backup/hosts.txt
监控和告警
备份状态监控
# prometheus-backup-rules.yaml
groups:
- name: ingress-nginx-backup
rules:
- alert: IngressBackupFailed
expr: velero_backup_status{backup="ingress-nginx-backup"} == 0
for: 1h
labels:
severity: critical
annotations:
summary: "Ingress-NGINX备份失败"
description: "ingress-nginx命名空间的备份已经失败超过1小时"
- alert: CertificateExpiringSoon
expr: ingress_nginx_ssl_certificate_expire_time_seconds < 86400 * 7 # 7天内过期
for: 5m
labels:
severity: warning
annotations:
summary: "SSL证书即将过期"
description: "有一个或多个SSL证书将在7天内过期"
最佳实践总结
备份频率建议
资源类型 | 备份频率 | 保留策略 |
---|---|---|
ConfigMap | 实时(GitOps) | 永久保留 |
TLS证书 | 每天 | 保留30天 |
PVC数据 | 每周 | 保留90天 |
完整状态 | 每月 | 保留1年 |
恢复时间目标(RTO)规划
结语
建立一个完整的ingress-nginx备份策略需要综合考虑配置、证书、数据等多个维度。通过结合Velero、GitOps和自定义脚本,可以构建出既可靠又灵活的备份解决方案。定期测试恢复流程,确保在真正需要时能够快速有效地恢复服务,是保障业务连续性的关键。
记住,最好的备份策略是那个你定期测试并验证可用的策略。不要等到灾难发生时才发现备份不可用或恢复流程存在问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考