介绍
Heptio Ark是Kubernetes集群的便捷备份工具,可将Kubernetes对象压缩并备份到对象存储。 它还使用云提供程序的块存储快照功能拍摄群集的持久卷的快照,然后可以将群集的对象和持久卷恢复到以前的状态。
StackPointCloud的DigitalOcean Ark插件允许您使用DigitalOcean块存储来快照您的Persistent Volumes和Spaces来备份您的Kubernetes对象。 在DigitalOcean上运行Kubernetes群集时,这可以让您快速备份群集的状态,并在灾难发生时恢复它。
在本教程中,我们将在本地计算机上设置和配置Ark客户端,并将Ark服务器部署到我们的Kubernetes集群中。 然后,我们将部署一个使用持久卷进行日志记录的示例Nginx应用程序,并模拟灾难恢复方案。
先决条件
在开始本教程之前,您应该可以使用以下内容:
在您的本地计算机上:
-
kubectl
命令行工具,配置为连接到您的群集。 您可以在官方Kubernetes文档中阅读有关安装和配置kubectl
的更多信息 。 -
git
命令行实用程序。 您可以在学习如何安装git
。
在您的DigitalOcean帐户中:
- DigitalOcean Droplets上的DigitalOcean Kubernetes集群或Kubernetes集群(版本
1.7.5
或更高版本) - 在群集内运行的DNS服务器。 如果您使用的是DigitalOcean Kubernetes,则默认情况下会运行。 要了解有关配置Kubernetes DNS服务的更多信息,请参阅官方Kuberentes文档中的自定义DNS服务 。
- DigitalOcean Space,用于存储备份的Kubernetes对象。 要了解如何创建Space,请参阅Spaces产品文档 。
- 您的DigitalOcean Space的访问密钥对。 要了解如何创建一组访问密钥,请参阅如何管理对空间的管理访问 。
- 用于DigitalOcean API的个人访问令牌。 要了解如何创建个人访问令牌,请参阅如何创建个人访问令牌 。
完成所有这些设置后,您就可以开始使用本指南了。
第1步 - 安装方舟客户端
Heptio Ark备份工具包括安装在本地计算机上的客户端和在Kubernetes集群中运行的服务器。 首先,我们将安装本地Ark客户端。
在Web浏览器中,导航到Ark GitHub repo 版本页面 ,找到与您的操作系统和系统体系结构相对应的最新版本,然后复制链接地址。 出于本指南的目的,我们将在x86-64(或AMD64)处理器上使用Ubuntu 18.04服务器作为本地计算机。
然后,从本地计算机上的命令行导航到临时/tmp
目录并将其cd
入其中:
cd /tmp
使用wget
和您之前复制的链接下载发行版tarball:
wget https://link_copied_from_release_page
下载完成后,使用tar
解压缩tarball(注意文件名可能因当前版本和操作系统而异):
tar -xvzf ark-v0.9.6-linux-amd64.tar.gz
/tmp
目录现在应该包含提取的ark
二进制文件以及刚刚下载的tarball。
验证您是否可以通过执行二进制文件来运行ark
客户端:
./ark --help
您应该看到以下帮助输出:
OutputHeptio Ark is a tool for managing disaster recovery, specifically for Kubernetes
cluster resources. It provides a simple, configurable, and operationally robust
way to back up your application state and associated data.
If you're familiar with kubectl, Ark supports a similar model, allowing you to
execute commands such as 'ark get backup' and 'ark create schedule'. The same
operations can also be performed as 'ark backup get' and 'ark schedule create'.
Usage:
ark [command]
Available Commands:
backup Work with backups
client Ark client related commands
completion Output shell completion code for the specified shell (bash or zsh)
create Create ark resources
delete Delete ark resources
describe Describe ark resources
get Get ark resources
help Help about any command
plugin Work with plugins
restic Work with restic
restore Work with restores
schedule Work with schedules
server Run the ark server
version Print the ark version and associated image
. . .
此时,您应该将ark
可执行文件移出临时/tmp
目录并将其添加到PATH
。 要在Ubuntu系统上将其添加到PATH
,只需将其复制到/usr/local/bin
:
sudo mv ark /usr/local/bin/ark
您现在已准备好配置Ark服务器并将其部署到Kubernetes集群。
第2步 - 安装和配置Ark服务器
在我们将Ark部署到Kubernetes集群之前,我们首先要创建Ark的先决条件对象。 方舟的先决条件包括:
一个
heptio-ark
命名空间ark
服务帐户基于角色的访问控制(RBAC)规则,用于授予
ark
服务帐户的权限特定于Ark的资源的自定义资源(CRD):
Backup
,Schedule
,Restore
,Config
包含上述Kubernetes对象规范的YAML文件可以在官方Ark Git存储库中找到 。 在仍然在/tmp
目录中时,使用git
下载Ark repo:
git clone https://github.com/heptio/ark.git
下载后,导航到ark
目录:
cd ark
上面列出的先决条件资源可以在examples/common/00-prereqs.yaml
YAML文件中找到。 我们将通过使用kubectl apply
并传入文件在Kubernetes集群中创建这些资源:
kubectl apply -f examples/common/00-prereqs.yaml
您应该看到以下输出:
Outputcustomresourcedefinition.apiextensions.k8s.io/backups.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/schedules.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/restores.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/configs.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/downloadrequests.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/deletebackuprequests.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/podvolumebackups.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/podvolumerestores.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/resticrepositories.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/backupstoragelocations.ark.heptio.com created
namespace/heptio-ark created
serviceaccount/ark created
clusterrolebinding.rbac.authorization.k8s.io/ark created
现在我们已经在我们的集群中创建了必要的Ark Kubernetes对象,我们可以下载并安装Ark DigitalOcean插件 ,这将允许我们将DigitalOcean Spaces用作backupStorageProvider
(用于Kubernetes对象),并将DigitalOcean Block Storage用作persistentVolumeProvider
(对于持久卷备份)。
退回ark
目录并使用git
从StackPointCloud的repo中获取插件:
cd ..
git clone https://github.com/StackPointCloud/ark-plugin-digitalocean.git
进入插件目录:
cd ark-plugin-digitalocean
我们现在将我们的DigitalOcean Space的访问密钥保存为Kubernetes Secret 。 首先,使用您喜欢的编辑器打开examples/credentials-ark
文件:
nano examples/credentials-ark
使用您的Spaces访问密钥和密钥替换<AWS_ACCESS_KEY_ID>
和<AWS_SECRET_ACCESS_KEY>
:
[default]
aws_access_key_id=your_spaces_access_key_here
aws_secret_access_key=your_spaces_secret_key_here
保存并关闭文件。
现在,使用kubectl
创建cloud-credentials
Secret,使用digitalocean_token
数据项插入您的个人访问令牌:
kubectl create secret generic cloud-credentials \
--namespace heptio-ark \
--from-file cloud=examples/credentials-ark \
--from-literal digitalocean_token=your_personal_access_token
您应该看到以下输出:
Outputsecret/cloud-credentials created
要确认已成功创建cloud-credentials
Secret,您可以使用kubectl
对其进行kubectl
:
kubectl describe secrets/cloud-credentials --namespace heptio-ark
您应该看到以下描述cloud-credentials
密码的输出:
OutputName: cloud-credentials
Namespace: heptio-ark
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
cloud: 115 bytes
digitalocean_token: 64 bytes
我们现在可以继续创建名为default
的Ark Config
对象。 为此,我们将编辑YAML配置文件,然后在Kubernetes集群中创建对象。
在您喜欢的编辑器中打开examples/10-ark-config.yaml
:
nano examples/10-ark-config.yaml
在突出显示的字段中插入您的Space的名称和区域:
---
apiVersion: ark.heptio.com/v1
kind: Config
metadata:
namespace: heptio-ark
name: default
persistentVolumeProvider:
name: digitalocean
backupStorageProvider:
name: aws
bucket: space_name_here
config:
region: space_region_here
s3ForcePathStyle: "true"
s3Url: https://space_region_here.digitaloceanspaces.com
backupSyncPeriod: 30m
gcSyncPeriod: 30m
scheduleSyncPeriod: 1m
restoreOnlyMode: false
persistentVolumeProvider
将DigitalOcean Block Storage设置为持久卷备份的提供程序。 这些将是Block Storage Volume Snapshots。
backupStorageProvider
将DigitalOcean Spaces设置为Kubernetes对象备份的提供程序。 Ark将创建所有Kubernetes对象的tarball(或者一些,取决于你如何执行它),并将此tarball上传到Spaces。
完成后,保存并关闭文件。
使用kubectl apply
在集群中创建对象:
kubectl apply -f examples/10-ark-config.yaml
您应该看到以下输出:
Outputconfig.ark.heptio.com/default created
此时,我们已完成配置Ark服务器并可以创建其Kubernetes部署,可在examples/20-deployment.yaml
配置文件中找到。 我们快速浏览一下这个文件:
cat examples/20-deployment.yaml
您应该看到以下文本:
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
namespace: heptio-ark
name: ark
spec:
replicas: 1
template:
metadata:
labels:
component: ark
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8085"
prometheus.io/path: "/metrics"
spec:
restartPolicy: Always
serviceAccountName: ark
containers:
- name: ark
image: gcr.io/heptio-images/ark:latest
command:
- /ark
args:
- server
volumeMounts:
- name: cloud-credentials
mountPath: /credentials
- name: plugins
mountPath: /plugins
- name: scratch
mountPath: /scratch
env:
- name: AWS_SHARED_CREDENTIALS_FILE
value: /credentials/cloud
- name: ARK_SCRATCH_DIR
value: /scratch
- name: DIGITALOCEAN_TOKEN
valueFrom:
secretKeyRef:
key: digitalocean_token
name: cloud-credentials
volumes:
- name: cloud-credentials
secret:
secretName: cloud-credentials
- name: plugins
emptyDir: {}
- name: scratch
emptyDir: {}
我们在这里观察到我们正在创建一个名为ark
的部署,它由gcr.io/heptio-images/ark:latest
容器的单个副本组成。 使用我们之前创建的cloud-credentials
秘密配置Pod。
使用kubectl apply
创建部署:
kubectl apply -f examples/20-deployment.yaml
您应该看到以下输出:
Outputdeployment.apps/ark created
我们可以使用kubectl get
在heptio-ark
命名空间上仔细检查是否已成功创建部署:
kubectl get deployments --namespace=heptio-ark
您应该看到以下输出:
OutputNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
ark 1 1 1 0 8m
在安装Ark DigitalOcean插件之前,Ark服务器Pod可能无法正常启动。 要安装ark-blockstore-digitalocean
插件,请使用我们之前安装的ark
客户端:
ark plugin add quay.io/stackpoint/ark-blockstore-digitalocean:latest
您可以指定要与--kubeconfig
标志一起使用的--kubeconfig
。 如果你不使用这个标志, ark
将检查KUBECONFIG
环境变量,然后回kubectl
默认值( ~/.kube/config
)。
此时Ark正在运行并完全配置,并准备备份并将Kubernetes集群对象和Persistent Volumes恢复到DigitalOcean Spaces和Block Storage。
在下一节中,我们将进行快速测试,以确保备份和还原功能按预期工作。
第3步 - 测试备份和还原过程
现在我们已经成功安装并配置了Ark,我们可以创建一个测试Nginx部署和持久卷,并运行备份和恢复钻取以确保一切正常。
ark-plugin-digitalocean
存储库包含一个名为nginx-pv.yaml
的示例Nginx部署。
我们来看看:
cat examples/nginx-pv.yaml
您应该看到以下文本:
Output---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-logs
namespace: nginx-example
labels:
app: nginx
spec:
storageClassName: do-block-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
namespace: nginx-example
spec:
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: nginx-logs
persistentVolumeClaim:
claimName: nginx-logs
containers:
- image: nginx:1.7.9
name: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/var/log/nginx"
name: nginx-logs
readOnly: false
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: my-nginx
namespace: nginx-example
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer
在此文件中,我们遵守以下规范:
- Nginx部署由
nginx:1.7.9
容器映像的单个副本组成 - 使用
do-block-storage
StorageClass的5Gi持久卷声明(称为nginx-logs
) - 一个公开端口
80
LoadBalancer
服务
使用kubectl apply
创建部署:
kubectl apply -f examples/nginx-pv.yml
您应该看到以下输出:
Outputnamespace/nginx-example created
persistentvolumeclaim/nginx-logs created
deployment.apps/nginx-deployment created
service/my-nginx created
检查部署是否成功:
kubectl get deployments --namespace=nginx-example
您应该看到以下输出:
OutputNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 1 1 1 1 1h
一旦Available
达到1,使用kubectl get
获取Nginx负载均衡器的外部IP:
kubectl get services --namespace=nginx-example
您应该看到my-nginx
服务的内部CLUSTER-IP
和EXTERNAL-IP
:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx LoadBalancer 10.32.27.0 203.0.113.0 80:30754/TCP 3m
记下EXTERNAL-IP
并使用您的Web浏览器导航到它。
您应该看到以下NGINX欢迎页面:
这表明您的Nginx部署和服务已启动并正在运行。
在我们模拟灾难场景之前,让我们首先检查Nginx访问日志(存储在连接到Nginx Pod的持久卷上):
使用kubectl get
获取Pod的名称:
kubectl get pods --namespace nginx-example
OutputNAME READY STATUS RESTARTS AGE
nginx-deployment-77d8f78fcb-zt4wr 1/1 Running 0 29m
现在, exec
到正在运行的Nginx容器中以获取其中的shell:
kubectl exec -it nginx-deployment-77d8f78fcb-zt4wr --namespace nginx-example -- /bin/bash
进入Nginx容器后,请使用Nginx访问日志:
cat /var/log/nginx/access.log
你应该看到一些Nginx访问条目:
Output10.244.17.1 - - [01/Oct/2018:21:47:01 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/203.0.113.11 Safari/537.36" "-"
10.244.17.1 - - [01/Oct/2018:21:47:01 +0000] "GET /favicon.ico HTTP/1.1" 404 570 "http://203.0.113.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/203.0.113.11 Safari/537.36" "-"
请注意这些(特别是时间戳),因为我们将使用它们来确认还原过程是否成功。
我们现在可以执行备份过程,将所有nginx
Kubernetes对象复制到Spaces,并获取我们在部署Nginx时创建的持久卷的快照。
我们将使用ark
客户端创建一个名为nginx-backup
:
ark backup create nginx-backup --selector app=nginx
--selector app=nginx
指示Ark服务器仅使用app=nginx
标签选择器备份Kubernetes对象。
您应该看到以下输出:
OutputBackup request "nginx-backup" submitted successfully.
Run `ark backup describe nginx-backup` for more details.
运行ark backup describe nginx-backup
应在短暂延迟后提供以下输出:
OutputName: nginx-backup
Namespace: heptio-ark
Labels: <none>
Annotations: <none>
Phase: Completed
Namespaces:
Included: *
Excluded: <none>
Resources:
Included: *
Excluded: <none>
Cluster-scoped: auto
Label selector: app=nginx
Snapshot PVs: auto
TTL: 720h0m0s
Hooks: <none>
Backup Format Version: 1
Started: 2018-09-26 00:14:30 -0400 EDT
Completed: 2018-09-26 00:14:34 -0400 EDT
Expiration: 2018-10-26 00:14:30 -0400 EDT
Validation errors: <none>
Persistent Volumes:
pvc-e4862eac-c2d2-11e8-920b-92c754237aeb:
Snapshot ID: 2eb66366-c2d3-11e8-963b-0a58ac14428b
Type: ext4
Availability Zone:
IOPS: <N/A>
此输出表明nginx-backup
已成功完成。
从DigitalOcean云控制面板,导航到包含Kubernetes备份文件的Space。
您应该看到一个名为nginx-backup
的新目录,其中包含Ark备份文件。
使用左侧导航栏,转到图像 ,然后转到快照 。 在“ 快照”中 ,导航到“ 卷” 。 您应该看到与上面输出中列出的PVC对应的快照。
我们现在可以测试恢复过程。
让我们先删除nginx-example
命名空间。 这将删除命名空间中的所有内容,包括Load Balancer和Persistent Volume:
kubectl delete namespace nginx-example
验证您是否无法再在Load Balancer端点访问Nginx,并且nginx-example
部署不再运行:
kubectl get deployments --namespace=nginx-example
OutputNo resources found.
我们现在可以再次使用ark
客户端执行还原过程:
ark restore create --from-backup nginx-backup
这里我们使用create
从nginx-backup
对象创建Ark Restore
对象。
您应该看到以下输出:
OutputRestore request "nginx-backup-20180926143828" submitted successfully.
Run `ark restore describe nginx-backup-20180926143828` for more details.
检查已还原部署的状态:
kubectl get deployments --namespace=nginx-example
OutputNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 1 1 1 1 1m
检查是否创建了持久卷:
kubectl get pvc --namespace=nginx-example
OutputNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nginx-logs Bound pvc-e4862eac-c2d2-11e8-920b-92c754237aeb 5Gi RWO do-block-storage 3m
再次导航到Nginx服务的外部IP,以确认Nginx已启动并正在运行。
最后,检查还原的持久卷上的日志以确认还原后是否保留了日志历史记录。
为此,再次使用kubectl get
获取Pod的名称:
kubectl get pods --namespace nginx-example
OutputNAME READY STATUS RESTARTS AGE
nginx-deployment-77d8f78fcb-zt4wr 1/1 Running 0 29m
然后exec
:
kubectl exec -it nginx-deployment-77d8f78fcb-zt4wr --namespace nginx-example -- /bin/bash
进入Nginx容器后,请使用Nginx访问日志:
cat /var/log/nginx/access.log
Output10.244.17.1 - - [01/Oct/2018:21:47:01 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/203.0.113.11 Safari/537.36" "-"
10.244.17.1 - - [01/Oct/2018:21:47:01 +0000] "GET /favicon.ico HTTP/1.1" 404 570 "http://203.0.113.0/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/203.0.113.11 Safari/537.36" "-"
您应该看到相同的备份前访问尝试(请注意时间戳),确认持久卷还原成功。 请注意,如果您在执行还原后访问了Nginx登录页面,则可能会在日志中进行其他尝试。
此时,我们已成功将我们的Kubernetes对象备份到DigitalOcean Spaces,并使用块存储卷快照将我们的持久卷备份。 我们模拟了灾难情景,并将服务恢复到测试Nginx应用程序。
结论
在本指南中,我们在基于DigitalOcean的Kubernetes集群上安装并配置了Ark Kubernetes备份工具。 我们将工具配置为将Kubernetes对象备份到DigitalOcean Spaces,并使用Block Storage Volume Snapshot备份Persistent Volumes。
Ark还可用于安排Kubernetes集群的定期备份。 为此,您可以使用ark schedule
命令。 它还可用于将资源从一个群集迁移到另一个群集。 要了解有关这两个用例的更多信息,请参阅Ark官方文档 。
要了解有关DigitalOcean Spaces的更多信息,请参阅官方Spaces文档 。 要了解有关Block Storage Volumes的更多信息,请参阅Block Storage Volume文档 。
本教程以StackPointCloud的ark-plugin-digitalocean
GitHub repo中的README为基础。