当前位置:首页 > 技术 > 正文内容

Kubernetes集群数据备份与容器镜像构建实践

访客 技术 2026年5月23日 3

一、使用Velero和MinIO实现etcd数据备份恢复

Velero是VMware开源的Kubernetes灾难恢复工具,支持集群资源的安全备份、恢复和迁移。

Velero与etcd快照对比

  • etcd快照为全局备份,恢复时影响其他服务
  • Velero支持按namespace或资源对象精确备份
  • Velero支持多种对象存储,etcd快照仅为本地文件
  • Velero内置定时备份功能

备份流程

  1. 客户端创建Backup任务
  2. 控制器获取备份任务
  3. 控制器从API Server获取数据
  4. 数据备份到对象存储

1.1 部署MinIO存储

mkdir -p /data/minio
docker run --name minio \
  -p 9000:9000 -p 9999:9999 \
  -d --restart=always \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=12345678" \
  -v /data/minio/data:/data \
  registry.cn-hangzhou.aliyuncs.com/wuhaolam/baseimage:minio-RELEASE.2022-04-12T06-55-35Z \
  server /data --console-address '0.0.0.0:9999'

1.2 部署Velero

wget https://github.com/vmware-tanzu/velero/releases/download/v1.11.1/velero-v1.11.1-linux-amd64.tar.gz
tar xvf velero-v1.11.1-linux-amd64.tar.gz
cp velero-v1.11.1-linux-amd64/velero /usr/local/bin/

mkdir -p /data/velero
cat > velero-auth.txt << EOF
[default]
aws_access_key_id = admin
aws_secret_access_key = 12345678
EOF

velero --kubeconfig /root/.kube/config install \
  --provider aws \
  --plugins registry.cn-hangzhou.aliyuncs.com/zhangshijie/velero-plugin-for-aws:v1.7.1 \
  --bucket velerodata \
  --secret-file ./velero-auth.txt \
  --use-volume-snapshots=false \
  --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://10.243.20.239:9000

1.3 验证备份恢复

# 备份指定namespace
DATE=$(date +%F-%H%M%S)
velero backup create default-namespace-${DATE} \
  --include-cluster-resources=true \
  --include-namespaces default,velero \
  --kubeconfig=/root/.kube/config \
  --namespace velero

# 删除Pod并恢复
kubectl delete pod test-centos
velero restore create --from-backup default-namespace-${DATE} \
  --wait --kubeconfig=/root/.kube/config --namespace velero

二、使用nerdctl+BuildKit+Containerd构建镜像

2.1 安装Containerd

vim /etc/profile
# 添加:source <(nerdctl completion bash)
source /etc/profile
nerdctl login --username=wuhaolam registry.cn-hangzhou.aliyuncs.com

2.2 部署BuildKit

tar xf buildkit-v0.12.1.linux-amd64.tar.gz -C /usr/local/src/
mv /usr/local/src/bin/* /usr/local/bin/

cat > /lib/systemd/system/buildkit.socket << EOF
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
[Socket]
ListenStream=%t/buildkit/buildkitd.sock
[Install]
WantedBy=sockets.target
EOF

cat > /lib/systemd/system/buildkitd.service << EOF
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socket
Documentation=https://github.com/moby/buildkit
[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true
[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable buildkitd
systemctl restart buildkitd

2.3 构建镜像

mkdir -p /data/dockerfile/nginx
cd /data/dockerfile/nginx

cat > image-build.sh << EOF
#!/bin/bash
/usr/local/bin/nerdctl build -t registry.cn-hangzhou.aliyuncs.com/wuhaolam/myserver:ubuntu-nginx-20240214 .
/usr/local/bin/nerdctl push registry.cn-hangzhou.aliyuncs.com/wuhaolam/myserver:ubuntu-nginx-20240214
EOF

bash image-build.sh

三、Pod生命周期与调度机制

3.1 Pod生命周期

  1. 创建Pause基础容器
  2. 执行Init容器初始化
  3. 启动主容器并执行postStart钩子
  4. 运行startupProbe启动探针
  5. 执行readinessProbe和livenessProbe
  6. 删除时执行preStop钩子

3.2 Pod常见状态

Unschedulable    # 无法调度
PodScheduled     # 已调度
Pending          # 创建中
Running          # 运行中
Failed           # 启动失败
Unknown          # 状态未知

3.3 调度流程

  1. kubelet创建Pod事件写入etcd
  2. kube-scheduler监听并调度
  3. 调度结果写入etcd
  4. kubelet在节点创建Pod
  5. kube-proxy创建网络规则

四、Pause与Init容器详解

4.1 Pause容器

Pause容器作为Pod的基础容器,提供网络命名空间共享:

  • 共享NET、IPC、UTS命名空间
  • Pod只有一个IP地址
  • 容器间可localhost通信

4.2 Init容器

Init容器在主容器启动前执行:

  • 准备运行环境
  • 下载业务数据
  • 检查依赖服务

五、探针机制与健康检查

5.1 探针类型

  • startupProbe: 启动检测
  • livenessProbe: 存活检测
  • readinessProbe: 就绪检测

5.2 探针配置参数

initialDelaySeconds: 120  # 初始延迟
periodSeconds: 60         # 检测间隔
timeoutSeconds: 5         # 超时时间
successThreshold: 1       # 成功阈值
failureThreshold: 3       # 失败阈值

5.3 探针示例

livenessProbe:
  exec:
    command:
      - /usr/local/bin/redis-cli
      - quit
  initialDelaySeconds: 10
  periodSeconds: 3

六、Zookeeper集群部署与持久化

6.1 基于StatefulSet部署

# 创建RBAC权限
kubectl apply -f rbac.yaml

# 创建StorageClass
kubectl apply -f storageclass.yaml

# 部署NFS Provisioner
kubectl apply -f nfs-provisioner.yaml

6.2 验证集群状态

kubectl exec -it zookeeper-0 -- /usr/bin/zkServer.sh status
kubectl exec -it zookeeper-1 -- /usr/bin/zkServer.sh status
kubectl exec -it zookeeper-2 -- /usr/bin/zkServer.sh status

七、动静分离Web服务与NFS共享

7.1 Nginx配置

spec:
  containers:
    - name: nginx
      image: registry.cn-hangzhou.aliyuncs.com/wuhaolam/myserver:alpine-nginx-v4
      volumeMounts:
        - name: htmlfile
          mountPath: /apps/nginx/html
  volumes:
    - name: htmlfile
      nfs:
        server: 10.243.20.238
        path: /data/k8sdata

7.2 Tomcat配置

spec:
  containers:
    - name: tomcat
      image: registry.cn-hangzhou.aliyuncs.com/wuhaolam/myserver:centos-tomcat-v1
      volumeMounts:
        - name: jspfile
          mountPath: /data/tomcat/webapps/myapp
  volumes:
    - name: jspfile
      nfs:
        server: 10.243.20.238
        path: /data/k8sdata/static

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。