Kubernetes集群数据备份与容器镜像构建实践
一、使用Velero和MinIO实现etcd数据备份恢复
Velero是VMware开源的Kubernetes灾难恢复工具,支持集群资源的安全备份、恢复和迁移。
Velero与etcd快照对比
- etcd快照为全局备份,恢复时影响其他服务
- Velero支持按namespace或资源对象精确备份
- Velero支持多种对象存储,etcd快照仅为本地文件
- Velero内置定时备份功能
备份流程
- 客户端创建Backup任务
- 控制器获取备份任务
- 控制器从API Server获取数据
- 数据备份到对象存储
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生命周期
- 创建Pause基础容器
- 执行Init容器初始化
- 启动主容器并执行postStart钩子
- 运行startupProbe启动探针
- 执行readinessProbe和livenessProbe
- 删除时执行preStop钩子
3.2 Pod常见状态
Unschedulable # 无法调度
PodScheduled # 已调度
Pending # 创建中
Running # 运行中
Failed # 启动失败
Unknown # 状态未知
3.3 调度流程
- kubelet创建Pod事件写入etcd
- kube-scheduler监听并调度
- 调度结果写入etcd
- kubelet在节点创建Pod
- 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