gitops 之argocd

封面图片

简介:本文旨在通过实际的例子让大家感受argocd如何实现gitops的CD 管理,帮助你快速的在实际生产环境中快速使用起来argocd。

本文实践全是基于其argocd 官方网址以及arogcd github

系列文章同步更新中:

argocd的secret管理之SealedSecret:在git里面加密敏感配置
argocd告警管理之notification服务:让你第一时间得到argocd app的状态信息
argocd蓝绿/金丝雀发布之rollout: 快速方便的启用基于gitops的蓝绿/金丝雀发布
gitops之argocd

一,argocd安装部署

1,首先你的有个k8s集群,关于搭建k8s集群还是比较简单,可以自行解决哈,如果用kubeadm搭建也可以参考 我的github地址.
2, 安装argocd
如果你应用于你的生产考虑HA等点击我了解详细的官方安装yaml

快速简单安装使用如下命令:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

3,安装完成后如下:
3.1


安装后的deployment

3.1.1
argocd-application-controller: controller 是argocd的处理器,主要是帮你管理你的k8s 资源,基本上你之前用kubectl 做的的操作它都集成了,operater的controller。
当你的app过多时,可以通过修改启动参数提高其处理能力如下:

修改argocd-application-controller的配置清单 deployment

controller uses two separate queues to process application reconciliation (milliseconds) and app syncing (seconds). Number of queue processors for each queue is controlled by --status-processors (20 by default) and --operation-processors (10 by default) flags. Increase number of processors if your Argo CD instance manages too many applications. For 1000 application we use 50 for --status-processors and 25 for --operation-processors

argocd-dex-server: 认证token服务,为后面实现gitlab登录等。高可用版本时候不支持多pod,只能单个pod。

The argocd-dex-server uses an in-memory database, and two or more instances would have inconsistent data

argocd-redis: 缓存所用。
argocd-repo-server: 这个服务主要功能是去git 你的gitlab 公有/私有仓库到argocd-repo-server这个pod里面最后让argocd进行相应的kubectl 操作。高可用建议:多个pod来处理多个应用在一个repo的场景。repo管理建议:repo里面主要存放配置管理文件以免消耗过多的本地空间,因为argocd-repo-server会拉取你的repo 到本地。如果repo实在是太大的话,建议挂载磁盘到该服务的/tmp目录。
argocd-server: argocd 的前后端服务,整个web服务。里面还内置helm/kubectl 等工具,具体可以进入到pod里面去查看。
3.2

安装后的service

正如上图所示我们将argocd-server 用nodeport的方式暴露出来以供我们访问argocd的界面。值得注意的是需要我们自己去安装清单文件里面去修改暴露的方式。

二,argocd界面使用

argocd 登录界面
1, 登录用户名密码admin/<argocd-pod-name>
2, 界面使用之settings

Argocd settings

2.1 Repositories:添加私有repo 地址,让argocd 有权限去你的私人仓库git pull代码,注意ssk-key的权限最好是owner,因为他不光是git clone 还有很多git的操作比如查看你的revision等。然后就是你的gitlab 的网络最好是和argocd在一个内网里面这样会稳定点。
添加成功的状态

2.2 Clusters: cluster 功能主要是为了添加多kubernetes 集群管理支持的,这样你只需要将argocd部署在一个k8s集群,然后通过cluster功能关联新的k8s集群,即可将你的应用部署到相关连的多个集群上。
添加集群后的显示

注意:目前不支持界面手动添加cluster,只能通过命令行添加:
添加多个cluster之shell 代码支持
总结:
第一步: 按照官方文档添加多cluster信任
第二步:

#列出你当集群当前添加过的信任的集群,类似kubectl config get-contexts
#所以前提是你先将你的待添加k8s集群加入到你的contexts里面。
argocd cluster add
##一切都准备好了之后就可以用这个命令添加你的目标机器到你的argocd server了
argocd cluster add <contenxt-name>

The above command installs a ServiceAccount (argocd-manager), into the kube-system namespace of that kubectl context, and binds the service account to an admin-level ClusterRole. Argo CD uses this service account token to perform its management tasks (i.e. deploy/monitoring).

添加成功的输出

