概述
我进行服务迁移的主要目的是建立一个备用集群,以防止主集群宕机时,流量可以迅速切换到备用集群,确保服务的持续运行和高可用性。
为什么选择ArgoCD?
⚡️: 使用 ArgoCD 配合 Helm 部署 Kubernetes 服务非常方便,所有的应用状态都存储在 Git 中,可以实现版本控制和变更追溯,保证配置的一致性和可追溯性。并且每当检测到 Git 仓库中的变更时,ArgoCD 会自动将这些变更应用到集群中。
迁移
当需要将服务迁移到其他集群时,如果服务数量多达几百甚至几千个,一个个部署就会变得非常麻烦。之前我们使用 ArgoCD 的 UI 进行服务部署,这种方法需要逐个服务地手动操作(当时服务逐步迁至K8S,所以不影响),效率较低且容易出错。
我们可以通过 kubectl
命令拉取所有的应用配置,并以 YAML 格式打印出来,去掉 status
部分,因为这部分只是一个状态栏,对我们服务的部署没有什么作用。将所有项目的配置汇总到一个 YAML 文件中,然后在新的集群中通过 kubectl apply
命令一次性部署所有服务。
具体步骤已整理为脚本如下:
#!/bin/bash
# 列出所有服务
services=$(kubectl get deploy -n devel | grep -v NAME | awk '{print $1}')
# 输出文件
output_file="all_argocd_application.yaml"
# 如果输出文件存在,则清除该文件
: >> "$output_file"
# 提出status部分
for service in $services; do
echo "Fetching YAML for service: $service"
raw_yaml=$(kubectl get application -n argo-cd "${service}" -o yaml)
clean_yaml=$(echo "$raw_yaml" | yq 'del(.status)')
echo "$clean_yaml" >> "$output_file"
echo -e "\n---\n" >> "$output_file"
done
echo "All YAMLs have been fetched and stored in $output_file"
⚡️:
yq
是一个用于处理 YAML 文件的命令行工具,它类似于处理 JSON 文件的jq
。yq
可以用于查看、编辑、删除和转换 YAML 数据,非常适合用于脚本化操作或自动化任务。
这里要注意服务类型可能不止 Deployment
,根据实际情况调整。
将整理后的 YAML 文件应用到新集群: 连接到新的 Kubernetes 集群,并运行以下命令一次性部署所有服务:
> kubectl apply -f all_argocd_application.yaml
总结
通过这种方式,可以大大简化服务迁移的过程,无需手动一个一个部署,节省了大量时间和精力。