文档

8. OpenShift 部署和配置

Ansible Tower 支持在 OpenShift 上运行的基于容器的集群。本节提供了 OpenShift 和 Tower Pod 配置的高级概述,特别是在以下方面

  • 标准 Tower 与 OpenShift Tower 的主要区别(即自动删除实例)

  • Tower 首先部署为单个 Pod,并在迁移后可以扩展

  • 迁移在任务运行器 Pod 中运行

_images/clusters-task-runner-pod-diagram.png

8.1. Tower 和 OpenShift 基础知识

Tower OpenShift 文档假设您了解如何在管理级别使用 OpenShift,并且应该包含一些维护基于容器的基础设施的经验。差异在于

  • 独立 Tower 和 OpenShift Tower 使用不同的安装程序。对于 OpenShift 安装程序,请访问 http://releases.ansible.com/ansible-tower/setup_openshift

  • Tower 连接到 OpenShift 本身,以便在不强制您手动执行剧本(启动新节点)或在 shell 中运行管理命令(有目的地将节点下线)的情况下,方便扩展和缩减。在系统启动后,您可以配置 Tower 部署以添加更多 Tower Pod 或删除额外的 Tower Pod。

  • Tower Pod 的配置不包含 HTTPs,安装程序将配置 OpenShift 路由,该路由将处理 SSL 终止并将请求分发到所有 Tower Pod。这有点像 OpenShift 内部负载均衡器。

  • 数据库迁移作为启动 Pod 中任务执行器容器过程的一部分运行(请参见图),因此可能会在剧本完成后发生。

  • 容量/性能检测(请参见关于 资源请求和请求规划 的部分)。

  • 在 OpenShift 中运行 Ansible Tower 时,不支持隔离实例。

8.2. 配置选项