最后你就可以在创建app的时候选择需要部署的目标集群了。
2.2.1 如何添加rancher RKE 到argocd管理?
详细可以访问 最佳解决方案
如果不能访问,请按照如下secret配置好rancher的访问。需要的token 和ca你均能在rancher kubeconfig里面找到。BTW ,ca.pem需要base64 -d回来。

apiVersion: v1
kind: Secret
metadata:
  name:  <secret 的名字:mysql-cluster-secret>
  labels:
    argocd.argoproj.io/secret-type: cluster
  namespace: argocd
type: Opaque
stringData:
  name: <argocd 设置界面显示名字>
  server: <rancher rke endpoint> https://<IP>/k8s/clusters/c-27fv2
  config: |
      {
        "bearerToken": "<token>",
        "tlsClientConfig": {
          "insecure": false,
          "caData": "<ca.pem>"
                         }
      }

2.3 Projects: settings之project管理,project 主要用来做权限限制的,我们将不同的app的app放在不同的project以方便我们区分和管理,project可以限制所管理的app部署时间通过sync windows、限制app部署的集群/命名空间等、以及那个APP才能部署。后期做相应的权限控制比如指定某个用户只能对某个project里面的app进行sync等操作。
2.3.1 创建project可以通过界面直接创建也可以通过以下yaml创建:

project 管理界面

#############project here
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: <project name here>
  namespace: argocd
spec:
##部署窗口设置,如下
  syncWindows:
  - kind: allow
    ##+8 utc  eveyday 9-11 can be sync
    schedule: '0 1 * * *'
    duration: 12h
    applications:
    - '*'
    manualSync: false
  # Project description
  description: <project 描述方便维护>
  # Allow manifests to deploy from any Git repos
  sourceRepos:
##限制你project能git的 repo
  - 'https://github.com/keanlee/kubernetes_deploy.git'
  # Only permit applications to deploy to the guestbook namespace in the same cluster
  destinations:
  - namespace: <对命名空间进行限制>
    server: https://<ip addr>:6443 ##对集群进行限制,限制app只能部署到指定集群
  # Enables namespace orphaned resource monitoring.
  orphanedResources:   ##这个功能主要是启动对非argocd管理的k8s 资源进行管理(删除 修改配置等)
    warn: true

以上操作均可通过界面操作如下图:


project丰富的界面操作

启用orphanedResources后在app界面的开关

上面这个选项勾选后会利用argocd强大的界面讲此app 同一个namespace下的所以资源罗列出来:


通过虚实结合的方式显示出当前被argocd管理的和未被管理的资源

通过该界面你不管能看到这些未被argocd管理的资源而且还能对其进行修改。
sync window 可以限制什么时间才能部署你project里面的app
2, 界面使用之app管理

2.1 创建app:

通过界面创建app

通过简单的界面提醒我们就能非常快捷的创建出一个我们的app来,下面如何通过yaml来创建:
yaml 自动化创建app


##因为argocd 是一个operator实现,所以我们可以通过如下命令进行查看和修改:
#kubectl get Application -n gitops
NAME    AGE
nginx   22m
argocd强大的界面显示

2.2 配置管理工具支持:
2.2.1 原始的yaml支持:


原始文件的支持,只有后缀是yaml的都会被同步

2.2.2 helm等工具的支持
helm是目前比较推荐的上argocd的方式,通过不同的values 文件区分出不同的环境,从而达到一套部署模板适用于多个环境。不同的values可以在创建app的时候通过参数指定:

...
 helm:
   valueFiles:
   - values-producation.yaml
...

2.3 同步方式选择:
2.3.1 手动同步,这种方式就是创建了app后需要每次在界面点击 sync按钮方能从你的git 仓库中拉取最新的部署代码进行操作。
2.3.2 自动同步:


自动同步启用中
#代码中启用
...
syncPolicy:
  automated:
    prune: true  #是否随着部署文件删除回收资源,例如你有个service的配置,启用后当你在gitlab里面注释或删除了该配置代码后,argocd会将其对应的service资源删除
    selfHeal: true #自愈功能,时刻保持和git仓库同步,例如有人通过k8s dashboad改了你的一个配置,这个功能启用后快速冲掉其修改的配置,通过k8s dashboard删除该资源也一样会快速创建。包括但不限于deployment。
...

总结

以上就是关于argocd的基本使用,更多详细的使用请移步官方网站。