3.7. 为外部 Red Hat Ceph Storage 集群使用 TLS 配置 RGW
使用 TLS 配置 RGW,以便 control plane 服务可以解析外部 Red Hat Ceph Storage 集群主机名。
此流程将 Ceph RGW 配置为模拟 Object Storage 服务(swift)。它创建一个 DNS 区域和证书,以便 https://rgw-external.ceph.local:8080
等 URL 被注册为 Identity 服务(keystone)端点。这可让 Red Hat OpenStack Services on OpenShift (RHOSO)客户端解析主机并信任证书。
由于 RHOSO pod 需要安全地访问由 Red Hat OpenShift Container Platform (RHOCP)托管的 HTTPS 端点,所以此过程用于为该端点创建 DNS 域和证书。
在此过程中,会创建一个 DNSData
域,在示例中 ceph.local
,以便 pod 可以为 RHOCP 上托管的服务将主机名映射到 IP 地址。然后,使用 CoreDNS
服务为域配置 DNS 转发。最后,使用 RHOSO 公共根证书颁发机构创建证书。
您必须将 RHOCP 中创建的证书和密钥文件复制到托管 RGW 的节点,以便它们可以成为 Ceph 编排器 RGW 规范的一部分。
流程
为外部 Ceph 集群创建
DNSData
自定义资源(CR)。注意创建
DNSData
dnsmasq
pod,它可以在关联的 DNSData CR 中读取和解析 DNS 信息。以下是
DNSData
CR 的示例:apiVersion: network.openstack.org/v1beta1 kind: DNSData metadata: labels: component: ceph-storage service: ceph name: ceph-storage namespace: openstack spec: dnsDataLabelSelectorValue: dnsdata hosts: - hostnames: - ceph-rgw-internal-vip.ceph.local ip: 172.18.0.2 - hostnames: - ceph-rgw-external-vip.ceph.local ip: 10.10.10.2
注意在本例中,假设 IP 地址
172.18.0.2
的主机托管 Ceph RGW 端点,以访问私有存储网络。此主机通过 CR,以便创建 DNS A 和 PTR 记录。这可让使用主机名ceph-rgw-internal-vip.ceph.local
访问主机。还假设主机位于 IP 地址
10.10.10.2
的主机上,用于外部网络上访问 Ceph RGW 端点。此主机通过 CR,以便创建 DNS A 和 PTR 记录。这可让使用主机名ceph-rgw-external-vip.ceph.local
访问主机。本例中的主机列表不是所需主机的确定列表。它提供给演示目的。替换适合您的环境的主机。
将 CR 应用到您的环境:
$ oc apply -f <ceph_dns_yaml>
-
将
<ceph_dns_yaml
> 替换为DNSData
CR 文件的名称。
-
将
-
使用向
ceph.local
域的请求的dnsmasq
更新CoreDNS
CR。有关 DNS 转发的更多信息,请参阅 RHOCP 网络指南中的 使用 DNS 转发。 列出
openstack
domain DNS 集群 IP:$ oc get svc dnsmasq-dns
以下是这个命令的输出示例:
$ oc get svc dnsmasq-dns dnsmasq-dns LoadBalancer 10.217.5.130 192.168.122.80 53:30185/UDP 160m
- 记录命令输出中的转发信息。
列出
CoreDNS
CR:$ oc -n openshift-dns describe dns.operator/default
编辑
CoreDNS
CR,并使用转发信息更新它。以下是带有转发信息更新的
CoreDNS
CR 示例:apiVersion: operator.openshift.io/v1 kind: DNS metadata: creationTimestamp: "2024-03-25T02:49:24Z" finalizers: - dns.operator.openshift.io/dns-controller generation: 3 name: default resourceVersion: "164142" uid: 860b0e61-a48a-470e-8684-3b23118e6083 spec: cache: negativeTTL: 0s positiveTTL: 0s logLevel: Normal nodePlacement: {} operatorLogLevel: Normal servers: - forwardPlugin: policy: Random upstreams: - 10.217.5.130:53 name: ceph zones: - ceph.local upstreamResolvers: policy: Sequential upstreams: - port: 53 type: SystemResolvConf
以下是添加到 CR 中的内容:
.... servers: - forwardPlugin: policy: Random upstreams: - 10.217.5.130:53 1 name: ceph zones: - ceph.local ....
- 1
- 从
oc get svc dnsmasq-dns
命令记录的转发信息。
使用
DNSData
CR 中的主机名创建一个证书
CR。以下是
证书 CR 的示例
:apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: cert-ceph-rgw namespace: openstack spec: duration: 43800h0m0s issuerRef: {'group': 'cert-manager.io', 'kind': 'Issuer', 'name': 'rootca-public'} secretName: cert-ceph-rgw dnsNames: - ceph-rgw-internal-vip.ceph.local - ceph-rgw-external-vip.ceph.local
注意证书
issuerRef
设置为 RHOSO 的 root 证书颁发机构(CA)。部署 control plane 时会自动创建此 CA。CA 的默认名称为rootca-public
。RHOSO pod 信任这个新证书,因为使用了 root CA。将 CR 应用到您的环境:
$ oc apply -f <ceph_cert_yaml>
-
将
<ceph_cert_yaml
> 替换为证书
CR 文件的名称。
-
将
从应用
证书
CR 时创建的 secret 中提取证书和密钥数据:$ oc get secret <ceph_cert_secret_name> -o yaml
将
<ceph_cert_secret_name
> 替换为Certificate
CR 的secretName
字段中使用的名称。注意此命令使用类似如下的 data 部分输出 YAML:
[stack@osp-storage-04 ~]$ oc get secret cert-ceph-rgw -o yaml apiVersion: v1 data: ca.crt: <CA> tls.crt: <b64cert> tls.key: <b64key> kind: Secret
<b64cert> 和 <b64key> 值是您在下一步中必须使用的 base64 编码证书和密钥字符串。
提取和 base64 解码上一步中获取的证书和密钥信息,并将它们的串联保存到 Ceph 对象网关服务规格中。
规格文件的
rgw
部分类似如下:service_type: rgw service_id: rgw service_name: rgw.rgw placement: hosts: - host1 - host2 networks: - 172.18.0.0/24 spec: rgw_frontend_port: 8082 rgw_realm: default rgw_zone: default ssl: true rgw_frontend_ssl_certificate: | -----BEGIN CERTIFICATE----- MIIDkzCCAfugAwIBAgIRAKNgGd++xV9cBOrwDAeEdQUwDQYJKoZIhvcNAQELBQAw <redacted> -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAyTL1XRJDcSuaBLpqasAuLsGU2LQdMxuEdw3tE5voKUNnWgjB <redacted> -----END RSA PRIVATE KEY-----
规格文件的
ingress
部分类似如下:service_type: ingress service_id: rgw.default service_name: ingress.rgw.default placement: count: 1 spec: backend_service: rgw.rgw frontend_port: 8080 monitor_port: 8999 virtual_interface_networks: - 172.18.0.0/24 virtual_ip: 172.18.0.2/24 ssl_cert: | -----BEGIN CERTIFICATE----- MIIDkzCCAfugAwIBAgIRAKNgGd++xV9cBOrwDAeEdQUwDQYJKoZIhvcNAQELBQAw <redacted> -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAyTL1XRJDcSuaBLpqasAuLsGU2LQdMxuEdw3tE5voKUNnWgjB <redacted> -----END RSA PRIVATE KEY-----
在上例中,
rgw_frontend_ssl_certificate
和ssl_cert
包含上一步中的 <b64cert> 和 <
b64key>
中的 base64 解码值,两者之间没有空格。- 使用服务规格部署 Ceph 对象网关的步骤, 以使用 SSL 部署 Ceph RGW。
-
连接到
openstackclient
pod。 验证转发信息是否已成功更新。
$ curl --trace - <host_name>
将
<host_name
> 替换为之前添加到DNSData
CR 的外部主机的名称。注意以下是此命令的输出示例,其中
openstackclient
pod 成功解析主机名,且不会遇到 SSL 验证错误。sh-5.1$ curl https://rgw-external-vip.ceph.local:8080 <?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult> .1$ sh-5.1$