argoCD 部署及常用功能和原理
argoCD 应用
官方参考链接:https://artifacthub.io/packages/helm/argo/argo-cd
https://argo-cd.readthedocs.io/en/stable/
k8s集群版本 v1.23.5
部署方式
根据官方的的部署步骤直接使用helm的方式部署到集群中即可。对应的集群版本可以参考下面的链接。
https://argo-cd.readthedocs.io/en/stable/operator-manual/installation/#helm
argo-cd 5.5.22 · argoproj/argo (artifacthub.io)
helm repo add argo https://argoproj.github.io/argo-helm
helm install my-argo-cd argo/argo-cd --version 5.5.22
登录集群
对argoCD的操作需要先登录。
[root@node1 ~]# argocd login 10.233.37.63
WARNING: server certificate had error: x509: cannot validate certificate for 10.233.37.63 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context '10.233.37.63' updated
集群管理
添加集群
目前添加的方式只有通过argocd命令行的方式进行添加。
kubernetes-admin@kubernetes
这个是从指定的配置文件中获取的集群context
;必须与配置文件中的命名是一样的才可以添加进去。context查看方法可以使用kubectl config get-contexts
查看。
指定集群需要添加--kubeconfig
指定配置文件。
使用--name
可以给添加的集群添加一个名字。
目前从使用来看,一个argoCD对接多集群的环境比如预发、测试、开发对接很容易,但是对于用户对集群的鉴权不是很友好。
[root@node1 ~]# argocd cluster add kubernetes-admin@kubernetes --kubeconfig ~/.kube/dev-config --name dev-k8s-master
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[0019] ServiceAccount "argocd-manager" created in namespace "kube-system"
INFO[0019] ClusterRole "argocd-manager-role" created
INFO[0019] ClusterRoleBinding "argocd-manager-role-binding" created
Cluster 'https://192.168.21.205:16443' added
第一次添加集群可能会无法显示集群的健康状态,创建一个应用之后就可以显示出来。
查看集群
对集群资源的操作需要使到admin用户
# 查看集群
[root@node1 ~]# argocd cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://kubernetes.default.svc pre-k8s-cluster 1.23 Successful
https://192.168.21.205:16443 dev-k8s-cluster 1.23 Successful
删除集群
# 删除集群
[root@node1 ~]# argocd cluster rm dev-k8s-cluster
也可以使用图形界面的方式来删除。
备份与恢复
官方的方法简单粗暴,使用会直接报错;需要给出argoCD部署所在集群的config文件和所在的命名空间。导出的内容为所有资源信息的yaml 资源配置清单
。
# 备份 export
# 恢复 import
argocd admin export --kubeconfig .kube/config -n argo > argocd_$(date +%F).conf_bak
# 恢复
argocd admin import --kubeconfig .kube/config -n argo < argocd_$(date +%F).conf_bak
用户管理
查看用户
[root@node1 ~]# argocd account list
NAME ENABLED CAPABILITIES
admin true login
dev-user true login
pre-user true login
system true login
# login 允许从UI登录
添加用户
在argoCD的命名空间里面直接编辑cm。
[root@node1 ~]# kubectl get cm -n argo
NAME DATA AGE
argocd-cm 7 7d21h # 对用户的创建和删除
argocd-gpg-keys-cm 0 7d21h
argocd-notifications-cm 1 7d21h
argocd-rbac-cm 2 7d21h # 用户对资源的鉴权
argocd-ssh-known-hosts-cm 1 7d21h
argocd-tls-certs-cm 0 7d21h
kube-root-ca.crt 1 7d21h
argocd-cm
包含对admin的管理和普通用户的创建。下面的内容一共创建了三个accounts
。非admin用户即使在rbac中全部放行了全部resource
的权限但是还是无法操作全部的资源。
[root@node1 ~]# kubectl -n argo edit cm argocd-cm
apiVersion: v1
data:
accounts.dev-user: login
accounts.pre-user: login
accounts.system: login
admin.enabled: "false"
application.instanceLabelKey: argocd.argoproj.io/instance
exec.enabled: "false" # 命令终端
server.rbac.log.enforce.enable: "false"
admin.enabled: "false" # 是否启用admin用户
accounts.pre-user: login # 新建pre-user的用户,允许从UI登录
用户的鉴权
参考链接:https://argo-cd.readthedocs.io/en/stable/operator-manual/rbac/
目前现有环境中有三个用户admin
用户在环境配置好了之后直接禁用掉,然后运维人员使用system
用户来操作集群的资源,pre-user
限制特定的资源来给用户使用。
[root@node1 ~]# argocd account list
NAME ENABLED CAPABILITIES
admin true login
pre-user true login
system true login
[root@node1 ~]# kubectl -n argo edit cm argocd-rbac-cm
apiVersion: v1
data:
policy.csv: |
p, system, *, *, */*, allow
p, pre-user, *, *, argo-ng-kboss/*, allow
p, pre-user, clusters, *, argo-ng-kboss/*, deny
p # policy
dev-user # 用户
* # 集群
* # 动作
*/* # 项目/app
allow # 允许 拒绝/deny
# 如果用户没有在组中或者是关联特定的role,默认使用这条策略,对资源只有只读的权限且无法修改资源。
policy.default: role:readonly
# 此策略展示了test role对test 环境的应用权限。
p, role:test-admins, applications, create, test-*/*, allow
p, role:test-admins, applications, delete, test-*/*, allow
p, role:test-admins, applications, get, test-*/*, allow
p, role:test-admins, applications, override, test-*/*, allow
p, role:test-admins, applications, sync, test-*/*, allow
p, role:test-admins, applications, update, test-*/*, allow
p, role:test-admins, logs, get, test-*/*, allow
p, role:test-admins, exec, create, test-*/*, allow
p, role:test-admins, projects, get, test-*, allow
g, test-admin, role:test-admins
# g test-admin用户 绑定test-admins的role。
里面的clusters
字段指对argoCD中集群功能的管理,无法做到用户对单一集群的鉴权。*
表示支持正则匹配。
资源:clusters``projects``applications``repositories``certificates``accounts``gpgkeys``logs``exec
动作:get``create``update``delete``sync``override``action/<group/kind/action-name>
修改用户密码
默认输入admin用户的秘密码就可以更改其它用的权限配置。根据交互的提示信息输入即可。
# argocd account update-password --account dev-user
--account # 指定用户,默认是修改当前登录用户
system
system.1
pre-user
pre-user
dev-user
dev-user
项目管理
新建项目
setting
-> projects
->NEW PROJECT
几个重要的信息,项目的基础信息,可以添加名称和描述,添加label用来过滤。
SOURCE REPOSITORIES
部署应用的源信息,设置之后创建的app属于这个项目,那么模板的源信息只能从这个url获得。
DESTINATIONS
应用部署到的目的集群,如果应用属于这个项目那么同步的目的集群只能是项目中配置的集群。
app管理
创建app的时需要注意app与projects中配置的资源信息对应,不然会直接报错。
CLI创建app
argocd app create pre-front-jian-butler-admin-ui --project pre-jian-butler --repo https://git.kailinesb.com/ops/argocd-helm-template.git --path jian-butler-admin-ui/cluspre-front-jian-butler-admin-ui ter-pre/helm --dest-namespace jian-butler --dest-server https://kubernetes.default.svc --helm-set app_name=front-jian-butler-admin-ui --helm-set type=nginx
pre-front-jian-butler-admin-ui # 创建的app名称
--project # 属于哪个项目
--repo # 部署的源仓库地址
--path # 模板在仓库的路径
--dest-namespace # app部署的命名空间
--dest-server # app部署到的k8s cluster
--helm-set k1=v1 # 设置helm的变量,多个值重复使用 --helm-set
--help # 查看帮助信息
图形界面创建
Application Name
app的名称。
Project Name
app属于哪个项目的。
SYNC POLICY
同步的策略,可以选择手动或者自动。
Repository URL
git仓库的地址
Path
模板所在的路径
如果路径正取会显示helm被渲染的所有变量。如果需要手动设置的,在设置之后会有一个锤子状的图案。
argoCD 时间问题
[官方文档](模板 - Argo CD - 声明性 GitOps CD 用于 Kubernetes (argo-cd.readthedocs.io))
需要给每个pod的控制器添加环境变量,需要修改deployment 和 sts 控制器的env
# kubectl get all -n argo
deployment.apps/argo-cd-argocd-applicationset-controller
deployment.apps/argo-cd-argocd-dex-server
deployment.apps/argo-cd-argocd-notifications-controller
deployment.apps/argo-cd-argocd-redis
deployment.apps/argo-cd-argocd-repo-server
deployment.apps/argo-cd-argocd-server
statefulset.apps/argo-cd-argocd-application-controller
# 添加容器的环境变量
env:
- name: LC_TIME
value: POSIX
- name: TZ
value: Asia/Shanghai
打开终端功能
# kubectl edit cm -n argo argocd-cm
exec.enabled "true"
# kubectl edit clusterrole argo-cd-argocd-server
--------参考/添加到末尾-------
- apiGroups:
- ""
resources:
- pods/exec
verbs:
- create
# 添加 RBAC 规则以允许用户访问资源,即createexec
p, role:myrole, exec, create, */*, allow
远程仓库管理
argoCD 的远程仓库,如果创建了同名的远程仓库会出现无法删除的情况,仓库配置信息是存储在部署的命名空间下使用secret
来存储的。手动的在UI删除会直接报错。需要手动的在k8s集群中删除。
# kubectl get secrets -n argo
repo-1884816892
repo-3508549329
repo-507453937
repo-533094657
# kubectl get secrets repo-1015242351 -n argo -o yaml
apiVersion: v1
data:
name: YXJnby10ZXN0
project: YXJnby10ZXN0
# 通过base64 -d 解码来查看原始的内容
# echo YXJnby10ZXN0 | base64 -d
argo-test
# 删除远程仓库
# kubectl delete secrets repo-1015242351 -n argo
GitlabCI 实现对argoCD模板的更新.
通过在CI中运行stage运行脚本的方式,就可以对app的模板进行更新,而不用修改模板本身,这样实现了统一的部署模板。
#!/bin/bash
INSTANCE_ID=`uuid | base64 | cut -c1-21`
TIME_STAMP=`date +%s`
# 生成修改的变量,前端的加上front的路径前缀。
APP_NAME=front-${CI_PROJECT_NAME}
argocd login 192.168.21.101:30594 --username cisystem --password $GIT_CD_PASSWORD --insecure
case $ENVIRONMENT in
pre)
argocd app set pre-$APP_NAME --helm-set envs.default.BUILD_AT=$TIME_STAMP \
--helm-set image.branch=$CI_COMMIT_BRANCH \
--helm-set envs.default.COMMIT_ID=$CI_COMMIT_SHA \
--helm-set image.tag=$CI_PIPELINE_ID ;;
dev)
argocd app set dev-$APP_NAME --helm-set envs.default.BUILD_AT=$TIME_STAMP \
--helm-set image.branch=$CI_COMMIT_BRANCH \
--helm-set envs.default.COMMIT_ID=$CI_COMMIT_SHA \
--helm-set image.tag=$CI_PIPELINE_ID ;;
test)
argocd app set test-$APP_NAME --helm-set envs.default.BUILD_AT=$TIME_STAMP \
--helm-set image.branch=$CI_COMMIT_BRANCH \
--helm-set envs.default.COMMIT_ID=$CI_COMMIT_SHA \
--helm-set image.tag=$CI_PIPELINE_ID ;;
*)
echo -e "\033[31m 请给变量ENVT赋值 pre dev test !!! 对应要发布到的环境中 master --> pre \033[0m"
argocd logout 192.168.21.101:30594
exit 1 ;;
esac
# 退出登录
argocd logout 192.168.21.101:30594
echo -e "\033[31m BUILD_AT: ---------------------------------------------------------- $TIME_STAMP \033[0m"
echo -e "\033[31m COMMIT_ID: --------------------------------------------------------- ${CI_COMMIT_SHA} \033[0m"
echo -e "\033[31m CI_PROJECT_NAME: --------------------------------------------------- $CI_PROJECT_NAME \033[0m"
echo -e "\033[31m CI_PROJECT_PATH: --------------------------------------------------- $CI_PROJECT_PATH \033[0m"
echo -e "\033[31m CI_PROJECT_NAMESPACE: ---------------------------------------------- $CI_PROJECT_NAMESPACE \033[0m"
echo -e "\033[31m CI_PIPELINE_ID: --------------------------------------------------- $CI_PIPELINE_ID \033[0m"
模板中生成随机数的问题
https://argo-cd.readthedocs.io/en/stable/user-guide/helm/#random-data