通过OpenShift的Pod,通过私有服务端点访问Redis

我已经研究了在 OpenShift 集群上构建 Redis 集群的方法。然而,在 IBM Cloud 数据库中,已经有一个 Redis 服务。有人可能质疑为什么要费心在 K8s 集群上自己构建 Redis 集群。因此,我将对 Redis 托管服务进行验证,包括解决传统问题的方法。

以下是关于过去的Redis和K8s的文章。这些文章描述了如何在自己的K8s集群上运行Redis容器。

    • Redisクラスタ を OpenShift on IBM Cloud にデプロイした結果

 

    • Redisクラスタをマルチゾーン上のKubernetesで構築する時の考慮点

 

    Redis+Sentinel を Kubernetes で動かしたメモ

Redis的私有服务端点

过去,Bluemix时代中,数据库服务是设计为从Bluemix PaaS的Cloud Foundry运行时中使用的。因此,如果要从除PaaS运行时之外的虚拟服务器或K8s pod访问,必须通过公共网络连接到DBaaS的端点,这带来了安全风险和按通信量计费的问题。导致这种情况的背景包括SoftLayer的收购、Bluemix PaaS的构建以及IaaS和PaaS的整合等各种转变,这些都是包括主要业务部门的变迁。这也是在其他云服务提供商的竞争中落后的部分。

DBaaS_Public.png

作为解决这个问题的方法,现在已经开始提供给每个用户个别使用的私有VLAN,以开放DBaaS的私有终端点服务。通过在无法从公共网络访问的私有网络区域中打开DBaaS的终端点,并通过后端的Private VLAN进行访问,消除了第三方攻击终端点的风险,数据安全性得到了进一步提高。

DBaaS_Private.png

在公共网络上开放DBaaS的终端,可以自由地从互联网上访问,这有很多好处。例如,可以自由地从自己的开发环境访问,也可以从其他云服务提供商那里使用等等。当然,如果使用SSL/TLS等进行通信加密,我们可以认为通过嗅探进行信息泄漏的风险是不存在的。因此,DBaaS的默认设置是在公共网络上开放终端,如果用户希望,可以将终端限定在私有区域内的设置是可行的。

准备工作,以便使用私人服务终端点。

要启用私有服务端点,必须启用VRF(虚拟路由转发)。 VRF是根据每个账户进行设置的,您需要提出请求并由IBM Cloud的网络团队进行设置更改。 此外,还需要启用服务端点。

请参考我之前发布的文章,关于如何将IKS K8s/OpenShift主节点的api-server更改为专用私有,并启用VRF和服务端点的流程记录,以启用它们。

这些设置将应用于账户上,一旦设置了VRF,就无法恢复到原来的状态。

确认前提设定

要确认前述的两个选项是否有效,只需执行以下命令即可。需要确认的项目也已在终端输出中添加了注释。

root@virtualserver01:~# ibmcloud account show
<中略>
VRF Enabled:                        true   <<--- これと
Service Endpoint Enabled:           true   <<--- これが trueであること
EU Supported                        false   
PoC (Commercial Proof of Concept)   false   
HIPAA Supported                     false   

部署Redis数据库即服务 (Redis DBaaS)。

从目录中选择Redis数据库。Redis具有以下特点:

    • コンプライアンス:SOC 2タイプ1、SOC 1タイプ1、HIPAA対応、GDPR

 

    • IAM、リソースグループ、アクティビティトラッカー、モニタリング、キー保護との統合

 

    • ディスク上のデータ、移動中のデータ、およびバックアップの暗号化

 

    • クロスリージョンIBM Cloud Object Storageで30日間のバックアップ保持

 

    • サーバーレススケーリングのため、ディスクとRAMの独立したスケーリング

 

    従量課金、時間単位の請求
Catalog_Mini.png

使用Redis进行部署

大部分选择默认选项,但只有「终端点」需要同时选择公共和私有。

    1. 服务名称:Redis-0101

 

    1. 选择部署地区/位置:东京

 

    1. 选择资源组:默认

 

    1. 标签:自定义设置

 

    1. 选择初始内存分配:每个成员1GB(总计2GB)

 

    1. 选择初始磁盘分配:每个成员1GB(总计2GB)

 

    1. 选择初始CPU分配:共享CPU

 

    1. 选择数据库版本:4

 

    1. 选择密钥保护实例:自动磁盘加密密钥(默认)

 

    1. 选择磁盘加密密钥:自动磁盘加密密钥(默认)

 

    终端点:公共网络和私有网络
Redis_Config_Mini.png

点击“创建”,几分钟后,部署将完成。

访问Redis数据库