需求

  • 最新支持的 OpenShift 版本 3.x 和 4.x(有关详细信息,请参见 Red Hat Container Registry Authentication

  • 每个 Pod 的默认资源需求
    • 6GB 内存

    • 3 个 CPU 内核

  • 运行安装程序的机器上的 OpenShift 命令行工具 (oc)

  • 一个已设置并运行的 OpenShift 集群

  • 运行 OpenShift 安装程序的帐户的管理员权限(需要 cluster-admin 角色)

8.3. 基本配置

OpenShift 安装需要设置以下参数

  • openshift_host

  • openshift_project

  • openshift_user

  • openshift_password

  • admin_password

  • secret_key

  • pg_username

  • pg_password

对于 OpenShift 安装方法,设置与 传统 Tower 安装方法 相同,除了

  • Tower UI 和 API 的 SSL 终止通过 OpenShift 服务对象处理。此处使用的证书将由 OpenShift 内部 CA 生成和签名。

  • 可选地部署到 OpenShift 安装的容器化 PostgreSQL Pod 无法配置为 SSL。如果您希望在 OpenShift 环境中使用支持 SSL 的 PostgreSQL,则必须单独部署 PostgreSQL 服务器,并配置 Tower 节点(使用 pg_sslmode)。

如果项目不存在,则将创建该项目,但提供的用户应该具有以下权限之一

  • 创建项目并使用 Tower 所需的 Pod 填充项目的能力

  • 访问项目中需要的任何 Pod 的创建权限(如果项目已存在)

密码应该在执行安装程序时显示在命令行上。

oc 命令行客户端应该安装并可用,并且客户端版本应该与服务器版本匹配。

secret-key、管理员密码以及 PostgreSQL 用户名和密码应该在运行安装程序之前填充到清单文件中。

./setup_openshift.sh -e openshift_password=$OPENSHIFT_PASSWORD -- -v

注意

Tower 使用 Bubblewrap(来自 Project Atomic)作为一种机制,使(相对)无特权的 awx 用户能够将 Ansible 进程彼此隔离。容器需要授予某些特权,因此需要在特权模式下运行 Tower Web 和任务容器。

Tower Web 服务的默认类型为 NodePort。要自定义它,请在清单文件中将 kubernetes_web_svc_type 设置为 ClusterIPLoadBalancer,或将其作为额外的变量传递。

8.4. 资源请求和请求规划

通常,Tower 会检查它运行的系统以确定其运行作业和执行后台请求的容量。在 OpenShift 上,这与其他方式不同,因为 Pod 和容器往往会共存在系统上。Pod 还可以根据当前条件在主机之间迁移(例如,如果 OpenShift 集群正在升级或遇到故障)。

Pod 和容器通常会请求它们需要的资源。OpenShift 然后使用这些信息来决定在哪里运行它们(或者它们是否可以运行)。

Tower 也将使用这些信息来配置自身容量,即可以运行多少个(以及每个)单独作业的大小。

每个 Tower pod 由 3 个容器组成(参见 ),每个容器都配置了保守的默认值,但总的来说它们可能相当大。这些默认值也可以配置,但了解它们对 Tower 集群的影响非常有帮助。

两个最重要的值控制任务执行容器的 CPU 和内存分配。这个容器实际上负责启动作业,因此这些值直接控制可以运行多少个作业以及作业的大小。这些设置可以在清单中更改,以下是默认值

task_cpu_request=1500

这是要分配的 CPU 量,值为 1500 指的是 OpenShift 本身如何看待 CPU 请求(参见 https://docs.OpenShift.com/container-platform/3.9/dev_guide/compute_resources.html#dev-cpu-requests)(有关值的含义,请参见:https://docs.OpenShift.com/container-platform/3.9/dev_guide/compute_resources.html#dev-compute-resources

1500 是 1500 毫核,相当于大约 1.5 个 CPU 内核。

此值用于以以下方式配置 Tower 容量

((task_cpu_request/ 1000) * 4)

也就是说,默认情况下,在 OpenShift 中的 Tower(当完全为基于 CPU 的算法配置时)最多可以运行 6 个同时分叉。

另一个可以调整的值

task_mem_request=2 - This is the amount of memory to dedicate (in gigabytes).

此值用于以以下方式配置 Tower 容量

((task_mem_request * 1024) / 100)

也就是说,默认情况下,Tower 在为基于内存的算法配置时,最多可以运行 40 个同时分叉。

有关默认资源请求,请参见 roles/kubernetes/defaults/main.yml

总的来说,单个 Tower pod 的默认请求资源总计为

  • 3 个 CPU 内核

  • 6 GB 内存

您要运行 Tower 的 OpenShift 实例应至少匹配这些要求。如果更改了默认值,则需要更新系统以匹配新的要求。

注意

如果其他 Pod 在 OpenShift 实例上运行,或者系统太小而无法满足这些要求,那么 Tower 可能无法在任何地方运行。有关更多详细信息,请参阅 容量算法

8.5. 数据库配置和使用

有两种方法可以为在 Openshift 中运行的 Tower 配置 Tower PostgreSQL 数据库

  • (推荐) 外部管理的数据库(不是由 Tower 设置剧本安装)。PostgreSQL 服务器在 Tower 安装之前安装在 Openshift 集群内或外部,并且 Tower 被配置为指向它

  • PostgreSQL 在 Openshift 中使用 Tower 安装程序安装,方法是提供预先创建的 PersistentVolumeClaim 并将其提供给 Tower 安装剧本清单文件作为 openshift_pg_pvc_name

如果您要安装 Tower 用于演示/评估目的,您可以设置 openshift_pg_emptydir=true,OpenShift 将创建一个临时卷供 pod 使用。

警告

此卷仅用于演示/评估目的,并且在 pod 停止时将被删除。

8.6. 备份和恢复

备份和恢复过程类似于传统 Tower。从当前 Tower 版本的安装程序目录的根目录运行

./setup_openshift.sh -b # Backup
./setup_openshift.sh -r # Restore

注意

configmap 将根据清单文件中的值重新创建。清单文件包含在备份 tarball 中。

8.7. 升级

要升级 OpenShift 中的 Tower 部署,您需要从 http://releases.ansible.com/ansible-tower/setup_openshift 下载并使用最新的安装程序。与传统 Tower 安装一样,预计会出现一些停机时间。

8.8. 迁移

Tower 支持从传统设置迁移到 OpenShift 中的设置,如下所述

  1. 首先,使用正常升级过程将您的传统 Tower 设置升级到最新版本的 Ansible Tower(或至少升级到 3.3 版)。

  2. 下载 OpenShift 安装程序。

  3. 编辑 inventory 文件并更改 pg_usernamepg_passwordpg_databasepg_port,使其指向您传统 Tower 设置中已升级的 Tower 数据库。

  4. 照常运行 OpenShift 安装程序。

警告

不要在 pg_password 中使用特殊字符,因为这可能会导致设置失败。

8.9. 构建自定义虚拟环境

可以覆盖基本容器映像以构建自定义虚拟环境(virtualenvs)。覆盖基本容器用于自定义和自定义 virtualenv 支持或本地镜像。如果您想在 OpenShift 中部署的 Tower 与自定义虚拟环境一起使用,您需要自定义 Tower 使用的容器映像。

这是一个可以用作示例的 Dockerfile。这会将 Ansible 安装到自定义虚拟环境中

FROM registry.redhat.io/ansible-tower-38/ansible-tower-rhel7
USER root
RUN yum install -y gcc python-devel openssl-devel
RUN umask 0022
RUN virtualenv /var/lib/awx/venv/ansible2.7
RUN /var/lib/awx/venv/ansible2.7/bin/pip install psutil python "ansible==2.7.9"

如果您需要安装其他 python 依赖项(例如自定义模块的依赖项),您可以将额外的 RUN 命令添加到 docker 文件中,该命令会激活虚拟环境并调用 pip

映像构建完成后,请确保该映像位于您的注册表中,并且 OpenShift 集群和安装程序可以访问它。

覆盖 OpenShift 安装程序中 group_vars/all 中的以下变量,以指向您已推送到注册表的映像

kubernetes_web_image: registry.example.com/my-custom-tower
kubernetes_task_image: registry.example.com/my-custom-tower

如果镜像 vanilla Red Hat 映像

kubernetes_web_image: registry.example.com/ansible-tower
kubernetes_task_image: registry.example.com/ansible-tower

8.10. 使用 Ansible Tower OpenShift 安装程序配置 TLS

使用 Ansible Tower 3.8.x OpenShift 安装程序配置 TLS 是通过编辑清单文件或创建单独的 vars.yml 文件来完成的,该文件可以在运行 ./setup_openshift.sh 时指定。在 Tower 3.8.x 中,在运行安装程序后,需要执行一个额外的步骤来设置 TLS,以便创建安全路由。以下介绍了对您的 Tower 部署的路由和服务对象所做的更改,可以通过每个资源的 UI 中的 YAML 部分或通过使用 oc edit <resource> <resource-name> 从命令行进行更改。

  1. 在 OpenShift 安装程序的清单文件中,在运行 ./openshift_installer.sh 之前,将 kubernetes_web_svc_type 设置为 "ClusterIP"。例如,清单文件中的条目应如下所示

    kubernetes_web_svc_type: "ClusterIP"
    
  2. 由于路由已存在,因此我们建议您根据需要修改它(主要是添加证书)。为此,请通过将终止设置为 Edge 来编辑现有的 ansible-tower-web-svc 路由资源。这可能与您的环境不同,请参阅 OpenShift 文档,创建具有自定义证书的边缘路由,以确定哪种最适合您。

  3. 创建 TLS 证书和密钥,然后将它们注册到您的证书颁发机构。

  4. 在路由 YAML 的 spec.tls.certspec.tls.key 部分下使用该证书和密钥,类似于以下示例。

kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: ansible-tower-web-svc
  namespace: my-namespace
  labels:
    name: ansible-tower-web-svc
spec:
  host: ansible-tower-web-svc-ca-tower.ocp3.ansible.eng.rdu2.redhat.com
  to:
    kind: Service
    name: ansible-tower-web-svc
    weight: 100
  port:
    targetPort: http
  tls:
    termination: edge
    certificate: |
        -----BEGIN CERTIFICATE-----
        ...
        -----END CERTIFICATE-----

    key: |
        -----BEGIN RSA PRIVATE KEY-----
        ...
        -----END RSA PRIVATE KEY-----
  wildcardPolicy: None
  1. 在 OpenShift 上未经修改的 Ansible Tower 安装包含一个服务,其 service_type = NodePort,类似于以下示例 YAML。

_images/tls-openshift-installer-initial-service-nodeport.png

这是在选择 edge 作为类型而不是 passthrough 之前的路由

spec:
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8052
      nodePort: 31620
  selector:
    name: ansible-tower-web-deploy
  clusterIP: 172.30.251.127
  type: NodePort
  sessionAffinity: None
  externalTrafficPolicy: Cluster
  1. 可选地,如果您不想使用清单文件中设置的 kubernetes_web_svc_type 重新运行 OpenShift 安装程序,您可以通过将此服务对象的 typeNodePort 更改为 ClusterIP 并删除 spec.ports[0].nodePort 行来手动修补服务资源,如以下示例所示。

spec:
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8052
  selector:
    name: ansible-tower-web-deploy
  clusterIP: 172.30.251.127
  type: ClusterIP
  sessionAffinity: None
  externalTrafficPolicy: Cluster