Red Hat Training

A Red Hat training course is available for Red Hat Ceph Storage

第 1 章 在容器中部署 Red Hat Ceph Storage

本章论述了如何将 Ansible 应用与 ceph-ansible playbook 搭配使用,以在容器中部署 Red Hat Ceph Storage 3。

1.1. 先决条件

1.1.1. 将 Red Hat Ceph Storage 节点注册到 CDN 和附加订阅

将每个 Red Hat Ceph Storage(RHCS)节点注册到 Content Delivery Network(CDN),并附加适当的订阅,以便节点可以访问软件存储库。每个 RHCS 节点都必须能访问完整的 Red Hat Enterprise Linux 7 基本内容和额外存储库内容。

先决条件
  • 有效的红帽订阅
  • RHCS 节点必须能够连接到互联网。
  • 对于在安装过程中无法访问互联网的 RHCS 节点,您必须首先在有互联网访问的系统中按照以下步骤操作:

    1. 启动本地 Docker registry:

      # docker run -d -p 5000:5000 --restart=always --name registry registry:2
    2. 从红帽客户门户网站拉取 Red Hat Ceph Storage 3.x 镜像:

      # docker pull registry.access.redhat.com/rhceph/rhceph-3-rhel7
    3. 标记镜像:

       # docker tag registry.access.redhat.com/rhceph/rhceph-3-rhel7 <local-host-fqdn>:5000/cephimageinlocalreg

      <local-host-fqdn> 替换为本地主机 FQDN。

    4. 将镜像推送到您启动的本地 Docker registry:

      # docker push <local-host-fqdn>:5000/cephimageinlocalreg

      <local-host-fqdn> 替换为本地主机 FQDN。

步骤

root 用户身份在存储集群中的所有节点上执行以下步骤。

  1. 注册该节点。在提示时,输入您的红帽客户门户网站凭证:

    # subscription-manager register
  2. 从 CDN 拉取最新的订阅数据:

    # subscription-manager refresh
  3. 列出 Red Hat Ceph Storage 的所有可用订阅:

    # subscription-manager list --available --all --matches="*Ceph*"

    确定适当的订阅并检索其池 ID。

  4. 附加订阅:

    # subscription-manager attach --pool=$POOL_ID
    替换
    • $POOL_ID,其池 ID 在上一步中标识。
  5. 禁用默认软件存储库。然后,启用 Red Hat Enterprise Linux 7 Server、Red Hat Enterprise Linux 7 Server Extras 和 RHCS 软件仓库:

    # subscription-manager repos --disable=*
    # subscription-manager repos --enable=rhel-7-server-rpms
    # subscription-manager repos --enable=rhel-7-server-extras-rpms
    # subscription-manager repos --enable=rhel-7-server-rhceph-3-mon-els-rpms
    # subscription-manager repos --enable=rhel-7-server-rhceph-3-osd-els-rpms
    # subscription-manager repos --enable=rhel-7-server-rhceph-3-tools-els-rpms
  6. 更新系统以接收最新的软件包:

    # yum update
其它资源

1.1.2. 创建具有 sudo 访问权限的 Ansible 用户

Ansible 必须能够以具有 root 权限的用户身份登录所有 Red Hat Ceph Storage 节点,以便在不提示输入密码的情况下安装软件和创建配置文件。在使用 Ansible 部署和配置 Red Hat Ceph Storage 集群时,您必须在存储集群的所有节点上创建一个没有密码的 root 用户。

前提条件

  • 对存储集群中的所有节点具有 rootsudo 访问权限。

步骤

  1. root 用户身份登录 Ceph 节点:

    ssh root@$HOST_NAME
    替换
    • $HOST_NAME,主机名为 Ceph 节点。

    示例

    # ssh root@mon01

    出现提示时,输入 root 密码。

  2. 创建一个新的 Ansible 用户:

    adduser $USER_NAME
    替换
    • $USER_NAME,以及 Ansible 用户的新用户名。

    示例

    # adduser admin

    重要

    不要使用 ceph 作为用户名。ceph 用户名保留用于 Ceph 守护进程。整个集群中的统一用户名可以提高易用性,但避免使用明显的用户名,因为入侵者通常使用它们进行暴力攻击。

  3. 为这个用户设置一个新密码:

    # passwd $USER_NAME
    替换
    • $USER_NAME,以及 Ansible 用户的新用户名。

    示例

    # passwd admin

    出现提示时,输入新密码两次。

  4. 为新创建的用户配置 sudo 访问权限:

    cat << EOF >/etc/sudoers.d/$USER_NAME
    $USER_NAME ALL = (root) NOPASSWD:ALL
    EOF
    替换
    • $USER_NAME,以及 Ansible 用户的新用户名。

    示例

    # cat << EOF >/etc/sudoers.d/admin
    admin ALL = (root) NOPASSWD:ALL
    EOF

  5. 为新文件分配正确的文件权限:

    chmod 0440 /etc/sudoers.d/$USER_NAME
    替换
    • $USER_NAME,以及 Ansible 用户的新用户名。

    示例

    # chmod 0440 /etc/sudoers.d/admin

