Ansible Tower 支持在 OpenShift 上运行的基于容器的集群。本节提供了 OpenShift 和 Tower Pod 配置的高级概述,特别是在以下方面
标准 Tower 与 OpenShift Tower 的主要区别(即自动删除实例)
Tower 首先部署为单个 Pod,并在迁移后可以扩展
迁移在任务运行器 Pod 中运行
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 时,不支持隔离实例。
需求
最新支持的 OpenShift 版本 3.x 和 4.x(有关详细信息,请参见 Red Hat Container Registry Authentication)
6GB 内存
3 个 CPU 内核
运行安装程序的机器上的 OpenShift 命令行工具 (oc)
一个已设置并运行的 OpenShift 集群
运行 OpenShift 安装程序的帐户的管理员权限(需要 cluster-admin
角色)
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
设置为 ClusterIP
或 LoadBalancer
,或将其作为额外的变量传递。
通常,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 可能无法在任何地方运行。有关更多详细信息,请参阅 容量算法。
有两种方法可以为在 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 停止时将被删除。
备份和恢复过程类似于传统 Tower。从当前 Tower 版本的安装程序目录的根目录运行
./setup_openshift.sh -b # Backup
./setup_openshift.sh -r # Restore
注意
configmap
将根据清单文件中的值重新创建。清单文件包含在备份 tarball 中。
要升级 OpenShift 中的 Tower 部署,您需要从 http://releases.ansible.com/ansible-tower/setup_openshift 下载并使用最新的安装程序。与传统 Tower 安装一样,预计会出现一些停机时间。
Tower 支持从传统设置迁移到 OpenShift 中的设置,如下所述
首先,使用正常升级过程将您的传统 Tower 设置升级到最新版本的 Ansible Tower(或至少升级到 3.3 版)。
下载 OpenShift 安装程序。
编辑 inventory
文件并更改 pg_username
、pg_password
、pg_database
和 pg_port
,使其指向您传统 Tower 设置中已升级的 Tower 数据库。
照常运行 OpenShift 安装程序。
警告
不要在 pg_password
中使用特殊字符,因为这可能会导致设置失败。
可以覆盖基本容器映像以构建自定义虚拟环境(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
使用 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>
从命令行进行更改。
在 OpenShift 安装程序的清单文件中,在运行 ./openshift_installer.sh
之前,将 kubernetes_web_svc_type
设置为 "ClusterIP"
。例如,清单文件中的条目应如下所示
kubernetes_web_svc_type: "ClusterIP"
由于路由已存在,因此我们建议您根据需要修改它(主要是添加证书)。为此,请通过将终止设置为 Edge
来编辑现有的 ansible-tower-web-svc
路由资源。这可能与您的环境不同,请参阅 OpenShift 文档,创建具有自定义证书的边缘路由,以确定哪种最适合您。
创建 TLS 证书和密钥,然后将它们注册到您的证书颁发机构。
在路由 YAML 的 spec.tls.cert
和 spec.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
在 OpenShift 上未经修改的 Ansible Tower 安装包含一个服务,其 service_type = NodePort
,类似于以下示例 YAML。
这是在选择 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
可选地,如果您不想使用清单文件中设置的 kubernetes_web_svc_type
重新运行 OpenShift 安装程序,您可以通过将此服务对象的 type 从 NodePort
更改为 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