k8s-Argocd部署
# 一、概念
# 1.1 什么是ArgoCD
Argocd (opens new window)是k8s的一个声明式GitOps (opens new window)持续交付工具。
# 1.2 Argocd优势
- 应用程序定义、配置和环境应该是声明性的和版本控制的。应用程序部署和生命周期管理应自动化、可审核且易于理解。
- ArgoCD是以Kubernetes作为基础设施,遵循声明式GitOps理念的持续交付(Continuous Delivery, CD)工具,支持多种配置管理工具。
# 1.3 Argocd原理
Argocd通过一个 Kubernetes 控制器来实现的,它持续 watch 正在运行的应用程序并将当前的实时状态与所需的目标状态( Git 存储库中指定的)进行比较。已经部署的应用程序的实际状态与目标状态有差异,则被认为是 状态,Argo CD 会报告显示这些差异,同时提供工具来自动或手动将状态同步到期望的目标状态。在 Git 仓库中对期望目标状态所做的任何修改都可以自动应用反馈到指定的目标环境中去。
# 1.4 主要组件
- Argo CD Server(argocd-server): Argo CD 服务器是 Argo CD 的核心组件,负责管理和协调整个系统。它与 Git 存储库进行交互,从中读取应用程序的声明性配置,并将配置与 Kubernetes 环境进行同步。Argo CD 服务器还提供 Web 用户界面和 API,用于管理应用程序和监视其状态。
- Git Repository(argocd-repo-server):Git 存储库是存储应用程序配置的地方。Argo CD 从配置存储库中获取应用程序的清单文件,并使用它们来部署和管理应用程序。Argo CD 支持多种 Git 存储库的类型,包括公共 Git 存储库(如 GitHub、GitLab 等)和私有 Git 存储库。
- Application Controller(argocd-application-controller-0):应用程序控制器负责监视应用程序的状态并执行必要的操作以将其与期望状态保持一致。它根据应用程序的配置和状态信息,自动化应用程序的部署和更新,并与 Git 存储库进行同步。
- Argo CD ApplicationSets(argocd-applicationset-controller):
argocd-applicationset-controller
是 Argo CD 的 ApplicationSet 控制器。它负责管理和执行 ApplicationSet 对象,用于生成和管理多个应用程序实例。 是"App of Apps"部署模式的演变。它采用了"App of Apps"的理念并将其扩展为更加灵活并处理广泛的用例。ArgoCD ApplicationSets 作为自己的控制器运行,并补充了 Argo CD 应用程序 CRD 的功能。 - Agro CD Dex(argocd-dex-server):Dex 是一个开源的身份验证和授权工具,Argo CD 可以与 Dex 集成以实现身份验证和授权功能。Dex 可以连接到各种身份提供商(如 LDAP、Active Directory、OAuth 等),以提供灵活的用户身份验证和访问控制机制。
- Argo CD Notify(argocd-notifications-controller): Argo CD 的通知控制器,用于管理和触发通知事件。它负责在 Argo CD 中监视应用程序的状态变化,并基于预定义的规则和配置触发相应的通知。
- Argo CD Redis(argocd-redis): 用于缓存资源,主要包括: 应用程序配置和状态信息、Git 存储库的访问结果、Git 存储库的访问结果、用户和权限信息等。
# 1.5 名词解释
Application:应用,一组由资源清单定义的 K8s 资源,这是一个 CRD 资源对象
Application source type:用来构建应用的工具,如: Git、Helm、Repo、Kustomize、Directory
Target state: 目标状态,指应用程序所需的期望状态,由 Git 存储库中的文件表示
Live state:实时状态,指应用程序实时的状态,比如部署了哪些 Pods 等真实状态
Sync status:同步状态,指实时状态是否与目标状态一致,部署的应用是否与Git(构建工具)中描述一样
Sync:同步指将应用程序迁移到期望目标状态的过程,比如通过对 Kubernetes 集群应用部署变更
Sync operation status:同步操作状态指的是同步是否成功,主要有以下几种状态:
- Synced,同步完成
- OutOfSync,不同步
- Unknown, 未知
- Syncing, 同步中
- Error,同步错误,可能应用程序配置错误、权限问题或其他问题导致的
Refresh:刷新是指将 Git 中的最新代码与实时状态进行比较
Health:应用程序的健康状况,主要有以下几种:
- Healthy:健康
- Degraded:降级,表示应用程序的某些组件或资源出现了问题,但仍然能够运行。这可能意味着某些功能或服务不可用或性能下降。
- Progressing:进行中,指应用在部署或更新中
- Suspended:暂停,指应用程序的同步操作已被暂停,不再进行任何更新
- Missing:缺失,指表ArgoCD 无法找到应用程序的健康检查结果
Tool:工具指从文件目录创建清单的工具,例如 Kustomize 或 Ksonnet 等
# 1.6 安装
安装方式有很多种,这里直接选择官方提供资源清单文件
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
2
# 二、Ingress Web页面配置
# 2.1 ingrss配置
- 清单
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-server-http-ingress
namespace: argocd
annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
name: https
host: ingress-nginx-controller
tls:
- hosts:
- argocd.tchua.com
secretName: argocd-secret # do not change, this is provided by Argo CD
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 2.2 访问
如果你没有在域名平台进行解析之对应的ingress-nginx-controller主机IP,则需要配置主机hots解析之ingress-nginx-controller主机IP。
这里浏览器输入: https://argocd.tchua.com 即可
2
# 2.3 获取密码
# 查看admin初始密码
[root@k8s-master01 argocd]# kubectl get secrets -n argocd argocd-initial-admin-secret -o yaml
apiVersion: v1
data:
password: ZWpMeXRSdGxzelh4bnRqaQ==
kind: Secret
metadata:
creationTimestamp: "2023-05-31T03:06:17Z"
name: argocd-initial-admin-secret
namespace: argocd
resourceVersion: "9743060"
uid: fa792350-cf35-4478-8ec3-6e5380bc881d
type: Opaque
# base64解析
[root@k8s-master01 argocd]# echo ZWpMeXRSdGxzelh4bnRqaQ== |base64 -d
ejLytRtlszXxntji
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 2.4 安装CLI工具
Argo CD 我们也可以通过客户端命令进行管理
- 下载客户端命令
[root@k8s-master01 ~]# wget https://github.com/argoproj/argo-cd/releases/download/v2.7.3/argocd-linux-amd64
- 安装
[root@k8s-master01 ~]# install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
- 登录
需要注意的是,
argocd.tchua.com
需要再master节点进行hosts解析,否则无法进行连接,如果使用dns平台解析,则无需hosts解析
[root@k8s-master01 ~]# argocd login argocd.tchua.com
WARNING: server certificate had error: x509: certificate is valid for ingress.local, not argocd.tchua.com. Proceed insecurely (y/n)? yes
WARN[0004] Failed to invoke grpc call. Use flag --grpc-web in grpc calls. To avoid this warning message, use flag --grpc-web.
Username: admin
Password:
'admin:login' logged in successfully
Context 'argocd.tchua.com' updated
2
3
4
5
6
7
# 三、部署应用
# 3.1 Web UI 部署应用
# 3.1.1 参数配置
这里为了演示方便,直接使用官方提供示例进行部署argoproj/argocd-example-apps (opens new window),使用guestbook (opens new window)项目进行演示。
登录Argo CD后台管理后,可以直接点击+NEW APP
按钮,弹出新建APP应用的对话框,配置好项目对象信息之后,点击CREATE
创建即可:
- 基本配置
- 仓库源配置
- 目标集群配置
注意
- 基本配置里面的
Project Name
,这里我们可以根据自己需要创建不同的项目名称,一般来说都会根据不同环境或者不同的项目创建,这里可以对应集群中命名空间,方便后续管理。
# 3.1.2 应用部署
上面创建应用后,由于我们填写的更新策略为手动更新,因此这里并不会自动部署,也可以看到该应用的状态处于OutOfSync
点击应用,可以进入应用详情,我们可以看到,该仓库对应的guestbook
项目,有svc
和deploy
资源清单文件:
点击应用详情页,上面菜单中的SYNC
按钮,可以触发相关资源的部署以及登录集群查看资源的情况:
- 资源部署
注意
我们可以看到argo cd已经按照把相关资源部署至集群,这里看到pod部署的时候失败了,查看集群中pod状态为ImagePullBackOff
,这是因为官方的示例文件中,给的项目镜像地址为gcr.io
,我们没办法下载镜像,不过这其实并不重要,我们主要是看到资源的部署,已经按照我们的预期进行部署,后面实践部分,我们只需要把仓库中的资源清单文件,替换为我们业务应用清单文件即可。
# 3.2 通过 CLI 部署应用
使用CLI部署应用之前,我们先删除上一步通过Web UI创建的应用,这里还是使用官方提供的示例清单文件进行演示,当然还是会出现pod因为镜像地址无法正常部署的问题,不过我们这里只要看到能按照预期进行调度即可。
# 3.2.1 登录
我们上面部署CLI工具时已经登录,如果没有进行登录过,则直接执行以下命令,输入用户名密码即可完成登录
[root@k8s-master01 ~]# argocd login argocd.tchua.com
# 3.2.2 创建应用
[root@k8s-master01 ~]# argocd app create guestbook \
--repo https://github.com/argoproj/argocd-example-apps.git \
--path guestbook \
--dest-server https://kubernetes.default.svc \
--dest-namespace default
2
3
4
5
# 3.2.3 查看部署应用
[root@k8s-master01 ~]# argocd app get guestbook
Name: argocd/guestbook
Project: default
Server: https://kubernetes.default.svc
Namespace: default
URL: https://argocd.tchua.com/applications/guestbook
Repo: https://github.com/argoproj/argocd-example-apps.git
Target:
Path: guestbook
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: OutOfSync from (53e28ff)
Health Status: Missing
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service default guestbook-ui OutOfSync Missing
apps Deployment default guestbook-ui OutOfSync Missing
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 3.2.3 触发应用部署集群
[root@k8s-master01 ~]# argocd app sync guestbook
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
2023-06-05T14:05:25+08:00 Service default guestbook-ui OutOfSync Missing
2023-06-05T14:05:25+08:00 apps Deployment default guestbook-ui OutOfSync Missing
2023-06-05T14:05:25+08:00 Service default guestbook-ui OutOfSync Missing service/guestbook-ui created
2023-06-05T14:05:25+08:00 apps Deployment default guestbook-ui OutOfSync Missing deployment.apps/guestbook-ui created
2023-06-05T14:05:25+08:00 Service default guestbook-ui Synced Healthy service/guestbook-ui created
2023-06-05T14:05:25+08:00 apps Deployment default guestbook-ui Synced Progressing deployment.apps/guestbook-ui created
Name: argocd/guestbook
Project: default
Server: https://kubernetes.default.svc
Namespace: default
URL: https://argocd.tchua.com/applications/guestbook
Repo: https://github.com/argoproj/argocd-example-apps.git
Target:
Path: guestbook
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: Synced to (53e28ff)
Health Status: Progressing
Operation: Sync
Sync Revision: 53e28ff20cc530b9ada2173fbbd64d48338583ba
Phase: Succeeded
Start: 2023-06-05 14:05:24 +0800 CST
Finished: 2023-06-05 14:05:25 +0800 CST
Duration: 1s
Message: successfully synced (all tasks run)
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service default guestbook-ui Synced Healthy service/guestbook-ui created
apps Deployment default guestbook-ui Synced Progressing deployment.apps/guestbook-ui created
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 3.2.4 查看资源状态
可以看到资源的部署服务预期
# 3.2.5 通过CRD方式部署
上面我们使用了agcd cli命令进行部署,其实我们还可以想其他资源配置一样,使用定义应用清单文件,下面是一个简单的例子
- 清单文件
# cat guestbook-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/argoproj/argocd-example-apps.git
targetRevision: HEAD
path: guestbook
destination:
server: https://kubernetes.default.svc
namespace: guestbook
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 资源部署
这里部署后,其实后续操作也可以直接使用argocd命令或者web ui进行管理
[root@k8s-master01 ~]# kubectl apply -f guestbook-app.yaml