ArgoCD 在阿里云 ACK 集群的部署
参考阿里云官方文档:https://help.aliyun.com/zh/cs/user-guide/argo-cd-based-gitops-best-practices
本文覆盖以下部署场景:
| 访问方式 | 适用场景 |
|---|---|
| argocd-server SVC LoadBalancer | 快速验证,直接绑定公网 CLB |
| Nginx Ingress 公网访问 | 通过 Ingress 统一管理,CLB 公网 |
| Nginx Ingress 内网访问 | 仅内网访问,CLB 私网 |
1. 准备 SSL 证书
1.1 自签名ssl证书
本文使用自定义域名和自签名证书,如是生产环境,建议购买域名和对应的证书。
自签名证书参考:https://docs.rancher.cn/docs/rancher2.5/installation/resources/advanced/self-signed-ssl/
1.2 创建 TLS Secret
ArgoCD 要求 TLS Secret 名称必须为 argocd-server-tls。
# 创建命名空间kubectl create namespace argo-cd
# 创建 TLS Secretkubectl create secret tls argocd-server-tls \ --cert=/path/to/tls.crt \ --key=/path/to/tls.key \ -n argo-cd示例:
kubectl create secret tls argocd-server-tls \ --cert=/home/user/ca/tls.crt \ --key=/home/user/ca/tls.key \ -n argo-cd验证:
kubectl get secrets -n argo-cd2. Helm 部署 ArgoCD
2.1 准备 Helm Chart
# 添加 Helm Repohelm repo add argo https://argoproj.github.io/argo-helmhelm repo update
# (可选)下载 Chart 到本地helm pull argo/argo-cd --version 7.3.5# (可选)解压 Chartmkdir chart && tar -zxvf argo-cd-7.3.5.tgz -C chart/2.2 获取 IngressClass 名称
部署 Ingress 前,确认集群中可用的 IngressClass:
kubectl get ingressclass期望输出(ACK 集群默认):
NAME CONTROLLER PARAMETERS AGEnginx k8s.io/ingress-nginx <none> 17h2.3 方式一:helm —set 命令安装
适合快速部署,所有参数内联在命令中。
(a)仅 SVC 暴露,不启用 Ingress:
helm upgrade --install argocd argo/argo-cd --version 7.3.5 \ --namespace argo-cd \ --create-namespace \ --set server.service.https.enabled=true \ --set server.service.https.tlsSecret.name=argocd-server-tls(b)启用 Ingress:
helm upgrade --install argocd argo/argo-cd --version 7.3.5 \ --namespace argo-cd \ --create-namespace \ --set server.ingress.enabled=true \ --set server.ingress.controller="generic" \ --set server.ingress.ingressClassName="nginx" \ --set server.ingress.hostname="argocd.hua-ri.cn" \ --set server.ingress.path="/" \ --set server.ingress.pathType="Prefix" \ --set server.ingress.annotations."nginx\.ingress\.kubernetes\.io/backend-protocol"="HTTPS" \ --set server.ingress.annotations."nginx\.ingress\.kubernetes\.io/ssl-redirect"="true" \ --set server.ingress.annotations."nginx\.ingress\.kubernetes\.io/force-ssl-redirect"="true" \ --set server.ingress.tls=true \ --set global.domain="argocd.hua-ri.cn"如果网络有问题,从本地 Chart 安装:
helm upgrade --install argocd ./argo-cd-7.3.5.tgz \ --namespace argo-cd \ --create-namespace \ --set server.ingress.enabled=true \ --set server.ingress.controller="generic" \ --set server.ingress.ingressClassName="nginx" \ --set server.ingress.hostname="argocd.hua-ri.cn" \ --set server.ingress.path="/" \ --set server.ingress.pathType="Prefix" \ --set server.ingress.annotations."nginx\.ingress\.kubernetes\.io/backend-protocol"="HTTPS" \ --set server.ingress.annotations."nginx\.ingress\.kubernetes\.io/ssl-redirect"="true" \ --set server.ingress.annotations."nginx\.ingress\.kubernetes\.io/force-ssl-redirect"="true" \ --set server.ingress.tls=true \ --set global.domain="argocd.hua-ri.cn"2.4 方式二:helm -f values.yaml 文件安装
适合生产环境,配置集中管理、便于版本控制。
创建 customs.yaml:
## Globally shared configurationglobal: domain: argocd.hua-ri.cn
## Serverserver: replicas: 1
ingress: enabled: true controller: generic ingressClassName: "nginx" hostname: "argocd.hua-ri.cn" path: / pathType: Prefix annotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/force-ssl-redirect: "true" tls: true执行安装:
# 在线安装helm upgrade --install argocd argo/argo-cd --version 7.3.5 \ --namespace argo-cd \ --create-namespace \ -f customs.yaml
# 本地 Chart 安装helm upgrade --install argocd ./argo-cd-7.3.5.tgz \ --namespace argo-cd \ --create-namespace \ -f customs.yaml2.5 卸载 ArgoCD
简单卸载(保留 CRD):
helm uninstall argocd --namespace argo-cd完全卸载:
helm uninstall argocd --namespace argo-cdkubectl delete namespace argo-cdkubectl delete clusterrole argocd-serverkubectl delete clusterrolebinding argocd-serverkubectl delete crd applications.argoproj.io appprojects.argoproj.io applicationsets.argoproj.io3. 配置访问入口
3.1 方式一:argocd-server SVC LoadBalancer(直接公网)
适合快速验证,直接将 argocd-server Service 类型改为 LoadBalancer,由阿里云自动绑定公网 CLB。
# 将 argocd-server Service 改为 LoadBalancerkubectl patch svc argocd-server -n argo-cd -p '{"spec": {"type": "LoadBalancer"}}'
# 查看分配的公网 IPkubectl get svc -n argo-cd argocd-server期望输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEargocd-server LoadBalancer x.x.x.x x.x.x.x 80/TCP,443/TCP 170m获取到 EXTERNAL-IP 后,配置域名解析即可访问。
3.2 方式二:通过 Nginx Ingress 访问(推荐)
通过 Nginx Ingress Controller 统一管理入口,支持公网和内网两种模式。
ACK 集群主要使用以下三个 Annotation 控制 CLB 行为:
| Annotation | 说明 |
|---|---|
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type | internet(公网)或 intranet(私网) |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners | "true" 覆盖现有 CLB 监听;"false" 不覆盖 |
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id | 指定绑定的 CLB 实例 ID |
先查看 Ingress Controller SVC 当前的 Annotation 配置:
kubectl get svc -n nginx-ingress nginx-ingress-ack-ack-ingress-nginx-v1-controller -oyaml | \ grep -E "alibaba-cloud-loadbalancer-(address-type|force-override-listeners|id)"(a)公网访问配置:
在 nginx-ingress-ack-ack-ingress-nginx-v1-controller 的 SVC 上添加/更新以下 Annotation:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internetservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: <公网CLB实例ID>在负载均衡控制台查询 CLB 实例 ID:https://slb.console.aliyun.com/overview
(b)内网访问配置:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranetservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: <内网CLB实例ID>(c)通用操作:
如果 SVC 当前类型为 NodePort,直接改为 LoadBalancer:
kubectl patch svc nginx-ingress-ack-ack-ingress-nginx-v1-controller -n nginx-ingress \ -p '{"spec": {"type": "LoadBalancer"}}'如果 SVC 已经是 LoadBalancer 类型,但需要从公网切换到内网(反之亦然),需要先切回 NodePort 再改为 LoadBalancer,否则 EXTERNAL-IP 的类型不会更新:
kubectl patch svc nginx-ingress-ack-ack-ingress-nginx-v1-controller -n nginx-ingress \ -p '{"spec": {"type": "NodePort"}}'kubectl patch svc nginx-ingress-ack-ack-ingress-nginx-v1-controller -n nginx-ingress \ -p '{"spec": {"type": "LoadBalancer"}}'查看 Ingress Controller 实际分配的 IP:
kubectl get svc -n nginx-ingress期望输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx-ingress-ack-ingress-nginx-controller-admission ClusterIP 172.27.120.238 <none> 443/TCP 15dnginx-ingress-ack-ingress-nginx-controller-internal LoadBalancer 172.27.115.18 x.x.x.x 80:31840/TCP,443:30799/TCP 15d将域名解析到 EXTERNAL-IP(本地测试可写入 /etc/hosts,生产环境配置 DNS 解析):
x.x.x.x argocd.hua-ri.cn4. 安装 ArgoCD CLI
# macOSbrew install argocd更多平台安装方式参见:cli_installation
5. 访问 ArgoCD
5.1 获取初始管理员密码
kubectl get secret -n argo-cd argocd-initial-admin-secret \ -o jsonpath="{.data.password}" | base64 -d5.2 浏览器访问
打开浏览器访问 https://argocd.hua-ri.cn,使用用户名 admin 和上一步获取的密码登录。
注意:使用自签名证书时,浏览器会提示”不安全”,点击继续访问即可。使用正式购买的证书则不会有此提示。
5.3 CLI 登录
# 通过域名登录argocd login argocd.hua-ri.cn
# 或通过 LoadBalancer IP 登录(方式一)argocd login <EXTERNAL-IP>Username: adminPassword: <初始密码>'admin:login' logged in successfully部分信息可能已经过时









