Power Systems 通过传输 VPC 进行通信
本教程可能会发生成本。 使用 成本估算器 根据您的预计使用量生成成本估算。
IBM® Power® Virtual Server 可以托管 Power Virtual Server 实例。 IBM Cloud 还支持 Virtual Private Cloud (VPC)。Power Virtual Server 可以通过 IBM Cloud® Transit Gateway 连接到 VPC 并访问 VPC 资源。 本教程将指导您完成示例实现,并探索此高级视图中描述的体系结构:
- 传输 VPC 和子资源 (例如,虚拟服务器实例)。
- VPC 虚拟专用端点网关 (VPE) 用于访问云服务实例,例如 Object Storage。
- Transit Gateway 已连接到传输 VPC 和辐条。
- VPN for VPC 传输 VPC 与企业网络之间的连接。
- 具有 Power Edge Router (PER) 的区域中的 Power Virtual Server 可以通过连接的 Transit Gateway访问所有内容。
本教程是关于通过 VPC Transit Hub 和 Spoke 体系结构进行集中通信的两部分教程中的独立但概念上的层。 在基础教程中深入了解 VPC: 第一部分 和 第二部分。
目标
- 了解 Power Virtual Server 联网背后的概念。
- 利用 IBM Cloud Transit Gateway 将 Power Virtual Server 连接到 VPC。
- 通过 VPC 站点到站点 VPN 将 Power Virtual Server 流量路由到本地。
- 通过 VPC 虚拟专用端点网关将 Power Virtual Server 实例连接到服务。
- 利用 DNS 服务路由和转发规则,构建架构完善的名称解析系统。
- 使用 VPC 虚拟专用端点网关来安全地访问云服务。
准备工作
本教程需要支持 Power Edge Routing (PER) 的 Power Virtual Server 数据中心。 请参阅 Power Edge Router 入门,以获取更多信息,包括解决方案可用的数据中心列表。
本教程需要:
-
使用基础架构作为代码来供应资源的 Terraform
-
Python (可选) 运行 pytest 命令
-
配套 GitHub 存储库 中的先决条件
请参阅 先决条件 以获取一些选项,包括用于构建先决条件环境的 Dockerfile。
此外,请检查用户许可权。 请确保您的用户帐户具有足够的许可权来创建和管理本教程中的所有资源。 请参阅以下列表:
- VPC 的必需许可权。
- 创建 Transit Gateway 所需的许可权。
- Power Virtual Server 的必需许可权。
供应资源
-
配套 GitHub Repository 具有用于实现体系结构的源文件。 在桌面 shell 中,克隆存储库:
git clone https://github.com/IBM-Cloud/vpc-transit cd vpc-transit
-
config_tf 目录需要文件 terraform.tfvars。 文件 template.power.terraform.tfvars 是本教程的起点。
cp config_tf/template.power.terraform.tfvars config_tf/terraform.tfvars
-
编辑 config_tf/terraform.tfvars。 使用该文件中的注释作为您的指南。 更改现有 resource_group_name 和 basename 的值。 以下文本中的字符串 $BASENAME 指的是此处提供的基本名称。
-
可以一次供应一个层的体系结构。 提供了 shell 命令 ./apply.sh 以按顺序安装层。 以下内容显示了帮助:
./apply.sh
-
如果您还没有,请获取 一个平台API密钥,并导出API密钥供Terraform使用:
export IBMCLOUD_API_KEY=YourAPIKEy
-
安装所有层。 ":" 字符用于表示第一层和最后一层。
./apply.sh : :
最多需要 30 分钟才能在图中创建资源。 使用 VPC 模拟企业。
检查非重叠 IP 地址布局
地址布局如下所示。 请注意非重叠地址。
声明:
- 可用性区域地址空间
10.1.0.0/16
用于 dal10中的 VPC 可用性区域 1 和 Power Virtual Server 工作空间。 - 企业,传输和 spoke0 的地址空间不重叠。
- 传输 VPC 中的本地地址前缀用于通过 Transit Gateway宣传企业路径。 在内部部署前缀的传输 VPC 中未创建任何子网。 下面的“调查 Transit Gateway”步骤对此进行了讨论。
在 IBM Cloud 控制台中探索体系结构:
验证 SSH 密钥
- 供应为 SSH 所需的密钥对的每个成员创建了两个文件:
- config_tf/id_rsa-应保持安全的专用密钥。
- config_tf/id_rsa.pub-可提供给第三方的公用密钥。
- 公用密钥用于在云中创建两个 SSH 密钥:
- 电源 SSH 密钥。
- VPC 的 SSH 密钥。
- 找到 VPC SSH 密钥:
- 浏览至 VPC 的 SSH 密钥。
- 请注意带有 $BASENAME 的 SSH 密钥。
- 找到 Power SSH 密钥:
- 浏览至 Power SSH 密钥。
- 在左侧导航面板上,从包含 $BASENAME 的词 工作空间 下方的下拉列表中选择工作空间。
- 请注意带有 $BASENAME 的 SSH 密钥。
(可选) 验证云 SSH 密钥的内容是否与公用密钥文件的内容匹配。
打开 Power® Virtual Server 工作区
与 SSH 密钥一起,供应创建了 Power® Virtual Server 工作空间,子网和实例。
- 打开“Power 虚拟服务器子网”页面。
- 在左侧导航面板上,从包含 $BASENAME 的词 工作空间 下方的下拉列表中选择工作空间。
- 单击左侧 联网 菜单中的 子网 (如果需要),并注意到已创建的公用和专用子网。
- 单击专用子网名称,并注意稍后将在实例的 IP 表配置中引用的 网关 地址。
- 单击公用子网名称,并注意稍后将在实例的 IP 表配置中引用的 网关 地址。
- 单击左侧的 虚拟服务器实例,并注意随公共 IP 地址和专用 IP 地址一起供应的实例。
配置虚拟服务器
Terraform 配置创建了 Power Virtual Server Linux 虚拟服务器实例,但无法完全配置。 现在可以配置 IP 路由表并安装 NGINX 服务器以支持测试。
cd power_tf; # should be in the .../vpc-transit/power_tf directory
terraform output fixpower
此体验如下所示:
% cd power_tf
% terraform output fixpower
[
{
"abc-spoke1" = <<-EOT
# ssh -J root@52.116.131.48 root@10.1.2.31
ssh -oProxyCommand="ssh -W %h:%p -i ../config_tf/id_rsa root@52.116.131.48" -i ../config_tf/id_rsa root@10.1.2.31
ip route add 10.0.0.0/8 via 10.1.2.1 dev eth0
ip route add 172.16.0.0/12 via 10.1.2.1 dev eth0
ip route add 192.168.0.0/16 via 10.1.2.1 dev eth0
ip route change default via 192.168.232.1 dev eth1
exit
# it is now possible to ssh directly to the public IP address
ssh -i ../config_tf/id_rsa root@150.240.147.36
# execute the rest of these commands to install nginx for testing
zypper install -y nginx
systemctl start nginx
echo abc-spoke1 > /srv/www/htdocs/name
sleep 10
curl localhost/name
EOT
},
]
在新的终端窗口中,一次复制并粘贴一行命令。 以下是正在发生的情况:
- SSH 命令使用先前创建的专用 SSH 密钥登录到虚拟服务器实例。 需要通过中间传输 VPC 虚拟服务器 跳转。 -oProxyCommand 配置跳转服务器。
- ip route 命令在 PowerLinux 服务器上通过专用子网 (eth0) 路由所有 专用网络 CIDR 块。 请注意,这包括
10.0.0.0
云 CIDR 块和192.168.0.0
企业 CIDR 块。 - 缺省值通过公共子网 (eth1) 来路由其余地址,包括工作站的 IP 地址。 这允许测试自动化在将来直接 SSH 到虚拟服务器实例的公共 IP 地址,并避免跳转服务器。
- 退出 SSH 会话。
- 使用 SSH 直接使用公共 IP 地址登录到实例。 这将验证 iptable 配置是否正确。
- 最后一步是安装 NGINX。 NGINX HTTP,用于托管使用
curl
命令验证的网页。
您可以使此 shell 在将来的步骤中可用。
测试网络连接
pytest 测试套件用于详尽地测试通信路径。
读者不需要使用 pytest 来验证结果。 通过手工但乏味地复制下面显示的测试结果是直向前的。 对于示例输出的每一行,在 IBM Cloud 控制台的“资源”视图中查找资源,浏览到左侧资源,然后找到 SSH 会话的公共 IP 地址。 使用云实例的 shell,对右侧实例的专用 IP 地址运行 curl
命令: curl A.B.C.D/name
。
有几种方法可以安装和使用 python,如 README.md中所述。
每个 pytest 测试 SSH 到左侧的实例,并执行连接测试,如对右侧的实例运行 curl
命令。 缺省 SSH 环境用于登录到左侧的实例。 如果看到意外的测试结果,请尝试 pytest 故障诊断 部分。
确保当前目录为 vpc-Transit。
cd ..
pwd; # .../vpc-transit
使用 pytest 测试网络连接:
pytest
示例输出:
(vpc-transit) IBM-Cloud/vpc-transit % pytest
============================================ test session starts =============================================
platform darwin -- Python 3.11.5, pytest-7.4.4, pluggy-1.3.0 -- /Users/powellquiring/github.com/IBM-Cloud/vpc-transit/venv/bin/python
cachedir: .pytest_cache
rootdir: /Users/powellquiring/github.com/IBM-Cloud/vpc-transit
configfile: pytest.ini
testpaths: py
plugins: xdist-3.5.0
collected 31 items
py/test_transit.py::test_ping[l-spoke0 -> r-spoke0] PASSED [ 3%]
py/test_transit.py::test_ping[l-spoke0 -> r-enterprise-z1-worker] PASSED [ 6%]
py/test_transit.py::test_ping[l-spoke0 -> r-transit-z1-worker] PASSED [ 9%]
py/test_transit.py::test_ping[l-enterprise-z1-worker -> r-spoke0] PASSED [ 12%]
py/test_transit.py::test_ping[l-enterprise-z1-worker -> r-enterprise-z1-worker] PASSED [ 16%]
py/test_transit.py::test_ping[l-enterprise-z1-worker -> r-transit-z1-worker] PASSED [ 19%]
py/test_transit.py::test_ping[l-transit-z1-worker -> r-spoke0] PASSED [ 22%]
py/test_transit.py::test_ping[l-transit-z1-worker -> r-enterprise-z1-worker] PASSED [ 25%]
py/test_transit.py::test_ping[l-transit-z1-worker -> r-transit-z1-worker] PASSED [ 29%]
py/test_transit.py::test_curl[l-spoke0 -> r-spoke0] PASSED [ 32%]
py/test_transit.py::test_curl[l-spoke0 -> r-enterprise-z1-worker] PASSED [ 35%]
py/test_transit.py::test_curl[l-spoke0 -> r-transit-z1-worker] PASSED [ 38%]
py/test_transit.py::test_curl[l-enterprise-z1-worker -> r-spoke0] PASSED [ 41%]
py/test_transit.py::test_curl[l-enterprise-z1-worker -> r-enterprise-z1-worker] PASSED [ 45%]
py/test_transit.py::test_curl[l-enterprise-z1-worker -> r-transit-z1-worker] PASSED [ 48%]
py/test_transit.py::test_curl[l-transit-z1-worker -> r-spoke0] PASSED [ 51%]
py/test_transit.py::test_curl[l-transit-z1-worker -> r-enterprise-z1-worker] PASSED [ 54%]
py/test_transit.py::test_curl[l-transit-z1-worker -> r-transit-z1-worker] PASSED [ 58%]
py/test_transit.py::test_curl_dns[l-spoke0 -> r-abc-enterprise-z1-worker.abc-enterprise.example.com] PASSED [ 61%]
py/test_transit.py::test_curl_dns[l-spoke0 -> r-abc-transit-z1-worker.abc-transit.example.com] PASSED [ 64%]
py/test_transit.py::test_curl_dns[l-enterprise-z1-worker -> r-abc-enterprise-z1-worker.abc-enterprise.example.com] PASSED [ 67%]
py/test_transit.py::test_curl_dns[l-enterprise-z1-worker -> r-abc-transit-z1-worker.abc-transit.example.com] PASSED [ 70%]
py/test_transit.py::test_curl_dns[l-transit-z1-worker -> r-abc-enterprise-z1-worker.abc-enterprise.example.com] PASSED [ 74%]
py/test_transit.py::test_curl_dns[l-transit-z1-worker -> r-abc-transit-z1-worker.abc-transit.example.com] PASSED [ 77%]
py/test_transit.py::test_vpe_dns_resolution[cos spoke0 -> transit s3.direct.us-south.cloud-object-storage.appdomain.cloud] PASSED [ 80%]
py/test_transit.py::test_vpe_dns_resolution[cos enterprise-z1-worker -> transit s3.direct.us-south.cloud-object-storage.appdomain.cloud] PASSED [ 83%]
py/test_transit.py::test_vpe_dns_resolution[cos transit-z1-worker -> transit s3.direct.us-south.cloud-object-storage.appdomain.cloud] PASSED [ 87%]
py/test_transit.py::test_vpe[cos spoke0 -> transit s3.direct.us-south.cloud-object-storage.appdomain.cloud] PASSED [ 90%]
py/test_transit.py::test_vpe[cos enterprise-z1-worker -> transit s3.direct.us-south.cloud-object-storage.appdomain.cloud] PASSED [ 93%]
py/test_transit.py::test_vpe[cos transit-z1-worker -> transit s3.direct.us-south.cloud-object-storage.appdomain.cloud] PASSED [ 96%]
py/test_transit.py::test_lb[lb0] SKIPPED (got empty parameter set ['lb'], function test_lb at /Use...) [100%]
======================================= 30 passed, 1 skipped in 42.36s =======================================
每个测试 SSH 都指向箭头 "->" 左侧的实例,并通过以下方式访问箭头的右侧:
test_ping
-Ping IP 地址。test_curl
- Curl IP 地址。test_curl_dns
- Curl DNS 名称。test_vpe_dns_resolution
-验证 VPC 虚拟专用端点 (VPE) 名称 DNS 名称是否解析为云的 CIDR 块中的 IP 地址 (此测试实际上不会访问右侧)。test_vpe
-根据需要使用 DNS 名称和特定于资源的工具来锻炼资源。
除此配置中跳过的负载均衡器 (lb) 测试外,所有测试都应通过。
调查 Transit Gateway
此图具有一条绿色线条,显示从 Power 实例到企业实例的流量路径:
{: caption="企业数据供电" caption-side="bottom"}
检查传输 Transit Gateway:
- 打开 Transit Gateway,然后选择 $BASENAME-tgw。
- 有两个连接:
- 运输 VPC。
- Spoke0 (Power Systems Virtual Server).
- 单击 BGP 和 生成报告。 企业 CIDR
192.168.0.0/24
由中转 VPC 发布广告。
为何在传输 VPC 中使用本地地址前缀?
VPC 地址前缀路由通过 Transit Gateway发布。 传输 VPC 地址前缀 10.1.15.0/24
已发布,并允许 Power® Virtual Server 将流量路由到传输 VPC 中的资源。 传输 VPC 中的本地地址前缀 192.168.0.0/24
允许 Power® Virtual Server 将此范围的流量路由到传输 VPC。 请参阅 基于策略的入口路由集成。
了解通过传输 VPC 的 Power 到企业数据路径
上一步演示了 Transit Gateway 如何在发送到企业 IP 地址 (例如 192.168.0.4
) 时了解 Power 实例访问传输 VPC 所需的企业路径。 传输 VPC 中的 VPC 入口路由将流量直接路由到 VPN 实例。
- 浏览至 虚拟私有云。
- 单击左侧的 VPC。
- 单击传输 VPC。
- 向下滚动并单击 管理路由表。
- 单击 vpn-ingress 路由表。
在 流量 框中,接受来自 的路由指示 VPN 网关。 此配置允许 VPN 网关在此路由表中自动创建路由“并”根据需要调整路由的下一个中继段地址。
可以在 路由 表中找到此路由的当前状态。 它指示寻址到 192.168.0.0/24 的流量将转发到 VPC 中的 下一中继段 地址。 请注意下一个中继段 IP 地址。 您可以在 VPC VPN 服务中找到该服务。
- 浏览至 VPN 并选择传输 VPN 网关。
- 检查 网关成员 部分。 活动 IP 的 专用 IP 应该与先前记录的 下一个中继段 匹配。
为确保高可用性,VPN 服务使 下一中继段 IP 地址与可用 VPN 资源的活动 IP 地址保持一致!
验证 Power DNS 解析
此图具有蓝色线条,显示 Power® Virtual Server 实例所使用的 DNS 解析正向链。
下面显示的 $BASENAME 是 abc
; 在您自己的 $BASENAME 中替换。 在 Power® Virtual Server 实例 shell 中:
abc-spoke0:~ # BASENAME=abc
abc-spoke0:~ # dig abc-enterprise-z1-worker.$BASENAME-enterprise.com
; <<>> DiG 9.16.44 <<>> abc-enterprise-z1-worker.abc-enterprise.com
;; global options: +cmd
;; Got answer:
...
;; ANSWER SECTION:
abc-enterprise-z1-worker.abc-enterprise.com. 2454 IN A 192.168.0.4
...
curl 命令从企业返回数据:
curl $BASENAME-enterprise-z1-worker.$BASENAME-enterprise.com/name
示例:
abc-spoke0:~ # curl $BASENAME-enterprise-z1-worker.$BASENAME-enterprise.com/name
abc-enterprise-z1-worker
可以验证蓝线上显示的 DNS 转发路径。 首先查找正在解析地址的 DNS 服务器:
- 浏览至 Power Systems Virtual Server,然后选择工作空间。
- 单击左侧的 子网。
- 单击专用子网。
- 其中一个 DNS 服务器 是
10.1.15.xy
。 请记下确切的 IP。
这是 DNS Services 定制解析器 的地址。 地址的初始位 10.1.15
指示它在传输 VPC 中。 找到 DNS 实例和定制解析器:
- 浏览至 资源列表。
- 打开 联网 部分,然后单击 DNS 服务的传输实例。
- 在传输 DNS 实例中,单击左侧的 定制解析器。
- 点击自定义解析器,打开详情页面。
将先前记录的 DNS 服务器 IP 地址 (在电源专用子网中找到) 与 解析器位置 IP 地址匹配。
该图显示了从此 DNS 解析器到企业网络的箭头。 通过遵循转发规则来验证此情况:
- 单击顶部的 转发规则 选项卡。
- 请注意,$BASENAME-enterprise.com 子域的转发规则将转发给具有
192.168.0.xy
地址的企业解析器。 这些是企业中 DNS 解析器的 IP 地址。 您可以通过在“资源”列表中查找企业的 DNS 服务来验证这些服务。
了解 VPC 虚拟专用端点网关
IBM Cloud VPE for VPC 使您能够使用从 VPC 中的子网分配的所选 IP 地址从 VPC 网络连接到受支持的 IBM Cloud 服务。 已供应 Object Storage。 供应 Object Storage 的 VPE for VPC 时,将在 DNS 服务中创建 DNS 记录。 在传输 VPC 中查找 Object Storage 的 DNS 名称:
- 浏览至 VPC 虚拟专用端点网关。
- 选择 $BASENAME-Transit-cos VPC 虚拟专用端点网关。
- 记下附加的资源 IP 地址。 它
10.1.15.x
位于传输 VPC 区域 1 中。 - 请注意 服务端点。 它是特定于区域的: s3.direct.us-south.cloud-object-storage.appdomain.cloud。
在 Power® Virtual Server 实例 shell 中,使用带有 DNS 名称的 dig
命令来查找 IP 地址。 下面是一个例子(简略):
abc-spoke0:~ # dig s3.direct.us-south.cloud-object-storage.appdomain.cloud
; <<>> DiG 9.16.44 <<>> s3.direct.us-south.cloud-object-storage.appdomain.cloud
...
;; ANSWER SECTION:
s3.direct.us-south.cloud-object-storage.appdomain.cloud. 900 IN A 10.1.15.132
...
在本例中,10.1.15.132 是 Object Storage 通过虚拟专用端点网关的 IP 地址。
实施 VPC 安全性
VPC 具有针对子网的网络访问控制表 (ACL)] (/docs/vpc?topic=vpc-using-acls) 和针对可配置为限制对网络资源的访问的网络接口的 安全组。
引入安全组规则以限制仅从 Power Virtual Server 实例访问 VPC 虚拟专用端点网关。
在 Power® Virtual Server 实例 shell 中,使用 curl
命令访问传输 VPC 中的 VPC 实例:
BASENAME=abc
curl $BASENAME-transit-z1-worker.$BASENAME-transit.com/name
找到安全组并收紧规则。
- 浏览至 VPC 的虚拟服务器实例。
- 单击转移实例。
- 向下滚动到 网络接口,然后单击 安全组中的条目。
- 单击“安全组”属性页面中的 规则 选项卡。
- 找到
10.0.0.0/8
源。 单击右侧的汉堡菜单,然后单击 编辑。 - 临时将 CIDR 更改为
10.0.0.0/32
。
返回到 Power® Virtual Server 实例 shell 中,重复 curl
命令。 命令未完成:
curl $BASENAME-transit-z1-s0.$BASENAME-transit.com/name
确定 shell 中的 IP 地址:
hostname -I
示例:
abc-spoke0:~ # hostname -I
10.1.0.37 192.168.230.234
第一个 10.1.0.x
号是专用 IP 地址。 返回到浏览器的 VPC 安全组选项卡,编辑安全组规则并将其更改为 address/32
(例如,10.1.0.37/32
)。
请重试 curl
,它应该有效。
curl $BASENAME-transit-z1-s0.$BASENAME-transit.com/name
返回到安全组规则中,将 CIDR 块更改回原始值 10.0.0.0/8
。
除去资源
使用 ./apply.sh
命令以逆向顺序运行所有目录中的 terraform destroy
:
./apply.sh -d : :
扩展教程
您的体系结构可能与所提供的体系结构不同,但可能是从此处讨论的基本组件构造的。 展开本教程的构想:
- 使用 VPC 负载均衡器](/docs/openshift?topic=openshift-vpclb-about) 来平衡多个 Power Virtual Server例之间的流量。
- 使用 IBM Cloud® Internet Services 集成入局公共因特网访问。
- 在传输中添加 Flow Logs for VPC capture。
- 将每个辐条放在 企业 中的单独帐户中。