云原生下的CI/CD:安装Argo CD
其中的软件设施,包括 IaaS、Kubernetes 这样的基础设施,也包括应用本身。现在我们已经将名字为 argocd-server 的 Service 改成 NodePort 类型了,可以在集群外部通过 : 来访问 Argo CD,我这里随机生成的 NodePort 端口是 32313。等待一会可以看到此时已经回滚成功,此时 Pod 是 v1 版本的,并且由于此时线上的版本并不是 Git 仓库
1.Argo CD 能解决什么问题
1.1 从 GitOps 说起
GitOps 起源于 Weaveworks 公司在 2017 年发表的一篇博客, GitOps - Operations by Pull Request 。在文中,Alexis 介绍了一种以 Git 为唯一事实来源的部署方式。
在 GitOps 实践中,我们需要将软件设施定义在 Git 仓库中进行管理。其中的软件设施,包括 IaaS、Kubernetes 这样的基础设施,也包括应用本身。每个人都可以通过提交 Pull Request 来修改软件设施,然后通过自动化的程序执行这种修改。
这种方式使得每个人都可以专注于开发新的功能,而不用陷入繁琐的安装、变更、迁移等运维工作。同时,整个过程具有完整的操作记录和权限审批管理。
1.2 Argo CD 能落地 GitOps
Argo CD 是以 Kubernetes 为基础设施的 GitOps 持续部署工具。下面是来自 Argo CD 社区的原理图:
Argo CD 从 Git Repo 拉取应用的配置,部署在 Kubernetes 集群中。
当有人新增功能时,提交一个 Pull Requests 到 Git Repo 修改应用的部署配置,等待合并。
在 Pull Requests 合并之后,通过 Webhook 触发 Argo CD 执行更新操作。
应用得到更新,发送通知
理解起来很容易,将运维过程自动化,持续的部署。
1.3 强大而易扩展的 Argo CD
对于一般的 Kubernetes 运维场景,上面描述的功能是够用的。但是如果是复杂场景,涉及多云、多平台、多中间件,也是需要考虑的。
在 Argo CD 的处理逻辑中,定义了四个组件:
Event Source,接入各种事件消息
Sensor,将消息转换为触发的动作
Eventbus,消息订阅路由系统
Trigger,触发外部的实际动作
对于运维人员,需要了解的主要是两点:
Argo CD 可以处理什么事件?
AMQP、AWS SNS、AWS SQS、Cron Schedules、GCP PubSub、GitHub、GitLab、HDFS、File Based Events、Kafka、Minio、NATS、MQTT、K8s Resources、Slack、NetApp StorageGrid、Webhooks、Stripe、NSQ、Emitter、Redis、Azure Events Hub
Argo CD 可以处理执行哪些动作?
Argo Workflows、Standard K8s Objects、HTTP Requests、AWS Lambda、NATS Messages、Kafka Messages、Slack Notifications、Argo Rollouts CR、Custom / Build Your Own Triggers、Apache OpenWhisk
2. 在 Kubernetes 上部署 Argo CD
新建命名空间,部署 Argo CD
这里选择当前发布的最新版本: 1.8.3
kubectl create namespace argocdkubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v1.8.3/manifests/install.yaml
Argo CD 社区还提供了 HA 模式的部署方式
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v1.8.3/manifests/ha/install.yaml 用于生产环境。
将服务改为 NodePort 类型,方便访问
kubectl patch svc argocd-server -p '{"spec": {"type": "NodePort"}}' -n argocd
现在我们已经将名字为 argocd-server 的 Service 改成 NodePort 类型了,可以在集群外部通过 <节点 IP>:<随机生成的 NodePort 端口> 来访问 Argo CD,我这里随机生成的 NodePort 端口是 32313。
$ kubectl get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-dex-server ClusterIP 10.68.51.140 <none> 5556/TCP,5557/TCP,5558/TCP 5m11s
argocd-metrics ClusterIP 10.68.76.255 <none> 8082/TCP 5m11s
argocd-redis ClusterIP 10.68.223.131 <none> 6379/TCP 5m11s
argocd-repo-server ClusterIP 10.68.1.35 <none> 8081/TCP,8084/TCP 5m11s
argocd-server NodePort 10.68.49.24 <none> 80:30582/TCP,443:32313/TCP 5m11s
argocd-server-metrics ClusterIP 10.68.107.188 <none> 8083/TCP 5m10s
查看服务
kubectl -n argocd get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEargocd-dex-server ClusterIP 10.233.34.191 <none> 5556/TCP,5557/TCP,5558/TCP 5m37sargocd-metrics ClusterIP 10.233.54.3 <none> 8082/TCP 5m36sargocd-redis ClusterIP 10.233.18.86 <none> 6379/TCP 5m36sargocd-repo-server ClusterIP 10.233.3.171 <none> 8081/TCP,8084/TCP 5m36sargocd-server NodePort 10.233.61.3 <none> 80:31808/TCP,443:30992/TCP 5m36sargocd-server-metrics ClusterIP 10.233.36.228 <none> 8083/TCP 5m36s
查看 admin 账户密码
kubectl get pod -n argocd |grep argocd-server
argocd-server-7d597d9bcd-6nzct 1/1 Running 0 22m
这里 admin
的密码就是 Pod 的名字: argocd-server-7d597d9bcd-6nzct
。
登录 Argo CD UI 页面,打开页面 http://{HOST_IP}:31808
使用账户: admin,密码: argocd-server-7d597d9bcd-6nzct 进行登录。
3. 安装 CLI 工具
下载 CLI 命令行工具
这里以 Linux 为例进行安装:
curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/v1.8.3/argocd-linux-amd64chmod +x /usr/local/bin/argocd
登录 Kubernetes 集群上部署的 Argo CD
将 HOST_IP
替换为主机的 IP 地址,使用 CLI 登录集群。
argocd login {HOST_IP}:31808 --username admin --password argocd-server-7d597d9bcd-6nzct
'admin' logged in successfullyContext '{HOST_IP}:31808' updated
更新 admin 密码, 方便下次登录
argocd account update-password --account admin --current-password argocd-server-7d597d9bcd-6nzct --new-password password
Password updatedContext '{HOST_IP}:31808' updated
命令行可以使用以下方式登录。
❯ argocd login <节点 IP>:32313
# 接收证书风险
WARNING: server certificate had error: x509: cannot validate certificate for 11.8.38.43 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: # 输入用户名
Password: # 输入密码
'admin:login' logged in successfully
准备 Git 仓库
在 Gitlab 上创建项目,取名为 argocd-lab,为了方便实验将仓库设置为 public 公共仓库。在仓库中创建 quickstart 目录,在目录中创建两个 yaml 资源文件,分别是 myapp-deployment.yaml 和 myapp-service.yaml。
yaml 资源文件内容如下:
# myapp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- image: registry.cn-shanghai.aliyuncs.com/public-namespace/myapp:v1
name: myapp
ports:
- containerPort: 80
# myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
ports:
- port: 80
targetPort: 80
nodePort: 32060
type: NodePort
selector:
app: myapp
实验所需的镜像我已经在阿里云的镜像仓库中准备好了,大家可以直接使用。
创建 Argo CD App
首先创建一个命名空间 devops 用于 Argo CD 部署应用。
kubectl create ns devops
方式一:使用 UI 创建 App
Application Name: 自定义的应用名。
Project: 使用默认创建好的 default 项目。
SYNC POLICY: 同步方式,可以选择自动或者手动,这里我们选择手动同步。
Repository URL: 项目的 Git 地址。
Revision: 分支名。
Path: yaml 资源文件所在的相对路径。
Cluster URL: Kubernetes API Server 的访问地址,由于 Argo CD 和下发应用的 Kubernetes 集群是同一个,因此可以直接使用 http://kubernetes.default.svc 来访问。关于 Kubernetes 中 DNS 解析规则可以查看 Pod 与 Service 的 DNS。
Namespace: 部署应用的命名空间。
创建完成后如下图所示,此时处于 OutOfSync 的状态:
由于我设置的是手动同步,因此需要点一下下面的 SYNC 进行同步。
在弹出框点击 SYNCHRONIZE,确认同步。
等待同步完成。
在 Argo CD 上点击应用进入查看详情。
在 Kubernetes 查看部署的资源。
root@cluster01-1:/root #kubectl get all -n devops
NAME READY STATUS RESTARTS AGE
pod/myapp-865f9f464f-qpjbc 1/1 Running 0 2m25s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/myapp NodePort 10.68.93.5 <none> 80:32060/TCP 2m25s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 1/1 1 1 2m25s
NAME DESIRED CURRENT READY AGE
replicaset.apps/myapp-865f9f464f 1 1 1 2m25s
在集群外部通过 <节点 IP>: 端口访问 myapp 程序,可以看到此时是 v1 版本。
方式二:使用 CLI 创建 APP
argocd app create myapp2 \
--repo http://11.8.36.29/root/argocd-lab.git \
--path quickstart --dest-server \
https://kubernetes.default.svc \
--dest-namespace devops
使用 argocd 命令查看创建的应用。
# 列出应用
❯ argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
myapp https://kubernetes.default.svc devops default Synced Healthy <none> <none> http://11.8.36.29/root/argocd-lab.git quickstart main
# 查看 myapp 应用
❯ argocd app get myapp
Name: myapp
Project: default
Server: https://kubernetes.default.svc
Namespace: devops
URL: https://11.8.36.159:32313/applications/myapp
Repo: http://11.8.36.29/root/argocd-lab.git
Target: main
Path: quickstart
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: Synced to main (82baed1)
Health Status: Healthy
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service devops myapp Synced Healthy service/myapp created
apps Deployment devops myapp Synced Healthy deployment.apps/myapp created
方式三:使用 YAML 文件创建
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
namespace: argocd
spec:
destination:
namespace: devops # 部署应用的命名空间
server: https://kubernetes.default.svc # API Server 地址
project: default # 项目名
source:
path: quickstart # 资源文件路径
repoURL: http://11.8.36.29/root/argocd-lab.git # Git 仓库地址
targetRevision: main # 分支名
版本升级
这次我们将 myapp 应用从手动同步改成自动同步。点击 APP DETAILS -> SYNC POLICY,点击 ENABLE AUTO-SYNC。
编辑 myapp 资源文件,将版本从 v1 改为 v2,点击 Commit changes,提交更改。
等待一会 Argo CD 会自动更新应用,如果你等不及可以点击 Refresh,Argo CD 会去立即获取最新的资源文件。可以看到此时 myapp Deployment 会新创建 v2 版本的 Replicaset,v2 版本的 Replicaset 会创建并管理 v2 版本的 Pod。
在集群外部通过 <节点 IP>: 端口访问 myapp 程序,可以看到此时是 v2 版本。
版本回滚
细心的同学应该会发现升级到 v2 版本以后, v1 版本的 Replicaset 并没有被删除,而是继续保留,这是为了方便我们回滚应用。在 myapp 应用中点击 HISTORY AND ROLLBACK 查看历史记录,可以看到有 2 个历史记录。
假设我们刚刚上线的 v2 版本出现了问题,需要回滚回 v1 版本,那么我们可以选中 v1 版本,然后点击 Rollback 进行回滚。
在回滚的时候需要禁用 AUTO-SYNC 自动同步,点击 OK 确认即可。
等待一会可以看到此时已经回滚成功,此时 Pod 是 v1 版本的,并且由于此时线上的版本并不是 Git 仓库中最新的版本,因此此时同步状态是 OutOfSync。
参考文章:
https://blog.csdn.net/Jacson__/article/details/124850916
https://blog.csdn.net/cr7258/article/details/122028096
更多推荐
所有评论(0)