Kubernetes
一、基础知识
1. 概念和术语
2. Kubernetes特性
3. 集群组件
4. 抽象对象
5. 镜像加速下载
二、安装部署kubeadm
1. 基础环境准备
2. 安装runtime容器(Docker)
3. 安装runtime容器(Contained)
4. Containerd进阶使用
5. 部署kubernets集群
6. 部署calico网络组件
7. 部署NFS文件存储
8. 部署ingress-nginx代理
9. 部署helm包管理工具
10. 部署traefik代理
11. 部署dashboard管理面板(官方)
12. 部署kubesphere管理面板(推荐)
12. 部署metrics监控组件
13. 部署Prometheus监控
14. 部署elk日志收集
15. 部署Harbor私有镜像仓库
16. 部署minIO对象存储
17. 部署jenkins持续集成工具
三、kubectl命令
1. 命令格式
2.node操作常用命令
3. pod常用命令
4.控制器常用命令
5.service常用命令
6.存储常用命令
7.日常命令总结
8. kubectl常用命令
四、资源对象
1. K8S中的资源对象
2. yuml文件
3. Kuberbetes YAML 字段大全
4. 管理Namespace资源
5. 标签与标签选择器
6. Pod资源对象
7. Pod生命周期与探针
8. 资源需求与限制
9. Pod服务质量(优先级)
五、资源控制器
1. Pod控制器
2. ReplicaSet控制器
3. Deployment控制器
4. DaemonSet控制器
5. Job控制器
6. CronJob控制器
7. StatefulSet控制器
8. PDB中断预算
六、Service和Ingress
1. Service资源介绍
2. 服务发现
3. Service(ClusterIP)
4. Service(NodePort)
5. Service(LoadBalancer)
6. Service(ExternalName)
7. 自定义Endpoints
8. HeadlessService
9. Ingress资源
10. nginx-Ingress案例
七、Traefik
1. 知识点梳理
2. 简介
3. 部署与配置
4. 路由(IngressRoute)
5. 中间件(Middleware)
6. 服务(TraefikService)
7. 插件
8. traefikhub
9. 配置发现(Consul)
10. 配置发现(Etcd)
八、存储
1. 配置集合ConfigMap
6. downwardAPI存储卷
3. 临时存储emptyDir
2. 敏感信息Secret
5. 持久存储卷
4. 节点存储hostPath
7. 本地持久化存储localpv
九、rook
1. rook简介
2. ceph
3. rook部署
4. rbd块存储服务
5. cephfs共享文件存储
6. RGW对象存储服务
7. 维护rook存储
十、网络
1. 网络概述
2. 网络类型
3. flannel网络插件
4. 网络策略
5. 网络与策略实例
十一、安全
1. 安全上下文
2. 访问控制
3. 认证
4. 鉴权
5. 准入控制
6. 示例
十二、pod调度
1. 调度器概述
2. label标签调度
3. node亲和调度
4. pod亲和调度
5. 污点和容忍度
6. 固定节点调度
十三、系统扩展
1. 自定义资源类型(CRD)
2. 自定义控制器
十四、资源指标与HPA
1. 资源监控及资源指标
2. 监控组件安装
3. 资源指标及其应用
4. 自动弹性缩放
十五、helm
1. helm基础
2. helm安装
3. helm常用命令
4. HelmCharts
5. 自定义Charts
6. helm导出yaml文件
十六、k8s高可用部署
1. kubeadm高可用部署
2. 离线二进制部署k8s
3. 其他高可用部署方式
十七、日常维护
1. 修改节点pod个数上限
2. 集群证书过期更换
3. 更改证书有效期
4. k8s版本升级
5. 添加work节点
6. master节点启用pod调度
7. 集群以外节点控制k8s集群
8. 删除本地集群
9. 日常错误排查
10. 节点维护状态
11. kustomize多环境管理
12. ETCD节点故障修复
13. 集群hosts记录
14. 利用Velero对K8S集群备份还原与迁移
15. 解决K8s Namespace无法正常删除的问题
16. 删除含指定名称的所有资源
十八、k8s考题
1. 准备工作
2. 故障排除
3. 工作负载和调度
4. 服务和网络
5. 存储
6. 集群架构、安装和配置
本文档使用 MrDoc 发布
-
+
home page
14. 利用Velero对K8S集群备份还原与迁移
# 简介 ## Velero介绍 Velero 是一个云原生的灾难恢复和迁移工具,它本身也是开源的, 采用 Go 语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源和持久卷。 1. 备份可以按集群资源的子集,按命名空间、资源类型标签选择器进行过滤,从而为备份和恢复的内容提供高度的灵活性 2. 支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群 3. 通过聚合 API 服务器公开的资源可以轻松备份和恢复,即使它们存储在单独的 etcd 数据库中 - 开源地址:[https://github.com/vmware-tanzu/velero](https://github.com/vmware-tanzu/velero) - 官方文档:[https://velero.io/docs/v1.13/](https://velero.io/docs/v1.13/) ## Velero组件 Velero 组件一共分两部分,分别是服务端和客户端。 - **服务端**:运行在Kubernetes集群中(运行在Pod中) - **客户端**:运行在本地的velero命令行工具,包括安装服务端、备份、定时任务备份、恢复等命令,特别需要注意的是,安装服务端时需要在机器上已配置好kubectl及集群kubeconfig。 ## velero使用场景 - 灾备场景:提供备份恢复k8s集群的能力 - 迁移场景:提供拷贝集群资源到其他集群的能力(两个集群连接同一个对象存储地址) ## 与etcd备份区别 - 直接备份 Etcd 是将集群的全部资源备份起来,而 Velero 可以对 Kubernetes 集群内对象级别进行备份。 - 除了对 Kubernetes 集群进行整体备份外,Velero 还可以通过对 Type、Namespace、Label、Pod<br />等对象进行分类备份或者恢复。 ## velero工作流程 备份数据: 本地velero客户端发送备份命令,就会调用API Server创建Backup资源对象<br />服务端收到通知有新的Backup对象创建并执行验证<br />服务端开始执行备份过程,向API Server查询需要备份的数据<br />服务端调用对象存储服务,将备份数据保存到对象对象存储上<br />恢复数据: 本地velero客户端发送恢复指令,就会调用API Server创建Restore资源对象<br />服务端收到通知有新的Restore对象创建并执行验证<br />服务端调用对象存储,将指定的备份文件下载下来<br />服务端开始执行恢复过程,根据备份数据调用API Server重新创建相关资源对象<br />![image.jpg](/media/202406/17.14.162964902_image1.png) ## Velero后端存储 `Velero`支持两种关于后端存储的`CRD`,分别是`BackupStorageLocation`和`VolumeSnapshotLocation`。<br />**BackupStorageLocation**<br />主要用来定义 Kubernetes 集群资源的数据存放位置,也就是集群对象数据,不是 PVC 的数据。主要支持的后端存储是 S3 兼容的存储,比如:Mino 和阿里云 OSS 等。<br />**VolumeSnapshotLocation**<br />主要用来给 PV 做快照,需要云提供商提供插件。阿里云已经提供了插件,这个需要使用 CSI 等存储机制。也可以使用专门的备份工具 `Restic`,把 PV 数据备份到阿里云 OSS 中去(安装时需要自定义选项)。 > Restic 是一款 GO 语言开发的数据加密备份工具,顾名思义,可以将本地数据加密后传输到指定的仓库。支持的仓库有 Local、SFTP、Aws S3、Minio、OpenStack Swift、Backblaze B2、Azure BS、Google Cloud storage、Rest Server。 # 准备minIO存储 Velero支持很多种存储插件,可查看:[https://velero.io/docs/main/supported-providers/](https://velero.io/docs/main/supported-providers/)获取插件信息,我们这里使用minio作为S3兼容的对象存储提供程序。您也可以在任意地方部署Minio对象存储,只需要保证K8S集群可以访问到即可。 ## 安装部署 部署过程可参考文档:[https://www.cuiliangblog.cn/detail/section/121560332](https://www.cuiliangblog.cn/detail/section/121560332) ## 创建bucket ![image.png](/media/202406/17.14.162964902_image2.png) ## 创建Access Key并配置权限 ![image.png](/media/202406/17.14.162964902_image3.png) # 安装velero ## 安装velero 软件包下载地址:[https://github.com/vmware-tanzu/velero/releases](https://github.com/vmware-tanzu/velero/releases) ```bash [root@tiaoban ~]# wget https://github.com/vmware-tanzu/velero/releases/download/v1.13.1/velero-v1.13.1-linux-amd64.tar.gz [root@tiaoban ~]# tar -zxvf velero-v1.13.1-linux-amd64.tar.gz [root@tiaoban ~]# mv velero-v1.13.1-linux-amd64/velero /usr/bin/ [root@tiaoban ~]# velero version Client: Version: v1.13.1 Git commit: ea5a89f83b89b2cb7a27f54148683c1ee8d57a37 <error getting server version: no matches for kind "ServerStatusRequest" in version "velero.io/v1"> ``` 启用命令补全 ```bash [root@tiaoban ~]# source <(velero completion bash) [root@tiaoban ~]# velero completion bash > /etc/bash_completion.d/velero ``` ## 创建minIO密钥 ```bash [root@tiaoban ~]# cat > credentials-velero <<EOF [default] aws_access_key_id = CCeH0ag1HMJozpj7kTk8 aws_secret_access_key = 0F0W7Ydy2nUPFP0c39DcJ168X8KNCtCXoEAzT3tg EOF ``` ## 安装velero到k8s集群 aws插件[https://github.com/vmware-tanzu/velero-plugin-for-aws](https://github.com/vmware-tanzu/velero-plugin-for-aws) ```bash [root@tiaoban ~]# velero install \ --provider aws \ --image velero/velero:v1.13.1 \ --plugins velero/velero-plugin-for-aws:v1.9.1 \ --bucket velero \ --secret-file ./credentials-velero \ --use-node-agent \ --use-volume-snapshots=false \ --namespace velero \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio-api.local.com \ --wait # 执行install命令后会创建一系列清单,包括CustomResourceDefinition、Namespace、Deployment等。 velero install \ --provider aws \ --image harbor.local.com/velero/velero:v1.13.1 \ --plugins harbor.local.com/velero/velero-plugin-for-aws:v1.9.1 \ --bucket velero \ --secret-file ./credentials-velero \ --use-node-agent \ --uploader-type=restic \ --privileged-node-agent \ --use-volume-snapshots=false \ --namespace velero \ --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio-api.local.com \ --wait [root@tiaoban ~]# kubectl get all -n velero NAME READY STATUS RESTARTS AGE pod/node-agent-8cpz4 1/1 Running 0 50s pod/node-agent-bl98j 1/1 Running 0 50s pod/node-agent-pnl82 1/1 Running 0 50s pod/node-agent-rvz99 1/1 Running 0 50s pod/node-agent-t25wf 1/1 Running 0 50s pod/node-agent-vlqn6 1/1 Running 0 50s pod/velero-6c7f5c9466-8nnjw 1/1 Running 0 50s NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/node-agent 6 6 6 6 6 <none> 50s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/velero 1/1 1 1 50s NAME DESIRED CURRENT READY AGE replicaset.apps/velero-6c7f5c9466 1 1 1 50s [root@tiaoban ~]# kubectl get backupstoragelocation -A NAMESPACE NAME PHASE LAST VALIDATED AGE DEFAULT velero default Available 1s 15m true ``` **选项说明:** - `--kubeconfig`(可选):指定`kubeconfig`认证文件,默认使用`.kube/config`; - `--provider`:定义插件提供方; - `--image`:定义运行velero的镜像,默认与velero客户端一致; - `--plugins`:指定使用aws s3兼容的插件镜像; - `--bucket`:指定对象存储Bucket桶名称; - `--secret-file`:指定对象存储认证文件; - `--use-node-agent`:启用文件系统备份,创建Velero Node Agent守护进程,托管FSB模块; - `--uploader-type=restic`:使用Restic工具备份 - `--privileged-node-agent`: 节点代理需要在特权模式下运行 - `--use-volume-snapshots`:是否启使用快照; - `--namespace`:指定部署的namespace名称,默认为velero; - `--backup-location-config`:指定对象存储地址信息,需要注意的是如果指定域名的话,服务器端必须能解析到。 **aws插件与velero版本对应关系:** | Plugin Version | Velero Version | | --- | --- | | v1.9.x | v1.13.x | | v1.8.x | v1.12.x | | v1.7.x | v1.11.x | | v1.6.x | v1.10.x | | v1.5.x | v1.9.x | | v1.4.x | v1.8.x | | v1.3.x | v1.7.x | ## 其他命令 ```bash # 可使用如下命令查看运行日志 [root@tiaoban ~]# kubectl logs deployment/velero -n velero # 查看velero创建的api对象 [root@tiaoban ~]# kubectl api-versions | grep velero velero.io/v1 velero.io/v2alpha1 # 查看备份信息 [root@tiaoban ~]# velero backup-location get NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULT default aws velero Unavailable 2024-04-06 13:07:45 +0800 CST ReadWrite true ``` ## 卸载velero 如果您想从集群中完全卸载Velero,则以下命令将删除由`velero install`创建的所有资源: ``` kubectl delete namespace/velero clusterrolebinding/velero kubectl delete crds -l component=velero ``` # 应用备份与恢复 ## 数据备份 ### 备份命令 `velero create backup NAME [flags]`<br />**backup选项:** - `--exclude-namespaces stringArray` : 要从备份中排除的名称空间 - `--exclude-resources stringArray`: 要从备份中排除的资源,如`storageclasses.storage.k8s.io` - `--include-cluster-resources optionalBool[=true]`: 包含集群资源类型 - `--include-namespaces stringArray`: 要包含在备份中的名称空间(默认'*') - `--include-resources stringArray`: 备份中要包括的资源 - `--labels mapStringString`: 给这个备份加上标签 - `-o, --output string`: 指定输出格式,支持'table'、'json'和'yaml'; - `-l, --selector labelSelector`: 对指定标签的资源进行备份 - `--snapshot-volumes optionalBool[=true]`: 对 PV 创建快照 - `--storage-location string`: 指定备份的位置 - `--ttl duration`: 备份数据多久删掉 - `--volume-snapshot-locations strings`: 指定快照的位置,也就是哪一个公有云驱动 ### 创建测试应用 ```bash $ kubectl apply -f examples/nginx-app/base.yaml namespace/nginx-example created deployment.apps/nginx-deployment created service/my-nginx created # 查看资源清单 $ kubectl get all -n nginx-example NAME READY STATUS RESTARTS AGE pod/nginx-deployment-57d5dcb68-g42mk 1/1 Running 0 41s pod/nginx-deployment-57d5dcb68-pcc6t 1/1 Running 0 41s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-nginx LoadBalancer 10.96.0.31 <pending> 80:27370/TCP 41s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 2/2 2 2 41s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-57d5dcb68 2 2 2 41s ``` ### 备份测试应用 ```bash [root@tiaoban ~]# velero backup create redis-backup --include-namespaces=velero-test --default-volumes-to-fs-backup Backup request "redis-backup" submitted successfully. Run `velero backup describe redis-backup` or `velero backup logs redis-backup` for more details. ``` 选项: - `--include-namespaces`:指定命名空间 - `--selector`:标签选择器,如app=nginx ### 查看备份列表 ```bash [root@tiaoban ~]# velero backup get NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR redis-backup Completed 0 0 2024-04-07 21:44:45 +0800 CST 29d default <none> # 查看备份详细信息 [root@tiaoban ~]# velero backup describe redis-backup --details # 查看备份日志 [root@tiaoban ~]# velero backup logs redis-backup ``` ### minio控制台查看备份内容 ![image.png](/media/202406/17.14.162964902_image4.png) ### 定时备份命令 ``` # 使用cron表达式备份 $ velero schedule create nginx-daily --schedule="0 1 * * *" --include-namespaces nginx-example # 手动触发定时任务 $ velero backup create --from-schedule nginx-daily ``` ## 数据恢复 ### 模拟灾难 ```bash # 删除nginx-example命名空间和资源 [root@tiaoban ~]# kubectl delete namespace velero-test # 检查是否删除 [root@tiaoban ~]# kubectl get all -n velero-test No resources found in velero-test namespace. ``` ### 恢复资源 ```bash [root@tiaoban ~]# velero backup get NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR redis-backup Completed 0 0 2024-04-07 21:44:45 +0800 CST 29d default <none> [root@tiaoban ~]# velero restore create --from-backup redis-backup Restore request "redis-backup-20240407214913" submitted successfully. Run `velero restore describe redis-backup-20240407214913` or `velero restore logs redis-backup-20240407214913` for more details. ``` ### 检查恢复的资源 ```bash [root@tiaoban ~]# velero restore get NAME BACKUP STATUS STARTED COMPLETED ERRORS WARNINGS CREATED SELECTOR myapp-20240406224730 myapp Completed 2024-04-06 22:47:30 +0800 CST 2024-04-06 22:47:31 +0800 CST 0 1 2024-04-06 22:47:30 +0800 CST <none> # 查看详细信息 [root@tiaoban ~]# velero restore describe redis-20240407232424 --details # 检查资源状态 [root@tiaoban ~]# kubectl get all -n velero-test NAME READY STATUS RESTARTS AGE pod/redis 1/1 Running 0 22s ``` ![image.png](/media/202406/17.14.162964902_image5.png) [https://zhuanlan.zhihu.com/p/641652953](https://zhuanlan.zhihu.com/p/641652953)<br />[https://velero.io/docs/v1.13/file-system-backup/](https://velero.io/docs/v1.13/file-system-backup/)<br />[https://yunxue521.top/archives/velero](https://yunxue521.top/archives/velero)<br />[https://github.com/vmware-tanzu/velero/issues/6623](https://github.com/vmware-tanzu/velero/issues/6623)
Nathan
June 22, 2024, 12:48 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password