部署思路踩坑整理
- ArgoCD和ArgoCD Image Updater是2个不同的程序。“ArgoCD Image Updater小工具”没有集成在ArgoCD中需要单独部署。
单独的ArgoCD能够实现基于git仓库变更作为应用部署的事实来源。 参考子页:argocd根据镜像tag变化实现自动发布的2种方式。 - ArgoCD +“ArgoCD Image Updater小工具”能够实现以镜像仓库中镜像tag变更作为应用部署的事实来源。
- ArgoCD Image Updater小工具”部署略显繁琐,并不只是apply官方提供的yaml让pod运行就可以了,需要打通和argocd的认证等操作。
- ArgoCD 或“ArgoCD Image Updater小工具”按照官方提供的install.yaml 部署后,如果修改其中的cm或者参数,不要采取在原yaml修改后再提交的方式,应该 用命令修改。因为yaml太长太复杂了!
- 配置了回写时,ArgoCD Image Updater 并不会直接修改git仓库yaml 文件的tag,而是会创建一个.开头的yaml 文件(此例为".argocd-source-dev-smart-doc.yaml"),每次更新都会覆盖此文件的images内容。
- 其它
- argocd 配置gitlab,http用户名密码方式可以实现认证并回写。
- harbor公开仓库配置的时候不需要用户名和密码,可以使用http请求。
- “ArgoCD Image Updater小工具”会每隔2分钟检索配置的镜像仓库是否有新的镜像需要拉取部署,但是UI页面刷新会有延时,如果要看最新的状态需要点击下"REFRESH"按钮。
ArgoCD + “ArgoCD Image Updater小工具” 部署步骤:
1、安装ArgoCD
# kubectl create namespace argocd
# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
安装 Argo CD CLI 命令行工具
# wget https://github.com/argoproj/argo-cd/releases/download/v1.7.10/argocd-linux-amd64
或者用win访问 https://github.com/argoproj/argo-cd/releases 选择合适的版本下载 argocd-linux-amd64 文件
# cp argocd-linux-amd64 /usr/local/bin/argocd
# chmod +x /usr/local/bin/argocd
# argocd version
修改密码:
方法一:登录argocd UI 会强制修改密码。
方法二: 使用CLI工具修改默认密码
参考: https://www.cnblogs.com/hahaha111122222/p/17462812.html
2、部署“ArgoCD Image Updater小工具”(部署略显繁琐)
官方文档: https://argocd-image-updater.readthedocs.io/en/stable/
2.1、在argocd中创建本地用户并为用户创建访问令牌
# kubectl -n argocd edit cm argocd-cm
data:
accounts.image-updater: apiKey
打开后没有data字段,在最后顶格补入以上字段。注意:apiKey中的K为大写!!!
修改保存后,再查看格式大概如下,验证多了data字段
2.1.1 为用户创建访问令牌,保存备用(下面配置API访问令牌秘钥会用到此处生成的令牌)
用argocd命令登录认证argocd(地址为argocd-server SVC暴露的端口),需要交互输入y,忽略tls证书。
# argocd login 10.244.10.55:15471 --username admin --password argocd123
WARNING: server certificate had error: tls: failed to verify certificate: x509: cannot validate certificate for 10.244.10.55 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
'admin:login' logged in successfully
Context '10.244.10.55:15471' updated
执行下面命令的前提是上面已经用argocd命令登录了argocd
# argocd account generate-token --account image-updater --id image-updater
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJpbWFnZS11cGRhdGVyOmFwaUtleSIsIm5iZiI6MTcyODUyNDUyMCwiaWF0IjoxNzI4NTI0NTIwLCJqdGkiOiJpbWFnZS11cGRhdGVyIn0.QecneA-yvcbU7Eoyi8egWwiAxN4zrf9FCWJXPeu0ick
2.2、在Argo CD中授予RBAC权限
# kubectl -n argocd edit cm argocd-rbac-cm
data:
policy.default: role:readonly
policy.csv: |
p, role:image-updater, applications, get, */*, allow
p, role:image-updater, applications, update, */*, allow
g, image-updater, role:image-updater
打开后没有data字段,在最后顶格补入以上字段。
修改保存后,再查看验证多了data字段。
2.3、安装Argo CD Image Update
建议在运行 Argo CD 的同一个 Kubernetes 命名空间集群中运行 Argo CD Image Updater,但这不是必需的。事实上,甚至不需要在 Kubernetes 集群中运行 Argo CD Image Updater 或根本不需要访问任何 Kubernetes 集群。但如果不访问 Kubernetes,某些功能可能无法使用,所以强烈建议使用第一种安装方法。
运行镜像更新程序的最直接方法是将其作为 Kubernetes 工作负载安装到运行 Argo CD 的命名空间中。这样就不需要任何配置,也不会对你的工作负载产生任何影响。
# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml
或者地址:https://github.com/argoproj-labs/argocd-image-updater/tree/master/manifests
2.4、配置镜像仓库(此例为harbor,之前ecr有过实践)
即使您不打算使用私有镜像仓库,您也需要至少配置一个empty registries.conf:
# kubectl -n argocd edit cm argocd-image-updater-config
data:
registries.conf: ""
没有此条目argocd-image-updater pod将无法启动。
如果使用私有镜像仓库可参考以下配置,以harbor镜像仓库为例:
data:
argocd.insecure: "true"
log.level: debug
registries.conf: |
registries:
- name: harbor
api_url: [http://reg1.ka.zkj.com](http://reg1.ka.zkj.com)
prefix: reg1.ka.zkj.com
ping: yes
insecure: yes
打开后没有data字段,在最后顶格补入以上字段。
修改保存后,再查看验证多了data字段。如果url是域名要保证k8s中能够解析到ip。
2.5、配置API访问令牌秘钥
根据上面生成的令牌设置变量
#YOUR_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJpbWFnZS11cGRhdGVyOmFwaUtleSIsIm5iZiI6MTcyODUyNDUyMCwiaWF0IjoxNzI4NTI0NTIwLCJqdGkiOiJpbWFnZS11cGRhdGVyIn0.QecneA-yvcbU7Eoyi8egWwiAxN4zrf9FCWJXPeu0ick
创建并应用于现有资源,特别注意:命令中的命名空间要修改为服务实际部署的NS
# kubectl create secret generic argocd-image-updater-secret \
> --from-literal argocd.token=$YOUR_TOKEN --dry-run -o yaml |
> kubectl -n argocd apply -f -
W1010 09:48:58.532655 3478 helpers.go:703] --dry-run is deprecated and can be replaced with --dry-run=client.
secret/argocd-image-updater-secret configured
更改后必须重启服务
# kubectl -n argocd rollout restart deployment argocd-image-updater
deployment.apps/argocd-image-updater restarted
3、在gitlab仓库中建立编排文件
说明:gitlab仓里有4个文件。
回写文件:
.argocd-source-dev-smart-doc.yaml 是argocd 回写后的文件,这个是argocd image updater 应用建立后才会生成的!
编排文件:
dp-smart-doc.yaml
svc-smart-doc.yaml
Kustomize工具文件:
kustomization.yaml
---------文件内容如下 -------------------
kustomization.yaml
namePrefix: kustomize-
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- dp-smart-doc.yaml
- svc-smart-doc.yaml
dp-smart-doc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: smart-doc
namespace: wa
labels:
group: service
spec:
replicas: 1
selector:
matchLabels:
app: smart-doc
tier: backend
template:
metadata:
annotations: {}
labels:
app: smart-doc
tier: backend
spec:
nodeSelector:
smart: "true"
dnsPolicy: ClusterFirst
containers:
- image: reg1.ka.zkj.com/dev/smart-doc:v1.241008-68-002
imagePullPolicy: IfNotPresent
name: smart-wealth
ports:
- containerPort: 9800
#command: ["sleep","10000"]
env:
- name: TZ
value: Asia/Shanghai
resources:
limits:
cpu: 1000m
memory: 4Gi
requests:
cpu: 1000m
memory: 4Gi
volumeMounts:
- mountPath: /logs/smart-doc
name: smart-doc
terminationGracePeriodSeconds: 60
volumes:
- hostPath:
path: "/home/zkj/wealth/logs/smart-doc"
type: DirectoryOrCreate
name: "smart-doc"
svc-smart-doc.yaml
apiVersion: v1
kind: Service
metadata:
name: smart-doc
namespace: wa
spec:
type: NodePort
ports:
- port: 9800
targetPort: 9800
nodePort: 48528
selector:
app: smart-doc
tier: backend
4、登录argocd UI,建立argocd应用。
4.1 首先setting一个gitlab仓库地址,填入箭头所指的内容。
因为gitlab地址是http的,千万别忘了勾选忽略https验证。
4.2 创建一个app,Applications -- +NEW APP -- EDIT AS YAML --清空后贴如如下内容(此文件支持注释):
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
annotations:
argocd-image-updater.argoproj.io/image-list: myalias=reg1.ka.zkj.com/dev/smart-doc # harbor镜像仓库地址
argocd-image-updater.argoproj.io/myalias.allow-tags: regexp:^.*$ # tag的正则表达
argocd-image-updater.argoproj.io/myalias.update-strategy: latest # 镜像更新策略,详见下节应用文件配置项注释
argocd-image-updater.argoproj.io/write-back-method: git # 回写的对象
argocd-image-updater.argoproj.io/git-branch: master # 仓库分支
argocd-image-updater.argoproj.io/myalias.force-update: "true" # 是否强制更新
name: dev-smart-doc # Argo CD 应用程序的名称
namespace: argocd # argocd部署的命名空间,注意不是程序的!
#finalizers:
#- resources-finalizer.Argo CD.argoproj.io
spec:
destination: # Kubernetes 集群中的目标
namespace: wa # 被部署app的命名空间
server: https://kubernetes.default.svc
project: default # 应用程序将被配置的项目名称,这是在 Argo CD 中应用程序的一种组织方式
source:
path: dev/smart-doc # Kubernetes 资源清单在仓库中的路径。
repoURL: http://10.244.8.185:30080/CD/wealth-helper.git # gitlab源代码的仓库地址。
targetRevision: master # 想要使用的 git 分支。
syncPolicy: # 指定自动同步策略和频率,不配置时需要手动触发同步。
automated:
prune: true # 默认情况下,当 Argo CD 检测到 Git 中不再定义资源时,自动同步将不会删除该资源。如果要允许打开自动修剪删除设置为: true。
selfHeal: true # 自动自愈
allowEmpty: false # 默认情况下,当没有目标资源时,可以防止应用程序出现空资源。 如果要允许应用程序出现空资源设置为:true。
syncOptions:
- Validate=false
- CreateNamespace=true
retry:
limit: 5
backoff:
duration: 5s # 持续时间
factor: 2
maxDuration: 3m # 最大持续时间
CI执行后会将新构建的应用镜像推送到镜像仓库中去。
然后 Argo CD Image Updater 将会每 2m0s(日志时间戳可以确定[argocd扫描git库的频率是3m不要混了])从镜像仓库去检索镜像版本变化(暂时没有查到在哪能修改这个时间),一旦发现有新的镜像版本,它将自动使用新版本来更新集群内工作负载的镜像,并将镜像版本回写到 Git 仓库。我们可以去查看 Argo CD Image Updater 的日志变化:
# kubectl logs -f argocd-image-updater-78f46ff74-dtb9l -n argocd
。。。。。。
4.3、以上4.2应用文件配置项注释
[!NOTE] 中文官方文档参考
https://argocd.devops.gold/user-guide/auto_sync/
ArgoCD Image Updater 通过 Application Annotations 标签来实现对应的功能,这里注释一下每一个标签的作用。
- argocd-image-updater.argoproj.io/image-list: 指定需要监听的镜像,这里的别名非常重要,会影响下面所有的设置。myalias可以用任何字符代替,镜像地址这里不写tag。
- argocd-image-updater.argoproj.io/update-strategy: 指定镜像更新策略。注意,latest 并不代表监听 latest 镜像版本,而是以最新推送的镜像作为更新策略。此外,semver 策略可以识别最高语义化版本的标签,digest 策略可以用来区分同一 Tag 下不同镜像 digest 的变更。
[!NOTE] 更新策略。此策略确定 Argo CD Image Updater 如何识别要更新的新镜像版本。目前支持四种方法:‘semver’、’latest’、‘digest’ 和 ’name’。
在查看它们之前,了解 “可变” 和 “不可变” 镜像标记的含义很重要。可变存储库具有可以被新镜像覆盖的标记,而当存储库配置规定标记必须不可被新镜像覆盖时,标记就是不可变的。以下选项假定使用 “不可变” 标记。如果使用了可变标记,则应使用 “digest” 策略。
semver:此策略将应用程序更新到镜像注册表中的最新镜像版本,同时考虑语义版本控制约束(例如,X.Y.Z 格式,其中 X 为主版本、Y 为次版本,Z 为修补版本)。该选项可配置为仅升级到新的次要或修补版本,还支持通过附加配置支持预发布版本。在下面的示例中,应用程序将使用较新的修补版本进行更新,但不会升级到新的次要或主要版本。
latest:此策略将应用程序更新为具有最新构建日期的镜像。当特定构建具有多个标记时,Argo CD Image Updater 会选择列表中以字母顺序降序排序的最后一个 标记。如果只想考虑特定标记,可以使用带有正则表达式的注释。类似地,可以使用注释来忽略标记列表。
digest:此策略基于注册表中可变标签的更改来更新应用程序。当使用此策略时,将使用镜像摘要来更新应用程序,因此集群上的镜像将显示为/ @sha256: 。 name:此策略根据镜像标签的字母排序并使用列表中排序的最后一个标签来更新应用程序。当使用日期/时间为镜像标记时,可以使用此方法。类似于 “latest” 策略,可以使用正则表达式来考虑特定标记。
- argocd-image-updater.argoproj.io/write-back-method:表示将镜像版本回写到镜像仓库。注意,这里对仓库的写权限来源于使用 argocd repo add 命令为 ArgoCD 配置的仓库访问权限。
- argocd-image-updater.argoproj.io/<镜像别名>.pull-secret:为不同的镜像别名指定镜像拉取凭据,公开仓库不需要配置。
- argocd-image-updater.argoproj.io/<镜像别名>.allow-tags:配置符合更新条件的镜像 Tag,在这里我们使用正则表达式匹配那些镜像。
下面2个在Kustomize工具时暂时没有用到。
- argocd-image-updater.argoproj.io/<镜像别名>.helm.image-name:配置 Helm Chart values.yaml 镜像名称所在的节点,在示例应用中,backend.image 和 frontend.image 是values.yaml 配置镜像名称的节点,ArgoCD 在回写仓库时会覆盖这个值。
- argocd-image-updater.argoproj.io/<镜像别名>.helm.image-tag:配置 Helm Chart values.yaml 镜像版本所在的节点,在示例应用中,backend.tag 和 frontend.tag 是 values.yaml 配置镜像版本的节点,ArgoCD 在回写仓库时将会覆盖这个值。
=======================================================
综合参考:
https://cloudpods.csdn.net/657807ccb8e5f01e1e447b15.html KubeSphere对接ArgoCD
https://kubesphere.io/zh/blogs/kubesphere-argocd/ KubeSphere + Argo CD,实现真正的 GitOps!
https://mp.weixin.qq.com/s/cCKYaFCZ513djFfms-d1uA (阳明)使用 Argo CD 进行 GitOps 流水线改造
https://argocd.devops.gold/operator-manual/resource_actions/ Argo CD 中文文档 平台工程 Devops