

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 使用 Argo CD 项目
<a name="argocd-projects"></a>

Argo CD 项目（AppProject）为应用程序提供逻辑分组和访问控制。项目定义了应用程序可以使用哪些 Git 存储库、目标集群和命名空间，从而在 Argo CD 共享实例中实现多租户和安全边界。

## 何时使用项目
<a name="_when_to_use_projects"></a>

使用项目以：
+ 按团队、环境或业务部门分离应用程序
+ 限制团队可以从中部署哪些存储库
+ 限制团队可以部署到哪些集群和命名空间
+ 强制执行资源配额和允许的资源类型
+ 提供带护栏的应用程序自助部署

## 默认项目
<a name="_default_project"></a>

每个 Argo CD 功能都包含 `default` 项目，该项目允许访问所有存储库、集群和命名空间。这对于初始测试很有用，但对于生产用途，请创建具有明确限制的专用项目。

有关默认项目配置以及如何对其进行限制的详细信息，请参阅 Argo CD 文档中的 [The Default Project](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#the-default-project)。

## 创建项目
<a name="_create_a_project"></a>

通过将 `AppProject` 资源应用到集群来创建项目。

 **示例：团队特定项目** 

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  description: Applications for Team A

  # Source repositories this project can deploy from
  sourceRepos:
    - 'https://github.com/my-org/team-a-*'
    - 'https://github.com/my-org/shared-libs'

  # Destination clusters and namespaces
  destinations:
    - name: dev-cluster
      namespace: team-a-dev
    - name: prod-cluster
      namespace: team-a-prod

  # Allowed resource types
  clusterResourceWhitelist:
    - group: ''
      kind: Namespace

  namespaceResourceWhitelist:
    - group: 'apps'
      kind: Deployment
    - group: ''
      kind: Service
    - group: ''
      kind: ConfigMap
```

应用项目：

```
kubectl apply -f team-a-project.yaml
```

## 项目配置
<a name="_project_configuration"></a>

### 源存储库
<a name="_source_repositories"></a>

控制此项目中的应用程序可以使用哪些 Git 存储库：

```
spec:
  sourceRepos:
    - 'https://github.com/my-org/app-*'  # Wildcard pattern
    - 'https://github.com/my-org/infra'  # Specific repo
```

您可以使用通配符和否定模式（`!` 前缀）来允许或拒绝特定的存储库。有关详细信息，请参阅 Argo CD 文档中的 [Managing Projects](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#managing-projects)。

### 目标限制
<a name="_destination_restrictions"></a>

限制可以部署应用程序的位置：

```
spec:
  destinations:
    - name: prod-cluster  # Specific cluster by name
      namespace: production
    - name: '*'  # Any cluster
      namespace: team-a-*  # Namespace pattern
```

**重要**  
对于生产项目，请使用特定的集群名称和命名空间模式，而不是通配符。这样可以防止意外部署到未经授权的集群或命名空间。

您可以使用通配符和否定模式来控制目标。有关详细信息，请参阅 Argo CD 文档中的 [Managing Projects](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#managing-projects)。

### 资源限制
<a name="_resource_restrictions"></a>

控制可以部署的 Kubernetes 资源类型：

 **集群范围资源**：

```
spec:
  clusterResourceWhitelist:
    - group: ''
      kind: Namespace
    - group: 'rbac.authorization.k8s.io'
      kind: Role
```

 **命名空间范围资源**：

```
spec:
  namespaceResourceWhitelist:
    - group: 'apps'
      kind: Deployment
    - group: ''
      kind: Service
    - group: ''
      kind: ConfigMap
    - group: 's3.services.k8s.aws'
      kind: Bucket
```

使用黑名单拒绝特定资源：

```
spec:
  namespaceResourceBlacklist:
    - group: ''
      kind: Secret  # Prevent direct Secret creation
```

## 将应用程序分配给项目
<a name="_assign_applications_to_projects"></a>

创建应用程序时，在 `spec.project` 字段中指定项目：

```
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: team-a  # Assign to team-a project
  source:
    repoURL: https://github.com/my-org/my-app
    path: manifests
  destination:
    name: prod-cluster
    namespace: team-a-prod
```

未指定项目的应用程序将使用 `default` 项目。

## 项目角色和 RBAC
<a name="_project_roles_and_rbac"></a>

项目可以定义自定义角色以实现精细访问控制。在功能配置中将项目角色映射到 AWS Identity Center 用户和用户组，以控制哪些人可以同步、更新或删除应用程序。

 **示例：具有开发人员和管理员角色的项目** 

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-a
  namespace: argocd
spec:
  sourceRepos:
    - '*'
  destinations:
    - name: '*'
      namespace: 'team-a-*'

  roles:
    - name: developer
      description: Developers can sync applications
      policies:
        - p, proj:team-a:developer, applications, sync, team-a/*, allow
        - p, proj:team-a:developer, applications, get, team-a/*, allow
      groups:
        - team-a-developers

    - name: admin
      description: Admins have full access
      policies:
        - p, proj:team-a:admin, applications, *, team-a/*, allow
      groups:
        - team-a-admins
```

有关项目角色、用于 CI/CD 管道的 JWT 令牌以及 RBAC 配置的详细信息，请参阅 Argo CD 文档中的 [Project Roles](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#project-roles)。

## 常见模式
<a name="_common_patterns"></a>

### 基于环境的项目
<a name="_environment_based_projects"></a>

为每个环境创建单独的项目：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production
  namespace: argocd
spec:
  sourceRepos:
    - 'https://github.com/my-org/*'
  destinations:
    - name: prod-cluster
      namespace: '*'
  # Strict resource controls for production
  clusterResourceWhitelist: []
  namespaceResourceWhitelist:
    - group: 'apps'
      kind: Deployment
    - group: ''
      kind: Service
```

### 基于团队的项目
<a name="_team_based_projects"></a>

使用专用项目隔离团队：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: platform-team
  namespace: argocd
spec:
  sourceRepos:
    - 'https://github.com/my-org/platform-*'
  destinations:
    - name: '*'
      namespace: 'platform-*'
  # Platform team can manage cluster resources
  clusterResourceWhitelist:
    - group: '*'
      kind: '*'
```

### 多集群项目
<a name="_multi_cluster_projects"></a>

使用一致的策略部署到多个集群：

```
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: global-app
  namespace: argocd
spec:
  sourceRepos:
    - 'https://github.com/my-org/global-app'
  destinations:
    - name: us-west-cluster
      namespace: app
    - name: eu-west-cluster
      namespace: app
    - name: ap-south-cluster
      namespace: app
```

## 最佳实践
<a name="_best_practices"></a>

 **从限制性项目开始**：从范围较小的权限开始，然后根据需要进行扩展，而不是一开始就授予广泛的访问权限。

 **使用命名空间模式**：在命名空间限制中使用通配符（例如 `team-a-*`），在保持边界的同时提供灵活性。

 **隔离生产项目**：为生产环境使用具有更严格控制和手动同步策略的专用项目。

 **记录项目用途**：使用 `description` 字段说明每个项目的用途以及适用人员。

 **定期审查项目权限**：定期审核项目，确保限制始终符合团队需求和安全性要求。

## 其他资源
<a name="_additional_resources"></a>
+  [配置 Argo CD 权限](argocd-permissions.md)：配置 RBAC 和 Identity Center 集成
+  [创建应用程序](argocd-create-application.md)：在项目内创建应用程序
+  [使用 ApplicationSets](argocd-applicationsets.md)：将 ApplicationSets 与项目结合使用，以进行多集群部署
+  [Argo CD Projects Documentation](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/)：完整的上游参考