其它资源

  • Red Hat Enterprise Linux 7 系统管理员指南 中的 Adding a New User 部分。

1.1.3. 为 Ansible 启用无密码 SSH

在 Ansible 管理节点上生成 SSH 密钥对,并将公钥分发到存储集群中的每个节点,以便 Ansible 可以在不提示输入密码的情况下访问节点。

先决条件
步骤

从 Ansible 管理节点以及 Ansible 用户执行以下步骤。

  1. 生成 SSH 密钥对,接受默认文件名并将密语留空:

    [user@admin ~]$ ssh-keygen
  2. 将公钥复制到存储集群中的所有节点:

    ssh-copy-id $USER_NAME@$HOST_NAME
    替换
    • $USER_NAME,以及 Ansible 用户的新用户名。
    • $HOST_NAME,主机名为 Ceph 节点。

    示例

    [user@admin ~]$ ssh-copy-id admin@ceph-mon01

  3. 创建并编辑 ~/.ssh/config 文件。

    重要

    通过创建和编辑 ~/.ssh/config 文件,您不必在每次执行 ansible-playbook 命令时指定 -u $USER_NAME 选项。

    1. 创建 SSH 配置文件

      [user@admin ~]$ touch ~/.ssh/config
    2. 打开 配置文件 进行编辑。为存储集群中的每个节点设置 HostnameUser 选项:

      Host node1
         Hostname $HOST_NAME
         User $USER_NAME
      Host node2
         Hostname $HOST_NAME
         User $USER_NAME
      ...
      替换
      • $HOST_NAME,主机名为 Ceph 节点。
      • $USER_NAME,以及 Ansible 用户的新用户名。

      示例

      Host node1
         Hostname monitor
         User admin
      Host node2
         Hostname osd
         User admin
      Host node3
         Hostname gateway
         User admin

  4. ~/.ssh/config 文件设置正确的文件权限:

    [admin@admin ~]$ chmod 600 ~/.ssh/config
其它资源
  • ssh_config(5) 手册页
  • Red Hat Enterprise Linux 7 系统管理员指南中的 OpenSSH 章节

1.1.4. 为 Red Hat Ceph Storage 配置防火墙

Red Hat Ceph Storage(RHCS)使用 firewalld 服务。

Monitor 守护进程使用端口 6789 用于在 Ceph 存储群集内进行通信。

在每个 Ceph OSD 节点上,OSD 守护进程使用 6800-7300 范围内的多个端口:

  • 一个用于通过公共网络与客户端通信和监控器
  • 一个用于通过集群网络发送数据到其他 OSD(如果可用);否则,通过公共网络发送数据
  • 一个用于通过集群网络(如果有)交换心跳数据包;否则,通过公共网络交换。

Ceph 管理器 (ceph-mgr) 守护进程使用范围为 6800-7300 的端口。考虑将 ceph-mgr 守护进程与 Ceph monitor 在同一节点上并置。

Ceph 元数据服务器节点(ceph-mds)使用范围 680 0-7300 中的端口

Ceph 对象网关节点由 Ansible 配置为使用默认端口 8080。但是,您可以更改默认端口,例如端口 80

要使用 SSL/TLS 服务,请打开端口 443

前提条件

  • 网络硬件已连接。

步骤

