跳到主要内容

ArgoCD 在 Kubernetes 平台部署指南

概述

ArgoCD 是一个基于 GitOps 的持续交付工具,用于 Kubernetes 集群的应用程序自动化部署和生命周期管理。本文档将详细介绍如何在 Kubernetes 平台中通过 Helm 部署 ArgoCD。

目录

  1. 环境准备
  2. Helm 部署 ArgoCD
  3. 网络配置
  4. 部署验证与访问
  5. 可选:使用 MinIO 作为存储后端

1. 环境准备

1.1 Kubernetes 平台要求

  • Kubernetes 版本: 1.20+
  • 节点配置: 至少 2 个节点,每个节点最少 2 核 4GB 内存
  • 存储类: 需要配置默认存储类(如 NFS、Local Path 等)

1.2 必需组件启用

确保以下组件已启用:

  • Ingress Controller(如 Nginx Ingress)
  • 默认 StorageClass

2. Helm 部署 ArgoCD

2.1 添加 ArgoCD Helm 仓库

# 添加 ArgoCD Helm 仓库
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

2.2 配置 ArgoCD 参数

创建 argocd-values.yaml 配置文件:

# 全局配置
global:
image:
repository: quay.io/argoproj/argocd
tag: v2.7.0
imagePullPolicy: IfNotPresent

# ArgoCD 服务器配置
server:
replicas: 1
autoscaling:
enabled: false
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi

# 服务配置
service:
type: ClusterIP
port: 80
annotations: {}

# Ingress 配置
ingress:
enabled: false
annotations: {}
labels: {}
hosts:
- argocd.example.com
paths:
- /
pathType: Prefix
extraPaths: []
tls: []
https: false

# ArgoCD 仓库服务配置
repoServer:
replicas: 1
autoscaling:
enabled: false
resources:
limits:
cpu: 1000m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi

# ArgoCD 应用控制器配置
applicationSet:
replicas: 1
resources:
limits:
cpu: 1000m
memory: 512Mi
requests:
cpu: 250m
memory: 128Mi

# ArgoCD 通知服务配置
notifications:
replicas: 1
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 50m
memory: 64Mi

# Redis 配置
redis:
resources:
limits:
cpu: 200m
memory: 128Mi
requests:
cpu: 100m
memory: 64Mi

# Redis HA 配置
redis-ha:
enabled: false

# ArgoCD 配置管理
configs:
cm:
create: true
# 禁用管理员登录
admin.enabled: "true"
# URL 配置
url: https://argocd.example.com
# Dex 配置
dex.config: |
connectors:
- type: github
id: github
name: GitHub
config:
clientID: your-client-id
clientSecret: your-client-secret
orgs:
- name: your-github-org

# ArgoCD RBAC 配置
rbac:
create: true
policy.default: role:readonly
policy.csv: |
g, your-github-org:admin, role:admin
g, your-github-org:dev, role:readonly

# ArgoCD 密钥配置
secret:
create: true
# 初始管理员密码 (默认密码为 "admin123" 的 bcrypt 哈希)
# 可以使用以下命令生成新密码哈希:
# argocd account bcrypt --password your-password
argocdServerAdminPassword: "$2a$10$Q7p9ZbWq8uPb1D3nK4m5OuPvQqSsTtUuVvWwXxYyZz01234567890"

# ArgoCD SSH 知名主机配置
ssh:
knownHosts: |
bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzE54DG7OUBD7XBlhyA7dzZ/SHjTwv7Z023KZG2lGQU5qQcGw5k8UqSsvbjWL/CuJ3EfM+Im8h8U4Tz6E8moKBJDQ7JPO4DD/t6soUQ28y8F8U4qIK5U0O5oQdTv8wzPfHxHx2Q1x4DkK6u4V3+J0m1sAA7jZD
github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
gitlab.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY=

# 持久化存储配置
redisHa:
persistentVolume:
enabled: true
size: 1Gi

# 网络策略配置
networkPolicy:
create: false

# Pod 安全策略配置
podSecurityPolicy:
enabled: false

# 服务账户配置
serviceAccount:
create: true
name: argocd-server

2.3 安装 ArgoCD

# 创建命名空间
kubectl create namespace argocd

# 安装 ArgoCD
helm install argocd argo/argo-cd \
--namespace argocd \
--values argocd-values.yaml \
--version 5.30.0

3. 网络配置

3.1 创建 Ingress

创建 argocd-ingress.yaml 文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-ingress
namespace: argocd
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- argocd.example.com
secretName: argocd-tls
rules:
- host: argocd.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 443

应用 Ingress 配置:

kubectl apply -f argocd-ingress.yaml

4. 部署验证与访问

4.1 检查服务状态

# 检查 ArgoCD Pod 状态
kubectl get pods -n argocd

# 检查 ArgoCD 服务状态
kubectl get svc -n argocd

# 检查 Ingress 状态
kubectl get ingress -n argocd

4.2 访问 ArgoCD Web 界面

  1. 在本地 /etc/hosts 文件中添加域名解析:

    <节点IP> argocd.example.com
  2. 在浏览器中访问:https://argocd.example.com

4.3 功能验证

获取初始管理员密码

# 获取 ArgoCD 初始管理员密码
kubectl get secret -n argocd argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

登录验证

使用默认用户名 admin 和获取到的密码登录 ArgoCD。

创建测试应用

  1. 在 GitHub 上创建一个包含 Kubernetes YAML 文件的仓库
  2. 在 ArgoCD 中创建应用并连接到该仓库
  3. 同步应用并验证部署状态

