Argo-CD是Kubernetes的一款声明式、GitOps连续交付工具。argo-cd的优势在于,应用程序定义、配置和环境都是声明性的,并受版本控制;应用程序部署和生命周期管理都是自动化的。
argo-cd被实现为kubernetes控制器,该控制器连续监控正在运行的应用,并将当前的活动状态和所需的目标状态(在git存储中指定)进行比较。当活动状态偏离目标状态且已经部署的应用被标记为OutofSync.另外,argo-cd报告可视化差异,同时提供了自动或手动两种方式将实时状态同步到所需的目标状态的功能。且,在Git仓库中对所需目标状态所做的任何修改都可以自动应用并反应到指定的目标环境中。
接下来就通过实际例子演示argo-cd工作过程。首先安装argo-cd。
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
安装后将argocd-server修改为NodePort类型的service,这样可以通过node节点IP+端口号在外网访问安装的argocd。
通过查看secret获取argocd的登录密码,用户名是admin。查看到的密码是经过base64加密的,需要进行解密后才能登录到argocd服务上。
kubectl get secret -n argocd argocd-initial-admin-secret -oyaml
echo '$password'|base64 --decode
登录argocd后,创建project,在创建project时需要设置代码仓库的git地址,配置Destination,即部署的集群地址的namespace,git代码仓库地址上存放就是一个Deployment的yaml文件。
项目创建完成后,点击Sync,argo-cd就会从git上拉取depoyment的yaml文件,并完成部署。
此时如果不修改git中的deployment文件,而是直接在集群中修改部署的deployment文件,修改成一个不存在的image版本,修改后,pod应该会启动失败。
此时查看argo-cd,会看到argo-cd自动更新版本信息,获取最新的部署情况,可以看到argo-cd上也显示新的pod启动失败了。
此时,如果想回退到git仓库中的yaml文件配置信息,只需在argo-cd中点击Sync按钮即可。
查看pod信息,可以看到启动失败的pod已经被删除,deployment的yaml文件重新恢复到和git中存放的版本一致。
再次查看argo-cd,可以看到项目中也获取了Sync后的pod部署情况。
通过上面的实际例子演示,可以看到引入argo-cd可以有效避免生产上的误操作,当发现有问题时,可快速回滚到git仓库存放的yaml定义的部署版本上。
执行kubectl scale命令,对部署的httpserver的pod进行横向扩展,执行命令后运行的pod从1个变成了2个。
kubectl scale deployment httpserver --replicas=2
此时查看argo-cd的项目,项目状态会显示OutOfSync状态,因为创建项目时设置的是手动Sync。
手动执行Sync后,查看部署信息,可以看到argo-cd上显示了有2个pod处于running状态。
当然也可以把项目设置为自动Sync模式,这样在生产环境scale了deployment后,argo-cd会自动同步最新的部署信息。