root 用户身份运行以下命令。

  1. 在所有 RHCS 节点上,启动 firewalld 服务。启用它在引导时运行,并确保它正在运行:

    # systemctl enable firewalld
    # systemctl start firewalld
    # systemctl status firewalld
  2. 在所有监控节点上,打开 公共网络 上的端口 6789:

    [root@monitor ~]# firewall-cmd --zone=public --add-port=6789/tcp
    [root@monitor ~]# firewall-cmd --zone=public --add-port=6789/tcp --permanent

    根据源地址限制访问:

    firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
    source address="IP_address/netmask_prefix" port protocol="tcp" \
    port="6789" accept"
    firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
    source address="IP_address/netmask_prefix" port protocol="tcp" \
    port="6789" accept" --permanent
    替换
    • 带有 monitor 节点的网络地址的 ip _address
    • 带有 CIDR 表示法子网掩码的 netmask_prefix

    示例

    [root@monitor ~]# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
    source address="192.168.0.11/24" port protocol="tcp" \
    port="6789" accept"

    [root@monitor ~]# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
    source address="192.168.0.11/24" port protocol="tcp" \
    port="6789" accept" --permanent
  3. 在所有 OSD 节点上,打开公共网络上的端口 6800-7300

    [root@osd ~]# firewall-cmd --zone=public --add-port=6800-7300/tcp
    [root@osd ~]# firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent

    如果您有单独的集群网络,请对适当的区重复这些命令。

  4. 在所有 Ceph Manager(ceph-mgr)节点上(通常是与监控器节点相同),在公共网络上打开端口 6800-7300

    [root@monitor ~]# firewall-cmd --zone=public --add-port=6800-7300/tcp
    [root@monitor ~]# firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent

    如果您有单独的集群网络,请对适当的区重复这些命令。

  5. 在所有 Ceph 元数据服务器(ceph-mds)节点上,打开公共网络上的端口 6800

    [root@monitor ~]# firewall-cmd --zone=public --add-port=6800/tcp
    [root@monitor ~]# firewall-cmd --zone=public --add-port=6800/tcp --permanent

    如果您有单独的集群网络,请对适当的区重复这些命令。

  6. 在所有 Ceph 对象网关节点上,打开公共网络上的相关端口或端口。

    1. 打开默认 Ansible 配置的端口 8080:

      [root@gateway ~]# firewall-cmd --zone=public --add-port=8080/tcp
      [root@gateway ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent

      根据源地址限制访问:

      firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="IP_address/netmask_prefix" port protocol="tcp" \
      port="8080" accept"
      firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="IP_address/netmask_prefix" port protocol="tcp" \
      port="8080" accept" --permanent
      替换
      • ip_address 带有对象网关节点的网络地址。
      • 带有 CIDR 表示法子网掩码的 netmask_prefix

      示例

      [root@gateway ~]# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="192.168.0.31/24" port protocol="tcp" \
      port="8080" accept"

      [root@gateway ~]# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="192.168.0.31/24" port protocol="tcp" \
      port="8080" accept" --permanent
    2. 可选。如果使用 Ansible 安装 Ceph 对象网关,并且更改 Ansible 将 Ceph 对象网关配置为从 8080 使用的默认端口,例如,使用端口 80,打开此端口:

      [root@gateway ~]# firewall-cmd --zone=public --add-port=80/tcp
      [root@gateway ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent

      要根据源地址限制访问,请运行以下命令:

      firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="IP_address/netmask_prefix" port protocol="tcp" \
      port="80" accept"
      firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="IP_address/netmask_prefix" port protocol="tcp" \
      port="80" accept" --permanent
      替换
      • ip_address 带有对象网关节点的网络地址。
      • 带有 CIDR 表示法子网掩码的 netmask_prefix

      示例

      [root@gateway ~]# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="192.168.0.31/24" port protocol="tcp" \
      port="80" accept"

      [root@gateway ~]# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="192.168.0.31/24" port protocol="tcp" \
      port="80" accept" --permanent
    3. 可选。要使用 SSL/TLS,请打开端口 443

      [root@gateway ~]# firewall-cmd --zone=public --add-port=443/tcp
      [root@gateway ~]# firewall-cmd --zone=public --add-port=443/tcp --permanent

      要根据源地址限制访问,请运行以下命令:

      firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="IP_address/netmask_prefix" port protocol="tcp" \
      port="443" accept"
      firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="IP_address/netmask_prefix" port protocol="tcp" \
      port="443" accept" --permanent
      替换
      • ip_address 带有对象网关节点的网络地址。
      • 带有 CIDR 表示法子网掩码的 netmask_prefix

      示例

      [root@gateway ~]# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="192.168.0.31/24" port protocol="tcp" \
      port="443" accept"
      [root@gateway ~]# firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" \
      source address="192.168.0.31/24" port protocol="tcp" \
      port="443" accept" --permanent

其它资源

1.1.5. 使用 HTTP 代理

如果 Ceph 节点位于 HTTP/HTTPS 代理后面,则需要配置 docker 以访问 registry 中的镜像。执行以下步骤使用 HTTP/HTTPS 代理配置 docker 的访问。

先决条件
  • 正在运行的 HTTP/HTTPS 代理
步骤
  1. 作为 root 用户,为 docker 服务创建一个 systemd 目录:

    # mkdir /etc/systemd/system/docker.service.d/
  2. root 身份,创建 HTTP/HTTPS 配置文件。

    1. 对于 HTTP,创建 /etc/systemd/system/docker.service.d/http-proxy.conf 文件,并将以下几行添加到文件中:

      [Service]
      Environment="HTTP_PROXY=http://proxy.example.com:80/"
    2. 对于 HTTPS,请创建 /etc/systemd/system/docker.service.d/https-proxy.conf 文件,并将以下几行添加到文件中:

      [Service]
      Environment="HTTPS_PROXY=https://proxy.example.com:443/"
  3. root 用户身份,在运行 ceph-ansible playbook 之前,将 HTTP/HTTPS 配置文件复制到存储集群中的所有节点。