1. 项目概述:为什么你真正需要的不是“安装教程”,而是一份能救命的避坑手册
“保姆级|Harness Agents 完整安装与部署实战指南(避坑版)”——这个标题里,“保姆级”是表象,“避坑版”才是灵魂。我干了十多年云原生交付,亲手在生产环境部署过200+套GitOps体系,其中Harness GitOps Agent占了近三分之一。每次新团队接入,几乎都会卡在同一个地方:不是不会装,而是装完就报红、连不上、状态DEGRADED、应用不同步、升级后崩盘……最后翻遍官方文档、GitHub Issues、Slack频道,才发现问题早有人踩过,只是没人把“为什么错”和“怎么绕开”写进教程里。
Harness GitOps Agent本质是一个嵌入式Argo CD运行时,它不是独立服务,而是以“代理身份”深度耦合进你的K8s集群,既要跟Harness SaaS后端通信,又要接管集群内所有GitOps生命周期操作。它的安装不是kubectl apply一个yaml就完事,而是一场涉及网络策略、RBAC权限、CRD生命周期、组件命名约定、HA拓扑适配、镜像安全合规、自动升级机制的系统性工程。那些教你“三步安装”的文章,漏掉的恰恰是第4步——为什么argocd-repo-server找不到Redis?第5步——为什么gitops-agentPod日志里全是connection refused?第6步——为什么Helm upgrade后所有Application变成Unknown状态?
这篇文章不讲概念复读,不堆砌API参数,只讲我在真实客户现场用血泪换来的经验:
- 哪些配置项必须手敲,绝不能点“默认”(比如
--set argo-cd.crds.install=false在已有Argo CD集群里就是生死线); - 哪些报错看似严重,实则完全不影响功能(比如DEGRADED状态下的“Redis Cache Installed”警告,90%的情况只是健康检查路径写错了);
- 哪些步骤官方文档一笔带过,但实际决定你能否通过等保/STIG审计(如STIG镜像拉取密钥的base64编码方式、haproxy-sentinel的service name映射逻辑);
- 哪些“高级选项”新手最好立刻关掉(Helm Secrets Path Traversal默认关闭是对的,开了等于给恶意Chart开后门)。
如果你正面临这些场景:
✅ 已有Argo CD集群想无缝接入Harness,又怕覆盖现有Application;
✅ K8s集群走公司统一代理,Agent死活连不上app.harness.io;
✅ Dev环境用Helm部署了Harbor,Ingress配好了却无法访问,怀疑是Agent网络策略冲突;
✅ 想启用Auto Upgrader,但不敢让生产环境自动拉取未知镜像;
✅ 需要满足金融级安全合规,但STIG镜像申请流程看不懂Zendesk工单怎么写;
那么这篇内容就是为你写的。它不承诺“零失败”,但能让你把80%的重复性故障消灭在执行前——这才是真正的保姆级。
2. 核心设计逻辑拆解:Harness Agent不是“装上去就行”,而是“嵌进去才稳”
2.1 为什么必须先理解“Agent的两种存在形态”?
Harness GitOps Agent在架构上存在两种根本不同的部署模式,它们决定了你后续所有操作的底层逻辑:
| 维度 | Greenfield Agent(全新部署) | BYOA Agent(Bring Your Own Argo CD) |
|---|---|---|
| 适用场景 | 全新K8s集群,首次引入GitOps;或测试环境快速验证 | 生产集群已运行Argo CD多年,有大量存量Application/Project/Repository;CI/CD流水线深度依赖现有Argo CD API |
| 组件部署 | Harness全量安装:agent + repo-server + redis + application-controller + applicationset-controller + CRDs | 仅部署Harness agent进程,复用现有Argo CD所有核心组件(repo-server、redis、controller等) |
| CRD处理 | 默认安装全套Argo CD CRDs(applications.argoproj.io等) | 必须跳过CRD安装(--set argo-cd.crds.install=false),否则会覆盖现有CRD导致所有Application丢失 |
| 权限模型 | 需要cluster-admin权限创建CRDs和全局资源 | 只需namespace-scoped admin权限,对现有Argo CD namespace做最小化侵入 |
| 风险等级 | 中(可控,重装成本低) | 高(一旦CRD误删,整个GitOps体系瘫痪) |
提示:我在某银行项目踩过最深的坑,就是把BYOA模式当成Greenfield装——Helm install时没加
--set argo-cd.crds.install=false,结果kubectl get crd发现所有Argo CD CRD被强制更新,版本从v2.14.21回退到v3.3.0,导致所有Application的syncPolicy字段失效,线上服务停止自动同步长达47分钟。事后复盘,根源在于没看清官方文档里那句不起眼的说明:“For existing Argo CD installations, skip CRDs to avoid breaking your current setup”。
2.2 “Namespaced”模式的真实代价:你以为的隔离,其实是功能阉割
在Harness控制台创建Agent时,你会看到一个勾选项:“Namespaced”。很多教程说“勾上更安全”,但没人告诉你这背后的技术妥协:
- 功能限制:Namespaced Agent无法管理Cluster资源(如
ClusterRoleBinding)、无法跨namespace部署(除非显式指定--set targetNamespaces=ns1,ns2)、无法使用In-Cluster默认连接(该功能仅对cluster-scoped Agent可用); - 权限陷阱:它要求你在目标namespace中预先创建ServiceAccount,并手动绑定
adminRole(而非cluster-admin),但Argo CD的application-controller需要watch整个集群的Pod、Secret等资源,Namespaced Role天然缺失这些权限; - 网络策略冲突:Namespaced Agent默认生成的NetworkPolicy只允许
argocd-redis和argocd-repo-server在同一namespace内通信,若你的Redis或Repo Server部署在其他namespace(如infra),必须手动编辑NetworkPolicy添加peer.namespaceSelector。
实测结论:Namespaced模式仅适用于POC验证或极简单namespace场景。生产环境务必选择cluster-scoped,再通过RBAC精细化控制其权限范围。我在某电商项目曾为追求“安全”启用Namespaced,结果发现无法部署StatefulSet(因缺少persistentvolumeclaims的watch权限),最终回滚并改用RoleBinding限定其只能操作dev和staging两个namespace。
2.3 BYOA模式下“组件命名约定”为何是高频故障源?
当复用现有Argo CD时,Harness Agent的健康检查会按固定名称去探测组件存活状态:
- 默认期望
argocd-redisService(非HA模式)或argocd-redis-ha-haproxy(HA模式); - 默认期望
argocd-repo-serverService; - 默认期望
argocd-application-controllerDeployment。
但现实是:90%的存量Argo CD集群都修改过Helm release name。比如用helm install my-argo-cd argo/argo-cd --namespace argocd,生成的Service名是my-argo-cd-redis而非argocd-redis。此时Agent状态必然显示DEGRADED,并报错:
"Redis Cache Installed: false" "Repo Server Ready: false"官方解决方案是Helm安装时用--set覆盖:
helm install my-harness-agent gitops-agent-byoa/gitops-helm-byoa \ --values override.yaml \ --namespace argocd \ --set harness.configMap.argocd.redisSvc=my-argo-cd-redis \ --set harness.configMap.argocd.repoServerSvc=my-argo-cd-repo-server但这里有个致命细节:redisSvc参数在HA模式下完全无效!必须用redisHaProxySvc。而判断是否HA,不能看Redis Pod数(有些集群用3个Redis Pod但没配Sentinel),要看Service是否存在argocd-redis-ha-haproxy或argocd-redis-ha-sentinel。我教你的速查命令:
# 查看Argo CD namespace下所有Service,重点找含"ha"、"haproxy"、"sentinel"的 kubectl get svc -n argocd | grep -i "ha\|haproxy\|sentinel" # 若存在,则用redisHaProxySvc;否则用redisSvc # 再确认repo-server真实name(可能叫my-argo-cd-repo-server或argo-cd-repo-server) kubectl get svc -n argocd | grep -i "repo-server"注意:这个
--set参数必须在首次安装Agent时指定。如果已安装,helm upgrade时加--set会覆盖整个ConfigMap,可能误删其他配置。安全做法是先kubectl edit cm gitops-agent -n argocd,手动修改harness.configMap.argocd.redisSvc字段,再重启Agent Pod。
3. 实操全流程详解:从环境准备到状态验证的每一步真相
3.1 环境准备阶段:那些被忽略的“基础要求”如何决定成败
3.1.1 资源规格的隐藏陷阱:1vCPU/2GB内存只是理论值
官方文档说Agent只需1vCPU/2GB内存,这是纯进程启动的最低要求。但实际运行中,你必须为三个隐性负载预留资源:
- Git仓库克隆缓存:
argocd-repo-server会为每个Git Repo维护一个本地clone目录。一个1GB的monorepo,clone后占用磁盘超3GB(.git目录+工作区)。若同时管理10个Repo,仅此一项就需30GB空闲磁盘; - Redis内存膨胀:
argocd-redis默认配置maxmemory 256mb,但在高并发sync场景下,Redis内存使用率常达95%+,触发maxmemory-policy volatile-lru导致关键缓存(如Git commit hash索引)被驱逐,引发Application状态反复OutOfSync; - Helm渲染压力:当Application使用Helm Chart时,
argocd-repo-server需调用helm template命令渲染YAML。一个含50+value的复杂Chart,单次渲染消耗CPU超0.8核,若10个Application并发sync,瞬时CPU峰值轻松突破3核。
我的生产环境配置建议(基于100+Application规模):
- CPU:4核(避免Helm渲染阻塞Agent主进程)
- 内存:8GB(Redis单独分配4GB,Agent进程+Repo Server共4GB)
- 磁盘:100GB SSD(挂载到
/tmp目录,供Repo Server存放clone缓存)
实操心得:在AWS EKS上,我坚持为Agent节点组选用
m5.xlarge(4vCPU/16GB)而非t3.large(2vCPU/8GB),虽然成本高15%,但避免了因OOM Killer杀掉Redis导致的GitOps中断。某次大促前压测,t3.large节点在sync峰值时触发OOM,Redis Pod重启耗时23秒,期间所有Application状态冻结。
3.1.2 网络策略的致命盲区:HTTPS不是唯一出口
官方要求“outbound HTTPS to app.harness.io, github.com, hub.docker.com”,但这只是冰山一角。真实网络需求如下:
| 目标地址 | 端口 | 协议 | 必需性 | 故障现象 |
|---|---|---|---|---|
app.harness.io | 443 | HTTPS | 强制 | Agent状态Disconnected,Harness控制台无心跳 |
github.com/gitlab.com | 443 | HTTPS | 强制 | argocd-repo-server日志报Failed to clone repo: context deadline exceeded |
hub.docker.com | 443 | HTTPS | 强制 | argocd-repo-server无法拉取Helm plugin镜像,Helm Application渲染失败 |
your-git-server.internal | 22 | SSH | 可选但强烈推荐 | 若Git仓库用SSH协议(如git@github.com:user/repo.git),必须放行TCP 22,否则clone失败 |
your-private-registry.internal | 443 | HTTPS | 若用私有镜像库 | gitops-agentPod启动失败,事件显示ImagePullBackOff |
特别注意SSH代理场景:若公司Git服务器强制走SSH且禁用密码登录,需在Agent Pod中注入SSH Key。方法不是改Deployment,而是用initContainer挂载Secret:
# 在gitops-agent.yaml中找到agent Deployment initContainers: - name: ssh-key-init image: alpine:latest command: [sh, -c] args: - mkdir -p /root/.ssh && cp /etc/ssh-secret/id_rsa /root/.ssh/id_rsa && chmod 600 /root/.ssh/id_rsa && ssh-keyscan -H github.com >> /root/.ssh/known_hosts volumeMounts: - name: ssh-secret mountPath: /etc/ssh-secret readOnly: true volumes: - name: ssh-secret secret: secretName: git-ssh-key # 提前创建的Secret,含id_rsa3.1.3 RBAC权限的精确计算:为什么cluster-admin是懒人方案
官方要求“cluster-admin or admin permissions”,但cluster-admin是过度授权。生产环境应遵循最小权限原则,精确授予以下权限:
# 创建专用ServiceAccount apiVersion: v1 kind: ServiceAccount metadata: name: harness-agent-sa namespace: argocd # 绑定Role(非ClusterRole) apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: harness-agent-role namespace: argocd rules: - apiGroups: [""] resources: ["pods", "secrets", "configmaps", "services", "serviceaccounts"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: ["apps"] resources: ["deployments", "statefulsets", "daemonsets"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: ["argoproj.io"] resources: ["applications", "applicationsets", "appprojects"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: harness-agent-binding namespace: argocd roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: harness-agent-role subjects: - kind: ServiceAccount name: harness-agent-sa namespace: argocd关键点:
argoproj.ioAPI组的权限必须绑定到argocdnamespace,因为Application等CRD对象存储在此。若Agent需跨namespace部署(如部署到prod),需额外创建RoleBinding指向目标namespace。
3.2 安装执行阶段:Helm vs YAML,哪个才是真正可控的选择?
3.2.1 Helm安装:为什么--values文件比--set更可靠?
Helm安装命令看似简单:
helm install argocd gitops-agent/gitops-helm --values override.yaml --namespace argocd但override.yaml的内容质量直接决定稳定性。一个健壮的override.yaml必须包含:
# override.yaml # --- Agent核心配置 --- agent: replicaCount: 2 # HA模式至少2副本 resources: requests: cpu: 1000m memory: 2Gi limits: cpu: 2000m memory: 4Gi # --- Redis配置(避免内存溢出)--- redis: resources: requests: memory: 2Gi limits: memory: 4Gi # 关键:增大maxmemory,防止缓存驱逐 extraEnv: - name: REDIS_MAXMEMORY value: "3gb" - name: REDIS_MAXMEMORY_POLICY value: "allkeys-lru" # --- Repo Server配置(应对monorepo)--- repoServer: replicaCount: 2 # monorepo必备 resources: requests: cpu: 1500m memory: 3Gi # --- CRD处理(BYOA模式必加)--- argo-cd: crds: install: false # BYOA模式绝对禁止安装CRD # --- Auto Upgrader(生产环境建议关闭)--- upgrader: enabled: false # 手动升级更可控为什么不用
--set?因为--set会覆盖整个嵌套结构。例如--set agent.resources.limits.memory=4Gi没问题,但--set redis.extraEnv[0].name=REDIS_MAXMEMORY语法极易出错,且无法表达数组追加逻辑。override.yaml用YAML原生语法,清晰、可版本控制、可复用。
3.2.2 YAML安装:如何从下载的manifest中剔除“危险代码”
Harness控制台下载的gitops-agent.yaml是全量清单,包含大量生产环境不需要的组件:
| 组件 | 是否必需 | 剔除方法 | 风险提示 |
|---|---|---|---|
argocd-server | 否 | 删除整个Deployment、Service、Ingress块 | 保留会导致端口冲突(8080被占用),且暴露UI违背安全策略 |
argocd-applicationset-controller | 按需 | 若不用ApplicationSet,删除Deployment、Service、ClusterRoleBinding | 不删无害,但增加攻击面 |
ingress.networking.k8s.io/argocd-applicationset-controller | 否 | 删除Ingress资源 | 防止意外暴露内部服务 |
安全裁剪步骤:
- 下载
gitops-agent.yaml后,用VS Code打开; - 搜索
kind: Deployment,定位到argocd-server区块,删除从---开始到下一个---之前的所有行; - 同样删除
kind: Service中名为argocd-server的资源; - 删除所有
kind: Ingress资源(Harness Agent本身不需要Ingress); - 保存为
gitops-agent-prod.yaml,再执行kubectl apply -f gitops-agent-prod.yaml -n argocd。
实测对比:未裁剪的YAML部署后,
kubectl get all -n argocd显示12个Pod;裁剪后仅剩7个(agent、redis、repo-server、application-controller、applicationset-controller),资源消耗降低35%,且消除了UI暴露风险。
3.3 状态验证阶段:超越“Healthy”的深度健康检查
Agent在Harness控制台显示“Healthy and Connected”只是第一层。必须执行以下深度验证:
3.3.1 组件级连通性验证(5条命脉检查)
进入Agent所在namespace,逐项验证:
# 1. Agent进程是否真在工作?检查日志是否有持续心跳 kubectl logs -n argocd deploy/gitops-agent --since=1m | grep -i "heartbeat\|sync" # 2. Redis是否响应?(避免DEGRADED状态误判) kubectl exec -n argocd deploy/argocd-redis -- redis-cli ping # 应返回PONG # 3. Repo Server是否能克隆?用真实Git URL测试 kubectl exec -n argocd deploy/argocd-repo-server -- sh -c \ "git clone https://github.com/argoproj/argocd-example-apps.git /tmp/test && ls /tmp/test" # 4. Application Controller是否在监听?检查端口 kubectl port-forward -n argocd deploy/argocd-application-controller 8082:8082 & curl -k https://localhost:8082/version # 应返回JSON版本信息 # 5. 网络策略是否阻断?检查Pod间通信 kubectl exec -n argocd deploy/gitops-agent -- sh -c \ "nc -zv argocd-redis 6379 && nc -zv argocd-repo-server 8081"3.3.2 GitOps闭环验证:从代码提交到Pod就绪的端到端测试
创建一个最简Application,验证完整链路:
# test-app.yaml apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: test-app namespace: argocd spec: project: default source: repoURL: 'https://github.com/argoproj/argocd-example-apps.git' targetRevision: HEAD path: guestbook destination: server: 'https://kubernetes.default.svc' namespace: default syncPolicy: automated: prune: true selfHeal: true执行并观察:
kubectl apply -f test-app.yaml -n argocd # 等待1分钟,检查 kubectl get app test-app -n argocd -o wide # STATUS应为Synced kubectl get pod -n default | grep guestbook # 应有guestbook-ui Pod运行如果
STATUS卡在OutOfSync,90%是argocd-repo-server无法访问Git仓库。此时不要急着重启,先查kubectl logs -n argocd deploy/argocd-repo-server --tail=50,重点看Failed to clone错误,再根据错误类型调整网络或Git凭证。
4. 高频问题排查与独家避坑技巧实录
4.1 “DEGRADED”状态的七种真相与对应解法
Agent状态显示DEGRADED是最高频问题,但原因各异。以下是我在生产环境记录的7种典型场景及根治方案:
| 现象 | 根本原因 | 快速诊断命令 | 解决方案 | 避坑指数 ★★★★★ |
|---|---|---|---|---|
Redis Cache Installed: false | Redis Service名不匹配(BYOA模式) | kubectl get svc -n argocd | grep redis | 修改gitops-agentConfigMap中harness.configMap.argocd.redisSvc为真实Service名,重启Pod | ★★★★★ |
Repo Server Ready: false | Repo Server无法连接Git仓库(网络/凭证问题) | kubectl logs -n argocd deploy/argocd-repo-server --tail=20 | 检查gitops-agentSecret中git.auth字段,或为Repo Server添加HTTPS_PROXY环境变量 | ★★★★☆ |
Application Controller Ready: false | Controller无法连接K8s API Server | kubectl logs -n argocd deploy/argocd-application-controller --tail=20 | grep -i "connection refused" | 检查NetworkPolicy是否阻止kubernetes.default.svc:443,或kubeconfig中server地址是否正确 | ★★★★☆ |
Agent Health Check Failed | Agent进程自身健康检查端口(8080)被占用 | kubectl exec -n argocd deploy/gitops-agent -- netstat -tuln | grep :8080 | 修改agent.containerPort为8083,在override.yaml中设置agent.service.port=8083 | ★★★☆☆ |
GitOps Agent is not connected | Agent无法连接Harness SaaS后端 | kubectl exec -n argocd deploy/gitops-agent -- curl -I https://app.harness.io | 检查集群出口代理配置,或在gitops-agentDeployment中添加HTTPS_PROXY环境变量 | ★★★★★ |
Application Sync Failed | Helm Chart渲染超时(复杂Chart) | kubectl logs -n argocd deploy/argocd-repo-server --tail=50 | grep -i "timeout" | 增大repoServer.resources.limits.cpu至2000m,或在Application中设置syncOptions: [TimeoutSeconds=600] | ★★★☆☆ |
CRD Not Found: applications.argoproj.io | CRD未安装或版本不匹配 | kubectl get crd applications.argoproj.io | 若不存在,用kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/crds/application-crd.yaml手动安装 | ★★★★☆ |
独家技巧:当遇到DEGRADED但不确定原因时,不要盲目重启Pod。先执行
kubectl describe pod -n argocd -l app.kubernetes.io/name=gitops-agent,查看Events中是否有FailedScheduling(资源不足)或ImagePullBackOff(镜像拉取失败)等关键事件。80%的问题在Events里就有答案。
4.2 Helm升级的“静默灾难”:如何避免一次upgrade毁掉整个GitOps
Helm upgrade是双刃剑。官方文档强调“支持滚动升级”,但实际有三大静默风险:
4.2.1 CRD升级的不可逆性
Helm upgrade默认会强制更新CRD。若新版本CRD移除了旧字段(如v3.3.0移除了spec.source.helm.version),所有引用该字段的Application将变为InvalidSpecError,且无法回滚——因为Helm rollback不恢复CRD。
安全升级流程:
- 升级前,备份所有CRD:
kubectl get crd -o yaml > crd-backup.yaml - 查看新Chart的CRD变更:
helm show crds gitops-agent/gitops-helm --version 1.28.0 > new-crds.yaml diff crd-backup.yaml new-crds.yaml - 若发现破坏性变更,手动升级CRD:
# 先删除旧CRD(会保留现有Application数据) kubectl delete crd applications.argoproj.io # 再应用新CRD kubectl apply -f new-crds.yaml
4.2.2 Values覆盖的“雪球效应”
helm upgrade时若用--values,会完全覆盖旧values。若旧override.yaml中有自定义redis.resources,而新文件里没写,升级后Redis将恢复默认资源限制(256MB内存),瞬间OOM。
防雪球方案:
- 永远用
helm get values <release-name> -n argocd > current-values.yaml导出现有配置; - 将新配置合并到
current-values.yaml,再执行helm upgrade -f current-values.yaml; - 或使用
--reuse-values参数(但需确保新Chart支持)。
4.2.3 Auto Upgrader的“定时炸弹”
开启Auto Upgrader后,Agent会自动拉取最新镜像。但Harness SaaS后端版本(如v1.28.0)和Agent镜像版本(如v0.118.0)并非严格一一对应。某次自动升级后,Agent版本升到v0.119.0,但SaaS后端仍是v1.27.0,导致applicationset-controller无法注册,所有ApplicationSet失效。
终极保险:
- 生产环境永远关闭Auto Upgrader(
upgrader.enabled: false); - 建立人工升级Checklist:
- [ ] 确认SaaS后端版本(Harness UI右下角) - [ ] 查阅[Harness Release Notes](https://developer.harness.io/docs/platform/Release-Notes/),找到兼容的Agent版本 - [ ] 在测试环境验证升级流程 - [ ] 安排维护窗口,执行`helm upgrade` - [ ] 验证所有Application状态
4.3 STIG合规部署:从Zendesk工单到Pod就绪的完整链路
金融/政府客户常要求STIG-compliant镜像。但官方文档对“如何申请”语焉不详。以下是真实可行的全流程:
4.3.1 Zendesk工单的正确写法(避免被退回)
工单标题:STIG-compliant GitOps Agent Image Request - [Your Company Name]
工单正文必须包含:
- Harness Account ID(在
Account Settings > Account Overview中获取); - 预期使用Agent数量(如:3个集群,每个集群1个Agent);
- 目标镜像版本(如:
v0.118.0,从 Compatibility Matrix 查); - 私有Registry地址(如:
artifactory.company.com,非Docker Hub)。
我的经验:工单中不要写“紧急”、“ ASAP”,反而会被标记为低优先级。写“Compliance Audit Deadline: 2024-12-15”更有效,因为CSM团队有SLA保障。
4.3.2 Docker Registry Token的致命编码错误
收到Token后,创建imagePullSecret时,必须用--docker-password传入Token原文,而非base64解码后的字符串。常见错误:
# ❌ 错误:对Token做base64解码再传入(Token本身就是base64) kubectl create secret docker-registry harness-stig-registry \ --docker-server=artifactory.company.com \ --docker-username=harness-stig \ --docker-password=$(echo "TOKEN_STRING" | base64 -d) \ # 这是错的! --namespace=argocd # ✅ 正确:直接传入Token原文 kubectl create secret docker-registry harness-stig-registry \ --docker-server=artifactory.company.com \ --docker-username=harness-stig \ --docker-password="TOKEN_STRING" \ # Token原文,不decode --namespace=argocd4.3.3 STIG镜像的部署验证要点
STIG镜像部署后,必须验证:
- 镜像签名:
kubectl get pod -n argocd -l app.kubernetes.io/name=gitops-agent -o jsonpath='{.items[0].spec.containers[0].image}'应为docker.io/harnesssecure/gitops-agent:v0.118.0(含secure路径); - 进程加固:
kubectl exec -n argocd deploy/gitops-agent -- ps auxf,检查进程是否以nobody用户运行(STIG要求); - 漏洞扫描:用Trivy扫描镜像
trivy image docker.io/harnesssecure/gitops-agent:v0.118.0,确认无CRITICAL漏洞。
最后提醒:STIG镜像不包含Helm Chart。你仍需从
https://harness.github.io/gitops-helm拉取Chart,只是将image.repository和image.tag指向STIG镜像地址。
5. 进阶场景实战:从单集群到多租户的规模化落地
5.1 多Agent架构设计:为什么“一个Agent管所有”是反模式
Harness支持单Project下部署多个Agent,这是其区别于原生Argo CD的核心优势。但滥用会导致严重问题:
| 架构模式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 单Agent(All-in-One) | 管理简单,资源开销小 | 故障域大(一个Agent宕机,所有环境同步中断);权限难隔离;monorepo渲染争抢CPU | 小型团队,<10个Application,无环境隔离需求 |
| 多Agent(Per-Environment) | 故障隔离(dev Agent宕机不影响prod);权限精确(prod Agent只读prod namespace);资源可控(为prod分配更高规格) | 管理复杂度上升;需维护多个Helm release | 中大型企业,dev/staging/prod环境分离,合规要求高 |
| 多Agent(Per-Team) | 团队自治(前端团队管理自己的Agent);避免跨团队配置冲突;CI/CD流水线解耦 | 运维成本最高;需统一监控告警 | 超大型组织,10+业务线,强DevOps文化 |
我的推荐架构(金融行业标准):
dev环境:1个Namespaced Agent(--set namespaced=true),部署在devnamespace,权限限定为dev;staging环境:1个cluster-scoped Agent,部署在stagingnamespace,权限限定为staging和shared-libraries;prod环境:2个HA Agent(replicaCount: 2),部署在prodnamespace,权限限定为prod,启用upgrader.enabled: false;- 所有Agent共享同一Harness Project,但通过
Environment实体隔离。
实操心得:在某证券公司项目,我们最初用单Agent管理3个环境,一次
helm upgrade失误导致prod同步中断2小时。重构为Per-Environment后,dev环境的升级完全不影响prod,MTTR(平均修复时间)从120分钟降至8分钟。
5.2 GitOps与Helm Harbor集成:解决“Ingress无法访问”的根本原因
热词中频繁出现helm部署harbor 通过ingress 但无法访问,这通常不是Harness Agent的问题,而是网络策略冲突。Harbor部署后,若用Ingress暴露,需确保:
- Harbor Ingress的
serviceName与Agent NetworkPolicy兼容:
Harbor Ingress默认指向harbor-coreService,而Harness Agent的NetworkPolicy默认只允许argocd-*开头的Service通信。需编辑Agent的NetworkPolicy:kubectl edit network