Argo CD 部署及应用

2021年06月18日

前言

缘起:针对自动构建工具一直都是运维同学不能避免的话题,而我也不可避免,在没有接触该软件之前一直在使用 Jenkins配合 GitlabDocker进行 CICD 的一系列整合。并且已经实现了日常工作自动化。但是在浏览云原生计算基金会(Cloud Native Computing Foundation)1,发现 各种周边生态很活跃进而查看我关注的 CICD类别,发现 argo非常符合我目前的需求,从而决定研究下。


入迷: 在研究的过程中随着不断的深入发现设计者想的真的很全面,内部不但包括(k8s 的多集群管理、k8s 内生态管理、GitOPS 的结合等等)这使我深深的着迷,不单单是设计的思想还有确实能解决我目前在公司推动 DEVOPS理念。


实现:因本地存在自建 Kubernetes 集群所以直接在集群上构建此应用,具体步骤在下文。


评价

  1. K8S结合GITOPS 实现日常服务持续交付;
  2. 将开发引入 K8S 自动 CICD 的场景中,推动 DEVOPS 进度;
  3. 实现应用程序定义、配置和环境版本控制。应用程序部署和生命周期管理的自动化、可审计;

部署 Argo

本文使用 Helm 方式进行Argo 的部署,其中的细节都会在下文列出

  • 获取 Argo Helm 源2

    $ helm repo add argo https://argoproj.github.io/argo-helm
    
  • 缓存并解压所需仓库到本地(方便自定义配置)

    $ helm fetch argo/argo-cd
    $ tar xzf argo-cd-3.6.8.tgz
    
  • 更改镜像地址

    # 更改主配置文件 values.yaml
    global.image.repository: # 更改为自己的镜像,或者使用官方镜像
    
  • 更改 argocd-server command 参数(因为需要将部署好的 argocd 服务通过 ingerss 发布到私网)

    # 在文件argo-cd/templates/argocd-server/deployment.yaml的 49 行左右添加如下字段
    command:
    - argocd-server
    - --staticassets
    - /shared/app
    - --repo-server
    - {{ template "argo-cd.repoServer.fullname" . }}:{{ .Values.repoServer.service.port }}
    - --insecure  # 添加该字段,不能更换位置添加,不然 ingress 不能使用
    {{- if .Values.dex.enabled }}
    - --dex-server
    - http://{{ template "argo-cd.dex.fullname" . }}:{{ .Values.dex.servicePortHttp }}
    {{- end }}
    - --logformat
    - {{ .Values.server.logFormat }}
    - --loglevel
    - {{ .Values.server.logLevel }}
    {{- if or (and .Values.redis.enabled (not $redisHa.enabled)) (and $redisHa.enabled $redisHa.haproxy.enabled) }}
    - --redis
    - {{ template "argo-cd.redis.fullname" . }}:{{ .Values.redis.servicePort }}
    {{- end }}
    {{- with .Values.server.extraArgs }}
    {{- . | toYaml | nindent 8 }}
    {{- end }}    
    
  • 配置 ingress

    因该服务存在 2 个对外服务所以本文使用多域名进行拆分,如需其他方法请参考3

    # ingress_ui.yaml
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: argocd-server-http-ingress
      namespace: argocd
      annotations:
        kubernetes.io/ingress.class: "nginx"
        nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
        nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
    spec:
      rules:
      - http:
          paths:
          - backend:
              serviceName: argocd-server
              servicePort: http
        host: argocd.magic.com
      tls:
      - hosts:
        - argocd.magic.com
        secretName: argocd-secret # 不要更改此项
    # ingress_grps.yaml
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: argocd-server-grpc-ingress
      namespace: argocd
      annotations:
        kubernetes.io/ingress.class: "nginx"
        nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
    spec:
      rules:
      - http:
          paths:
          - backend:
              serviceName: argocd-server
              servicePort: https
        host: grpc.argocd.magic.com
      tls:
      - hosts:
        - grpc.argocd.magic.com
        secretName: argocd-secret # do not change, this is provided by Argo CD
    
  • 部署 Argo CD

    $ cd argo-cd
    $ helm install --namespace argocd argocd . #  此处命名空间如果不存在需要预先创建,并且不建议更换其他名称。
    $ helm list -n argocd                     
    NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
    argocd  argocd          4               2021-06-18 16:04:36.028762 +0800 CST    deployed        argo-cd-3.6.8   2.0.3
    $ kubectl apply -f ingress_grps.yaml && kubectl apply -f ingress_ui.yaml
    
    # 查看各个部署信息
    $ kubectl get pod,svc,ingress -n argocd
    NAME                                                 READY   STATUS    RESTARTS   AGE
        pod/argocd-application-controller-64dc54fb54-m24zw   1/1     Running   0          4h20m
        pod/argocd-dex-server-846cd5d6f4-649t6               1/1     Running   0          4h20m
        pod/argocd-redis-7dfb666bc9-f7248                    1/1     Running   0          4h20m
        pod/argocd-repo-server-c5b8b6bcb-7vws4               1/1     Running   0          4h20m
        pod/argocd-server-5465554-b82vh                      1/1     Running   0          4h20m
    
    NAME                                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
    service/argocd-application-controller   ClusterIP   10.150.100.219   <none>        8082/TCP            4h20m
    service/argocd-dex-server               ClusterIP   10.150.168.106   <none>        5556/TCP,5557/TCP   4h20m
    service/argocd-redis                    ClusterIP   10.150.158.168   <none>        6379/TCP            4h20m
    service/argocd-repo-server              ClusterIP   10.150.70.81     <none>        8081/TCP            4h20m
    service/argocd-server                   ClusterIP   10.150.25.143    <none>        80/TCP,443/TCP      4h20m
    
    NAME                                            HOSTS                   ADDRESS   PORTS     AGE
    ingress.extensions/argocd-server-grpc-ingress   grpc.argocd.magic.com             80, 443   26h
    ingress.extensions/argocd-server-http-ingress   argocd.magic.com                  80, 443   26h
    
  • 查看并登陆页面

    • 登陆用户名: admin
    • 登陆密码: kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