首先,通过自己的电脑,通过公共网络连接测试连接到Redis。
尽管通过公共网络连接,但Redis自带的“redis-cli”不具备加密通信功能,因此需要使用IBM专有的支持SSL/TLS的Redis客户端“redli”。

参考资料可以在以下链接找到:https://github.com/IBM-Cloud/redli。

安装云数据库插件。

当您首次使用云数据库时,需要安装IBM Cloud命令的云数据库插件。这样,您就可以使用子命令”cdb”了。

$ ibmcloud plugin install cloud-databases
リポジトリー 'IBM Cloud' から 'cloud-databases' を検索しています...
プラグイン 'cloud-databases 0.6.0' がリポジトリー 'IBM Cloud' 内で見つかりました
バイナリー・ファイルをダウンロードしようとしています...
 9.66 MiB / 9.66 MiB [==================================================================================================================================] 100.00% 14s
10133532 バイトがダウンロードされました
バイナリーをインストールしています...
OK
プラグイン 'cloud-databases 0.6.0' は /Users/maho/.bluemix/plugins/cloud-databases に正常にインストールされました。 'ibmcloud plugin show cloud-databases' を使用して詳細を表示してください。

显示云数据库列表

列出作为实例运行的数据库服务。第二个显示的是 Redis-0101。

$ ibmcloud cdb deployments
<中略>
Name                          Location   State   
Databases for PostgreSQL-hv   us-south   active   
Redis-0101                    jp-tok     active  

设定管理员密码

请使用以下命令设置数据库管理员的密码。由于该密码将来可能会用到,请记下来。

$ ibmcloud cdb user-password Redis-0101 admin newpassword123
<以下省略>

请参考以下资料:https://cloud.ibm.com/docs/services/databases-for-redis?topic=databases-for-redis-admin-password&locale=ja

获取用于连接的字符串

可以使用以下命令来显示连接到Redis-0101实例所需的字符串。

$ ibmcloud cdb deployment-connections Redis-0101
Retrieving public connection strings for Redis-0101...
OK

Type    Connection String   
Redis   rediss://admin:$PASSWORD@3a3e43f3-5801-481a-9092-74dea6e33d69.c437f5ab8b3840e99a1a93dffcce078d.databases.appdomain.cloud:32297/0   
CLI     REDIS_CERTFILE=37388d79-db9d-11e8-907f-e6c932c242f1 redli -u rediss://admin:$PASSWORD@3a3e43f3-5801-481a-9092-74dea6e33d69.c437f5ab8b3840e99a1a93dffcce078d.databases.appdomain.cloud:32297/0   

请参考以下资料获取连接字符串:https://cloud.ibm.com/docs/services/databases-for-redis?topic=databases-for-redis-connection-strings&locale=ja#getting-connection-strings-from-the-cli

安装redli

安装带有密钥通信功能的Redis客户端”redli”。在安装了Go语言环境后,从https://github.com/IBM-Cloud/redli下载redli命令进行安装。安装目录因环境而异,以macOS为例,默认安装在~/go/bin目录,需要将其添加到环境变量中。

$ go version
go version go1.12.5 darwin/amd64
$ go get -u github.com/IBM-Cloud/redli
$ go install github.com/IBM-Cloud/redli
$ export PATH=$PATH:~/go/bin
$ redli --help
usage: redli [<flags>] [<commands>...]
<以下省略>

请参阅以下资料:https://github.com/IBM-Cloud/redli

从公共端对redli进行到Redis的连接测试。

在计算机上设置密码环境变量,并通过redli进行连接测试。” –certfile ./redis-cert.pem “是用于加密通信的证书。

可以通过以下步骤进行操作:转到https://cloud.ibm.com/resources,选择资源->服务->Redis-0101->管理,复制TLS证书中显示的PEM数据并保存到文本文件中。由于有公共和私有两种证书可用,因此根据连接路径选择适当的证书。

下面是一个使用redli命令连接后进行数据操作和确认的示例。

redli -u rediss://admin:$PASSWORD@3a3e43f3-5801-481a-9092-74dea6e33d69.c437f5ab8b3840e99a1a93dffcce078d.databases.appdomain.cloud:32297/0 --certfile ./redis-cert.pem
Connected to 4.0.10
> set key-a 123
OK
> get key-a
"123"
> incr key-a
(integer) 124

启用私有服务终端。

接下来启用私有服务端点。

$ ibmcloud resource service-key-create redis-private-key Administrator --instance-name Redis-0101 --service-endpoint private

参考资料:https://cloud.ibm.com/docs/services/databases-for-redis?topic=cloud-databases-service-endpoints&locale=ja#credentials-for-private-endpoints