5. 可选:使用 MinIO 作为存储后端

5.1 MinIO 存储优势

将 ArgoCD 的存储后端配置为使用 MinIO 提供了以下优势:

  1. 高可用性: MinIO 集群提供企业级的高可用性和数据冗余
  2. 扩展性: 可以轻松水平扩展存储容量和性能
  3. 成本效益: 使用标准硬件构建分布式存储,比传统 SAN 存储更经济
  4. S3 兼容性: ArgoCD 可以通过 S3 插件与 MinIO 无缝集成
  5. 统一存储: 可以为多个应用提供对象存储服务

5.2 配置 ArgoCD 使用 MinIO

ArgoCD 本身不直接将应用程序数据存储在对象存储中,但可以配置 MinIO 用于以下用途:

5.2.1 准备 MinIO 环境

确保您已经部署了 MinIO 集群,参考 MinIO 集群高可用部署方案

在 MinIO 中创建 ArgoCD 专用的存储桶:

# 使用 mc 客户端创建存储桶
mc mb minio/argocd-backups

# 创建 ArgoCD 应用程序存储桶
mc mb minio/argocd-apps

# 设置存储桶策略(可选,根据安全要求调整)
mc anonymous set download minio/argocd-backups

5.2.2 创建 MinIO 访问凭证

在 MinIO 中创建专门用于 ArgoCD 的访问密钥:

# 创建访问密钥(在 Minio 控制台或通过 mc 命令)
mc admin user add minio argocd-user argocd-password123

# 分配存储桶访问策略
mc admin policy attach minio readwrite --user argocd-user

5.2.3 配置 ArgoCD 使用 MinIO 存储

修改 argocd-values.yaml 配置文件,添加 MinIO 相关配置:

# 全局配置
global:
# ... 原有配置 ...

# ArgoCD 服务器配置
server:
# ... 原有配置 ...

# 添加 MinIO 存储配置
minio:
# 启用 MinIO 集成
enabled: true

# MinIO 连接配置
endpoint: http://192.168.192.115:9000
accessKey: argocd-user
secretKey: argocd-password123

# 存储桶配置
buckets:
backups: argocd-backups
apps: argocd-apps

# SSL 配置
secure: false # 如果使用 HTTPS,设置为 true

# 备份配置
backups:
enabled: true
schedule: "0 2 * * *" # 每天凌晨 2 点执行备份
retention: 7 # 保留 7 天的备份

# MinIO 备份配置
storage:
type: s3
s3:
bucket: argocd-backups
endpoint: http://192.168.192.115:9000
accessKey:
valueFrom:
secretKeyRef:
name: argocd-minio-secret
key: accesskey
secretKey:
valueFrom:
secretKeyRef:
name: argocd-minio-secret
key: secretkey

5.2.4 创建 MinIO 凭证 Secret

创建 Kubernetes Secret 来存储 MinIO 凭证:

# 创建 MinIO 凭证 Secret
kubectl create secret generic argocd-minio-secret \
--namespace argocd \
--from-literal=accesskey=argocd-user \
--from-literal=secretkey=argocd-password123

5.2.5 配置应用程序备份任务

创建一个定时任务将 ArgoCD 应用程序配置备份到 MinIO:

  1. 创建备份脚本 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-backup-script
namespace: argocd
data:
backup.sh: |
#!/bin/bash
set -e

# 创建备份目录
BACKUP_DIR="/tmp/argocd-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p $BACKUP_DIR

# 备份 ArgoCD 应用程序
argocd login argocd.example.com --username admin --password $ARGOCD_PASSWORD --insecure
argocd app list -o yaml > $BACKUP_DIR/applications.yaml

# 压缩备份文件
tar -czf $BACKUP_DIR.tar.gz -C /tmp argocd-backup-$(date +%Y%m%d-%H%M%S)

# 上传到 MinIO
mc cp $BACKUP_DIR.tar.gz minio/argocd-backups/

# 清理临时文件
rm -rf $BACKUP_DIR $BACKUP_DIR.tar.gz
  1. 创建 CronJob 执行备份任务:
apiVersion: batch/v1
kind: CronJob
metadata:
name: argocd-backup
namespace: argocd
spec:
schedule: "0 2 * * *" # 每天凌晨 2 点执行
jobTemplate:
spec:
template:
spec:
containers:
- name: argocd-backup
image: bitnami/kubectl:latest
command:
- /bin/bash
- /scripts/backup.sh
env:
- name: ARGOCD_PASSWORD
valueFrom:
secretKeyRef:
name: argocd-initial-admin-secret
key: password
volumeMounts:
- name: backup-script
mountPath: /scripts
- name: argocd-config
mountPath: /home/argocd/.argocd
volumes:
- name: backup-script
configMap:
name: argocd-backup-script
- name: argocd-config
emptyDir: {}
restartPolicy: OnFailure

5.2.6 验证配置

部署完成后,可以通过以下方式验证 MinIO 存储是否正常工作:

  1. 手动触发备份任务,检查 MinIO 存储桶中是否出现对应的备份文件
  2. 查看 ArgoCD 日志确认没有存储相关的错误
# 查看 ArgoCD 服务器日志
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-server

# 在 MinIO 中检查存储桶内容
mc ls minio/argocd-backups

# 手动触发备份任务
kubectl create job --from=cronjob/argocd-backup argocd-backup-manual -n argocd