使用 Argo

此处注意: 因为本列中 Argo 安装在 Kubernetes 中,所以在 Argo 中所配置的 gitlab或者其他仓库地址需要保证 Kubernetes 集群内的 pod 可以访问,不让会出现同步失败

  • 添加Git仓库

  • git 仓库结构

    .
    ├── README.md
    └── argocd
        ├── app.yaml
        ├── configmaps
        │   └── configmap.yaml
        ├── deployments
        │   └── deployment.yaml
        ├── ingress
        │   └── ingress.yaml
        ├── secrets
        │   └── secret.yaml
        └── services
            └── service.yaml
    
  • 应用 app.yaml

    $ kubectl apply -n argocd -f app.yaml 
    
    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: argocd-yulong
      namespace: argocd
    spec:
      project: default
      source:
        repoURL: http://gitlab.magic.com/root/arogocd.git
        targetRevision: HEAD
        path: argocd
        directory:
          recurse: true
      destination:
        server: https://kubernetes.default.svc
        namespace: argocd-yulong
      syncPolicy:
        automated:
          prune: false
          selfHeal: false
    
  • 页面查看


  • 测试git 提交自动同步更新(默认 3 分钟自动同步更新)

    提交代码忽略,本次测试缩减 replicas: 1 到replicas: 3

  • 细节问题

    在测试过程中添加了 ingress 后 argo cd 的检测心跳一直是Progressing 导致页面显示异常,经过大量的资料查询4、Issues5、Argo Halth6,做出如下解决

    # 在部署 argo value.yaml 中搜索 argocd-cm 添加如下配置
    # 相当于自定义 ingress 检测,使用 lua 当为空时显示正常
    application.instanceLabelKey: argocd.argoproj.io/instance
    resource.customizations: |
      extensions/Ingress:
          health.lua: |
            hs = {}
            hs.status = "Healthy"
            return hs
    

完成

经过以上部署和使用,可以实现 argo 的部署和使用,本次的文档就写到这里,后续继续更新 webhooks 等一系列关联使用


  1. 云原生计算基金会网址 ↩︎

  2. https://www.cncf.io/ ↩︎

  3. argo Ingress 实现方法 ↩︎

  4. 官网 FAQ ↩︎

  5. issues ↩︎

  6. Resource Health ↩︎

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