参考资料链接提供了有关私有端点的凭据。

对私有服务端点的连接测试

Redis-Workstation.png

USERNAMEとPASSWORDの環境変数は事前にセットしておく、Redisインスタンスの「管理」画面に表示されるプライベート用の証明書をファイルとして保存する。 そして、接続文字列をコピペして、redliコマンド実行する。

接続文字列、すなわち、RedisインスタンスのURLアドレスに、private.databsesという文字列が含まれており、プライベートのエンドポイントであることが伺われる。 パブリックネットワークからpingを実行して、疎通が無いことを確認するのも良いと思う。

以类似下方执行示例的方式,连接到公共终点,通过设置键和值来尝试获取所指定的键的值,从而获取数据。

root@virtualserver01:~# redli -u rediss://$USERNAME:$PASSWORD@3a3e43f3-5801-481a-9092-74dea6e33d69.c437f5ab8b3840e99a1a93dffcce078d.private.databases.appdomain.cloud:32297/0 --certfile ./cert.pem 
Connected to 4.0.10
> get key-a
"124"

从 OpenShift 的 Pod 进行连接测试。

最后,尝试从OpenShift上的Pod访问Redis服务器。Redis服务器和OpenShift的主节点分别位于IBM Cloud的管理之下,无法直接登录到这些服务器。用户需要先登录到工作站,然后登录到OpenShift,启动一个可以访问Redis服务器的Pod,并进行访问测试。

OpenShift_Redis.png

以下是登录到跳板虚拟服务器后,记录访问OpenShift Pod中Redis的操作。这个例子是为了验证目的而提供的,通常情况下会从容器内的编程语言进行访问。

# SSL-VPN経由 踏み台サーバーへログイン
$ ssh -i ~/key/takara3 root@10.212.5.223

# OCコマンドのダウンロード
# curl -L https://github.com/openshift/origin/releases/download/v3.11.0/openshift-origin-server-v3.11.0-0cbc58b-linux-64bit.tar.gz

# OCコマンドのインストール
root@virtualserver01:~# tar xzvf openshift-origin-server-v3.11.0-0cbc58b-linux-64bit.tar.gz 
root@virtualserver01:~# mv openshift-origin-server-v3.11.0-0cbc58b-linux-64bit /usr/local/bin
root@virtualserver01:~# export PATH=$PATH:/usr/local/bin/openshift-origin-server-v3.11.0-0cbc58b-linux-64bit

# OpenShiftへログイン
root@virtualserver01:~# oc login https://c100-e.jp-tok.containers.cloud.ibm.com:31473 --token=*****

# OpenShiftノードをリスト
root@virtualserver01:~# oc get node
NAME           STATUS    ROLES           AGE       VERSION
10.193.10.50   Ready     compute,infra   20m       v1.11.0+d4cacc0

# Ubuntuのポッドを起動して、redliに必要なプライベートのTLS証明書などを準備
root@virtualserver01:~# oc run -it ubuntu --image=maho/my-ubuntu:0.1 --restart=Never --rm -- bash
If you don't see a command prompt, try pressing enter.
root@ubuntu:/# apt-get update
root@ubuntu:/# apt install git golang
root@ubuntu:/# go get -u github.com/IBM-Cloud/redli
root@ubuntu:/# go install github.com/IBM-Cloud/redli
root@ubuntu:/# export PATH=$PATH:~/go/bin
root@ubuntu:/# export USERNAME=admin
root@ubuntu:/# export PASSWORD=newpassword123
root@ubuntu:~# cat - > cert.pem
-----BEGIN CERTIFICATE-----
MIIDHTCCAgWgAwIBAgIUFIO1EGeecAJjDhDdmSdOfCWPboYwDQYJKoZIhvcNAQEL
<中略>

# Redisへ接続して、データを読取りと更新
root@ubuntu:~# redli -u rediss://$USERNAME:$PASSWORD@3a3e43f3-5801-481a-9092-74dea6e33d69.c437f5ab8b3840e991a93dffcce078d.private.databases.appdomain.cloud:32297/0 --certfile ./cert.pem 
Connected to 4.0.10
> get key-a
"124"
> incr key-a
(integer) 125

总结

确认可以通过虚拟服务器和OpenShift集群上的Pod,通过IBM Cloud数据库的私有服务端点进行访问。

我明白,在网页界面上无法实现一些只能通过命令行来设置的项目,例如启用VRF或启用Redis实例的私有服务终端点等。因此,在进行设置时,需要仔细阅读文档。

广告
将在 10 秒后关闭
bannerAds