通过 YAML 创建应用

如果您熟悉 YAML 语法,并且更倾向于在表单或预定义模板之外定义配置,则可以通过 YAML 创建应用。此方式可为应用配置及其引用资源提供更灵活的控制。

注意事项

当集群中同时存在 Linux 和 Windows 节点时,请考虑配置节点选择,使工作负载仅调度到兼容的节点上。例如:

spec:
    spec:
      nodeSelector:
        kubernetes.io/os: linux

前提条件

确保 YAML 中定义的镜像可以在当前集群内拉取。您可以使用 podman pull 命令进行验证。

操作步骤

  1. Container Platform,然后导航到 Application > Applications

  2. 单击 Create

  3. 选择 Create from YAML

  4. 完成配置后,单击 Create

  5. 在详情页面查看对应的 Deployment

Applications 视图与 Clusters 视图之间的创建入口差异

新的 Web 控制台可以从不同视图中提供基于 YAML 的创建入口。请根据您是在项目范围内操作,还是在具体集群中操作,选择相应入口。

  • Applications 视图:从当前项目开始。打开 Applications > Applications,单击 Create from YAML,先选择目标 Cluster,然后检查或确认 YAML 内容中的目标 Namespace,最后提交资源。
  • Clusters 视图:从具体集群开始。先打开目标集群,进入目标命名空间,然后导航到 Applications 或相关资源列表,以在该固定集群上下文中打开 YAML 创建工作流。

在继续之前,请确认以下差异:

  • Applications 视图中,集群选择是项目范围内应用工作流的一部分。
  • Clusters 视图中,由于您是从具体集群内部开始,因此集群已经固定。
  • Applications 视图中,主要顺序是先选择集群,再确认 YAML 中声明的命名空间。
  • Clusters 视图中,主要顺序是先进入具体集群,再在目标命名空间上下文中操作。

Applications 视图的其他指导

如果您的环境在 Applications 视图中提供 YAML 创建功能,请使用相同的 YAML 创建路径,并查看以下仅适用于 Applications 视图的行为。

  1. Applications 视图中打开应用页面。
  2. 单击 Create from YAML
  3. 选择目标 Cluster
  4. 检查 YAML 元数据中声明的命名空间。
  5. 粘贴或编辑 YAML 内容。
  6. 查看可见的元数据和验证结果。
  7. 单击 Create

理解 YAML 验证和一致性

当您在 Applications 视图中通过 YAML 创建应用时:

  • 所选集群决定工作流所使用的项目上下文。
  • 工作流不会强制覆盖 YAML 中声明的命名空间。
  • 命名空间验证会依据 YAML 中声明的命名空间以及命名空间资源的标准 Kubernetes 规则进行。
  • YAML 验证会在提交前确认内容可以被解析并被工作流接受。
  • 如果声明的命名空间不存在,或者您没有使用该命名空间的权限,提交将返回明确的错误。
  • 验证成功并不保证运行时依赖项已经满足。

如果您的 YAML 包含多个资源,请确保在资源属于命名空间范围时,每个资源都显式声明了预期的命名空间。

提交前的检查点

在单击 Create 之前,请确认:

  • YAML 中声明的命名空间就是您打算创建资源的命名空间。
  • 声明的命名空间已存在,并且当前身份有权限在该命名空间中创建资源。
  • 镜像源可从所选集群访问。
  • 引用的 ConfigMaps、Secrets、Service、PVC 以及其他依赖项要么已经存在,要么在提交的 YAML 中保持一致地包含。
  • 所有提交对象中的 labels、selectors、ports 和环境设置彼此保持内部一致。
  • YAML 不会无意间与声明命名空间中具有相同标识的现有对象发生冲突。
  • 任何调度约束仍然与目标集群匹配,尤其是在混合架构环境中。

当您一次性提交多个相关资源时,不仅要逐个检查每个对象,还要检查工作负载、Service、配置对象和存储引用之间的关系。

# webapp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
  labels:
    app: webapp
    env: prod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
        tier: frontend
    spec:
      containers:
      - name: webapp
        image: nginx:1.25-alpine
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "250m"
            memory: "256Mi"
---
# webapp-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: webapp-service
spec:
  selector:
    app: webapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP