【GitOps】Argo CD部署应用程序

发布于:2025-09-04 ⋅ 阅读:(19) ⋅ 点赞:(0)

Argo CD部署应用程序

一、添加集群

  • 可以使用命令来添加集群(本机需要添加hosts解析)

1.1、登录集群

# 登录 Argo CD
[root@master ~]# argocd login grpc.argocd.devops-engineer.com.cn
WARNING: server certificate had error: tls: failed to verify certificate: x509: certificate is valid for ingress.local, not argocd.devops-engineer.com.cn. Proceed insecurely (y/n)? y
WARN[0002] 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.devops-engineer.com.cn' updated

1.2、查看上下文

# 查看 Argo CD 上下文
[root@master ~]# argocd context
CURRENT  NAME                           SERVER
*        grpc.argocd.devops-engineer.com.cn  grpc.argocd.devops-engineer.com.cn

1.3、列出账户

[root@master ~]# argocd account list
NAME   ENABLED  CAPABILITIES
admin  true     login

1.4、添加集群

# 列出默认集群
# 默认集群是有点问题的
[root@master ~]# argocd cluster list
SERVER                          NAME        VERSION  STATUS   MESSAGE                                                  PROJECT
https://kubernetes.default.svc  in-cluster           Unknown  Cluster has no applications and is not being monitored.
# 查看 k8s 集群使用账户
[root@master ~]# kubectl config get-contexts -o name
kubernetes-admin@kubernetes
# 添加集群
[root@master ~]# argocd cluster add kubernetes-admin@kubernetes
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `kubernetes-admin@kubernetes` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0028] ServiceAccount "argocd-manager" created in namespace "kube-system" 
INFO[0028] ClusterRole "argocd-manager-role" created    
INFO[0028] ClusterRoleBinding "argocd-manager-role-binding" created 
INFO[0033] Created bearer token secret for ServiceAccount "argocd-manager" 
Cluster 'https://192.168.93.145:6443' added

二、前往UI页面操作

  • 登录后,点击 + New App 按钮,如下所示:
    在这里插入图片描述

  • 为您的应用程序指定名称 ,使用项目 ,并将同步策略保留为 :guestbook``default``Manual

  • guestbook:应用程序名称

  • default:项目名称

  • Manual:同步策略

  • 勾选AUTO-CREATE-NAMESPACE:如果要创建的目标集群中没有此名称空间,将会自动创建
    在这里插入图片描述

  • 将 https://github.com/wzhkgc/argocd-demo.git 仓库 url 设置为 github 仓库 url ,将 revision 保留为HEAD ,并将路径设置为 :guestbook

  • guestbook:指的是Kubernetes资源清单路径,在此目录下
    在这里插入图片描述

  • 对于Destionation(目标),也就是要把应用程序部署到哪个集群中,可以添加https://192.168.93.145:6443,或者默认集群https://kubernetes.default.svc

  • Namespace:要把应用部署的名称空间(如果在上面的部署中勾选了AUTO-CREATE-NAMESPACE则不需要提前手动创建,CD流程会自动帮助我们创建),最后点击CREATE
    在这里插入图片描述

在这里插入图片描述

  • 通过 CLI 查看项目的状态
  • 此时还是为同步状态
[root@master ~]# argocd app get guestbook
Name:               argocd/guestbook
Project:            default
Server:             https://192.168.93.145:6443
Namespace:          argocd-demo
URL:                https://grpc.argocd.devops-engineer.com.cn/applications/guestbook
Repo:               https://github.com/wzhkgc/argocd-demo.git
Target:             HEAD
Path:               guestbook
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        OutOfSync from HEAD (c6f7e7a)
Health Status:      Missing

GROUP  KIND        NAMESPACE    NAME          STATUS     HEALTH   HOOK  MESSAGE
       Service     argocd-demo  guestbook-ui  OutOfSync  Missing        
apps   Deployment  argocd-demo  guestbook-ui  OutOfSync  Missing

三、通过 UI 同步应用

  • 在 Applications 页面上,单击 guestbook 应用程序的 Sync 按钮
    在这里插入图片描述
    在这里插入图片描述

  • 此时可以去查看名称空间知否被自动创建和Pod是否运行

[root@master ~]# kubectl get pod -n argocd-demo 
NAME                            READY   STATUS    RESTARTS   AGE
guestbook-ui-56c646849b-m6jgb   1/1     Running   0          87s
  • 当我们在代码仓库进行了更改,比如变更Pod副本数量
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 通过之后即可看到控制器的Pod数量为期望数量
[root@master ~]# kubectl get pod -n argocd-demo 
NAME                            READY   STATUS    RESTARTS   AGE
guestbook-ui-56c646849b-m6jgb   1/1     Running   0          10m
guestbook-ui-56c646849b-zbwn4   1/1     Running   0          65s
# 看到副本变更了,也就是代码库中的期望值了,其实这个操作在 CLI 也支持,大家可以去发掘一下使方法,那么通过 Web UI 创建应用我们讲过了,那么还有一种就是通过 K8S 的 CRD 来创建应用
[root@master ~]# kubectl get crd | grep argoproj
applications.argoproj.io                              2024-12-21T00:33:00Z
applicationsets.argoproj.io                           2024-12-21T00:33:00Z
appprojects.argoproj.io                               2024-12-21T00:33:00Z
# 可以看到,这里有三个 CRD 资源对象,我们可以通过创建 CRD 同步创建应用,其实是和Web UI 一样的,Web UI 创建之后,CRD 也会同步创建一个对象
[root@master ~]# kubectl get applications -n argocd
NAME        SYNC STATUS   HEALTH STATUS
guestbook   Synced        Healthy
# 可以看到这里的确是有一个和 Web UI 一样的应用,我们可以通过导出它的 YAML 来看看都是怎么样定义的
[root@master ~]# kubectl get application -n argocd guestbook -o yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  creationTimestamp: "2024-12-21T02:38:22Z"
  generation: 28
  name: guestbook
  namespace: argocd
  resourceVersion: "20129"
  uid: 69dd8ac2-72e2-418f-bae8-6a33dea32975
spec:
  destination:
    namespace: argocd-demo
    server: https://192.168.93.145:6443
  project: default
  source:
    path: guestbook
    repoURL: https://github.com/wzhkgc/argocd-demo.git
    targetRevision: HEAD

四、CLI自定义Application

  • 因为前面讲过,Argo CD 主要就是负责 CD 方面的操作,所以主要就是将上面的流水线中的Deploy这一步放到 Argo CD中去做,那么其实生成中都知道一个操作,就是我们的 CI/CD 的部署文件其实一般不会和代码存放在一起的,会把代码和部署清单放到两个仓库进行存储。
# 定义 Pod 资源
[root@master argocd-deploy]# cat pod.yaml 
apiVersion: "v1"
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
    
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
# 定义 service 资源
[root@master argocd-deploy]# cat service.yaml 
apiVersion: "v1"
kind: Service
metadata:
  name: test
spec:
  selector:  # 标签选择器
    app: nginx   # 指定后端服务Pod,把流量路由到带有app=nginx的后端Pod上
  type: ClusterIP  # 使用了Ingress,此处的svc的类型写为ClusterIP是一个规范的用法
  ports:
  - port: 80  # 对外暴露80端口
    targetPort: 80  # 此处填写容器真实暴露出来的端口,流量将会被路由到这个端口上
# 定义 Ingress 资源
[root@master argocd-deploy]# cat service.yaml 
apiVersion: "v1"
kind: Service
metadata:
  name: test
spec:
  selector:  # 标签选择器
    app: nginx   # 指定后端服务Pod,把流量路由到带有app=nginx的后端Pod上
  type: ClusterIP  # 使用了Ingress,此处的svc的类型写为ClusterIP是一个规范的用法
  ports:
  - port: 80  # 对外暴露80端口
    targetPort: 80  # 此处填写容器真实暴露出来的端口,流量将会被路由到这个端口上
[root@master argocd-deploy]# cat ingress.yaml 
apiVersion: "networking.k8s.io/v1"
kind: Ingress
metadata:
  name: mini-ingress
  labels:
    app: nginx
  annotations: 
    nginx.ingress.kubernetes.io/rewrite-target: "/"  
spec:
  ingressClassName: nginx
  rules:
  - host: work.argocd.cn   # 访问域名,当用户访问这个域名的时候,Ingress将应用以下规则
    http:
      paths:
      - path: / 
        pathType: Prefix
        backend: 
          service: 
            name: test
            port:
              number: 80
  • 这个仓库其实就是把 cdk-web-service 中的 deploy 下的部署文件分离出来,仅此而已,然后我们去创建一个应用,这个应用就是针对这个代码仓库,我们这次使用 CRD 仓库
    在这里插入图片描述
[root@master ~]# cat cdk-web-service-app.yaml 
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: cdk-web-service
  namespace: argocd
spec:
  destination:
    namespace: default
    server: 'https://192.168.93.145:6443'
  source:
    path: .  # 在项目根目录下寻找 K8S 资源清单
    repoURL: http://192.168.93.102/root/argocd-deploy.git
    targetRevision: HEAD
  project: default
  syncPolicy:
    automated:
      # 开启后 Git Repo 中删除资源会自动在环境中删除对应的资源
      prune: true
      # 自动痊愈,强制以 Git Repo 状态为准,手动在环境中修改不会生效
      selfHeal: true
# 查看 Application 状态
[root@master ~]# kubectl get application -n argocd
NAME              SYNC STATUS   HEALTH STATUS
cdk-web-service   Synced        Progressing
guestbook         Synced        Healthy
# 查看之后新创建的 Application 状态是不对劲的,
# 这是因为 Ingress 是在集群内不可访问的,那么需要修改 argocd 的 configmap
[root@master ~]# kubectl edit cm -n argocd argocd-cm
apiVersion: v1
# 添加这些信息
data:
  resource.customizations: |
    networking.k8s.io/Ingress:
        health.lua: |
          hs = {}
          hs.status = "Healthy"
          return hs
# 到这里是结尾
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"argocd-cm","app.kubernetes.io/part-of":"argocd"},"name":"argocd-cm","namespace":"argocd"}}
  creationTimestamp: "2024-12-21T00:15:23Z"
  labels:
    app.kubernetes.io/name: argocd-cm
    app.kubernetes.io/part-of: argocd
  name: argocd-cm
  namespace: argocd
  resourceVersion: "22550"
  uid: 558d369c-db47-4bd2-b249-6982a427ae11
# 再次查看 Application 创建
[root@master ~]# kubectl get application -n argocd
NAME              SYNC STATUS   HEALTH STATUS
cdk-web-service   Synced        Healthy
guestbook         Synced        Healthy
  • Web UI 也会自动生成相应的 Application 页面
    在这里插入图片描述

网站公告

今日签到

点亮在社区的每一天
去签到