金鱼哥RHCA回忆录:CL210管理OPENSTACK网络--开放虚拟网络(OVN)简介(课后练习)
🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥🎈支持我:可点赞👍、可收藏⭐️、可留言📝
📜课本练习
-
部署具有公共访问权的实例。
-
创建安全组规则并检查OpenFlow流以获取安全策略。
-
检查DHCP的OpenFlow规则
-
查看OpenFlow中的路由表。
[student@workstation ~]$ lab networking-ovn setup
Setting up workstation for lab exercise work:
• Verifying project: finance.................................. SUCCESS
• Creating user env file: developer1-finance-rc............... SUCCESS
• Creating keypair: example-keypair........................... SUCCESS
. Creating flavor: default.................................... SUCCESS
. Creating image: rhel7....................................... SUCCESS
. Creating internal network: finance-network1................. SUCCESS
. Creating subnet: finance-subnet1............................ SUCCESS
. Creating external network: provider-datacentre.............. SUCCESS
. Creating router: finance-router1............................ SUCCESS
. Creating security group: default............................ SUCCESS
. Creating security group rule: SSH........................... SUCCESS
. Creating security group rule ICMP: icmp..................... SUCCESS
📑1.作为developer1用户,确认finance-network1存在,并检查网络的安全组规则。
[student@workstation ~]$ source developer1-finance-rc
[student@workstation ~(developer1-finance)]$ openstack network list -c ID -c Name
+--------------------------------------+---------------------+
| ID | Name |
+--------------------------------------+---------------------+
| 7a6556ab-6083-403e-acfc-79caf3873660 | finance-network1 |
| d55f6d1e-c29e-4825-8de4-01dd95f8a220 | provider-storage |
| fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 | provider-datacentre |
+--------------------------------------+---------------------+
[root@controller0 ~]# ovs-vsctl list open
_uuid : 6c237e8b-5014-42f1-9ac4-cc7728797597
bridges : [1d420f80-91e3-44ad-85ff-b311d90a7538, b1eb4d87-1b0b-4541-aca6-e9adefbe8172, b2474c7c-c50c-4a22-8826-f1f9233bf5ab, eb5acfd9-bc1c-444e-9045-8d48aa6d01c5, efed7252-c6fe-487c-a1bc-0b4e6ee9a6d3]
cur_cfg : 46
datapath_types : [netdev, system]
db_version : "7.15.1"
external_ids : {hostname="controller0.overcloud.example.com", ovn-bridge=br-int, ovn-bridge-mappings="datacentre:br-ex,vlanprovider1:br-eth3,vlanprovider2:br-eth4,storage:br-trunk", ovn-cms-options=enable-chassis-as-gw, ovn-encap-ip="172.24.2.1", ovn-encap-type=geneve, ovn-remote="tcp:172.24.1.50:6642", rundir="/var/run/openvswitch", system-id="85c87734-e866-4225-b305-471357c68b8a"}
iface_types : [geneve, gre, internal, lisp, patch, stt, system, tap, vxlan]
[root@controller0 ~]# export OVN_SB_DB=tcp:172.24.1.50:6642
[root@controller0 ~]# export OVN_NB_DB=tcp:172.24.1.50:6641
[root@controller0 ~]# ovn-nbctl ls-list
153db687-27fe-4f90-a3f0-2958c373dcc2 (neutron-7a6556ab-6083-403e-acfc-79caf3873660)
aca840be-670a-4eb3-9b36-4246c0eabb6c (neutron-9838d8ed-3e64-4196-87f0-a4bc59059be9)
b2cc3860-13f9-4eeb-b328-10dbc1f1b131 (neutron-d55f6d1e-c29e-4825-8de4-01dd95f8a220)
c5b32043-cd23-41ac-9197-ea41917870bb (neutron-e14d713e-c1f5-4800-8543-713563d7e82e)
f0f71887-2544-4f29-b46c-04b0aa0b2e52 (neutron-fc5472ee-98d9-4f6b-9bc9-544ca18aefb3)
[root@controller0 ~]# ovn-nbctl acl-list neutron-7a6556ab-6083-403e-acfc-79caf3873660
[root@controller0 ~]#
📑2. 在workstation终端上,作为developer1用户,创建一个名为finance-server1的新实例。
使用rhel7 镜像、默认风格、默认安全组和finance-network1网络。
[student@workstation ~(developer1-finance)]$ openstack server create --flavor default --image rhel7 --nic net-id=finance-network1 --security-group default --wait finance-server1
+-----------------------------+---------------------------------------------------------+
| Field | Value
+-----------------------------+---------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL
| OS-EXT-AZ:availability_zone | nova
| OS-EXT-STS:power_state | Running
| OS-EXT-STS:task_state | None
| OS-EXT-STS:vm_state | active
| OS-SRV-USG:launched_at | 2020-10-27T15:30:29.000000
| OS-SRV-USG:terminated_at | None
| accessIPv4 |
| accessIPv6 |
| addresses | finance-network1=192.168.1.5
| adminPass | 7we6VaXXezF7
| config_drive |
| created | 2020-10-27T15:29:57Z
| flavor | default (e04380ed-b027-4a72-a697-4307bc014b6c)
| hostId | c439f7c83de10e6a305fc9bc9caefdef52c9f503e4aa5733eae8573c
| id | e997cf6c-67a7-4947-935f-d56abce814a9
| image | rhel7 (6b0128a9-4481-4ceb-b34e-ffe92e0dcfdd)
| key_name | None
| name | finance-server1
| progress | 0
| project_id | 3c003f65d8d64914a053f178fbbf953c
| properties |
| security_groups | name='default'
| status | ACTIVE
| updated | 2020-10-27T15:30:29Z
| user_id | e4035d555f6b88cf42ca4cacb9fa9999dca9787392222d2eb0875e4e34e6d76f
| volumes_attached |
+-----------------------------+---------------------------------------------------------+
📑3. 在controller0上,重新检查finance-network1网络交换机的安全策略。
在workstation上,列出与安全组规则相匹配的OpenFlow流的默认安全组的安全组规则。将inport和ourport参数匹配到各自的OpenStack实体
[student@workstation ~(developer1-finance)]$ openstack port list -c ID -c 'Fixed IP Addresses'
+--------------------------------------+------------------------------------------------+
| ID | Fixed IP Addresses
+--------------------------------------+------------------------------------------------+
| 3ad5f966-f682-4bc7-9f1e-2662cc2d950d | ip_address='192.168.1.1', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
| 42671818-08d4-4a99-bd80-99a452ee40b3 | ip_address='192.168.1.2', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
| 71467c2e-0460-4514-a6ce-e5885e60ccb3 | ip_address='192.168.1.5', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
+--------------------------------------+------------------------------------------------+
[root@controller0 ~]# ovn-nbctl acl-list neutron-7a6556ab-6083-403e-acfc-79caf3873660
from-lport 1002 (inport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip4) allow-related
from-lport 1002 (inport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip4 && ip4.dst == {255.255.255.255, 192.168.1.0/24} && udp && udp.src == 68 && udp.dst == 67) allow
from-lport 1002 (inport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip6) allow-related
from-lport 1001 (inport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip) drop
to-lport 1002 (outport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip4 && ip4.src == $as_ip4_952467e9_b667_44ba_adb6_878c2e089308) allow-related
to-lport 1002 (outport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip4 && ip4.src == 0.0.0.0/0 && icmp4) allow-related
to-lport 1002 (outport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip4 && ip4.src == 0.0.0.0/0 && tcp && tcp.dst == 22) allow-related
to-lport 1002 (outport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip4 && ip4.src == 0.0.0.0/0 && tcp && tcp.dst == 443) allow-related
to-lport 1002 (outport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip4 && ip4.src == 0.0.0.0/0 && tcp && tcp.dst == 80) allow-related
to-lport 1002 (outport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip6 && ip6.src == $as_ip6_952467e9_b667_44ba_adb6_878c2e089308) allow-related
to-lport 1001 (outport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip) drop
[student@workstation ~(developer1-finance)]$ openstack security group rule list -f json
[
{
"IP Range": "0.0.0.0/0",
"Security Group": "952467e9-b667-44ba-adb6-878c2e089308",
"Port Range": "22:22",
"IP Protocol": "tcp",
"Remote Security Group": null,
"ID": "212e6328-edc5-4e54-ac11-6c7e18254328"
},
{
"IP Range": null,
"Security Group": "952467e9-b667-44ba-adb6-878c2e089308",
"Port Range": "",
"IP Protocol": null,
"Remote Security Group": null,
"ID": "24a91078-c261-4ec6-8f91-040044532cb1"
},
{
"IP Range": null,
"Security Group": "952467e9-b667-44ba-adb6-878c2e089308",
"Port Range": "",
"IP Protocol": null,
"Remote Security Group": "952467e9-b667-44ba-adb6-878c2e089308",
"ID": "40a2dbc0-2ec0-440d-b8df-ad69c6cedf0e"
},
{
"IP Range": "0.0.0.0/0",
"Security Group": "952467e9-b667-44ba-adb6-878c2e089308",
"Port Range": "443:443",
"IP Protocol": "tcp",
"Remote Security Group": null,
"ID": "6b8aa744-cd3a-449f-bdca-dc75d70b1621"
},
{
"IP Range": "0.0.0.0/0",
"Security Group": "952467e9-b667-44ba-adb6-878c2e089308",
"Port Range": "80:80",
"IP Protocol": "tcp",
"Remote Security Group": null,
"ID": "6de5bdd1-dc72-4c1c-af07-cd900c96ffa8"
},
{
"IP Range": null,
"Security Group": "952467e9-b667-44ba-adb6-878c2e089308",
"Port Range": "",
"IP Protocol": null,
"Remote Security Group": "952467e9-b667-44ba-adb6-878c2e089308",
"ID": "a6587b8a-4c6b-4b7c-a809-fb8da6fb8602"
},
{
"IP Range": null,
"Security Group": "952467e9-b667-44ba-adb6-878c2e089308",
"Port Range": "",
"IP Protocol": null,
"Remote Security Group": null,
"ID": "b125b62d-c9e0-44e6-a512-1b6da133f3cc"
},
{
"IP Range": "0.0.0.0/0",
"Security Group": "952467e9-b667-44ba-adb6-878c2e089308",
"Port Range": "",
"IP Protocol": "icmp",
"Remote Security Group": null,
"ID": "bcd0c999-dc5d-498c-8646-9c1faf9f5797"
}
]
📑4. 在finance-network1网络上创建第二个实例。在controller0节点上,列出安全规则流。
[student@workstation ~(developer1-finance)]$ openstack server create --flavor default --image rhel7 --nic net-id=finance-network1 --wait finance-server2
+-----------------------------+---------------------------------------------------------+
| Field | Value
+-----------------------------+---------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL
| OS-EXT-AZ:availability_zone | nova
| OS-EXT-STS:power_state | Running
| OS-EXT-STS:task_state | None
| OS-EXT-STS:vm_state | active
| OS-SRV-USG:launched_at | 2020-10-27T15:44:42.000000
| OS-SRV-USG:terminated_at | None
| accessIPv4 |
| accessIPv6 |
| addresses | finance-network1=192.168.1.12
| adminPass | bsPAZRuFfA89
| config_drive |
| created | 2020-10-27T15:43:59Z
| flavor | default (e04380ed-b027-4a72-a697-4307bc014b6c)
| hostId | 3eb57302ddddc3af1fdc763eee541c699f0866f6458e3b5c9a722611
| id | 7a9ee0f5-1869-418f-9ae7-117d08a44499
| image | rhel7 (6b0128a9-4481-4ceb-b34e-ffe92e0dcfdd)
| key_name | None
| name | finance-server2
| progress | 0
| project_id | 3c003f65d8d64914a053f178fbbf953c
| properties |
| security_groups | name='default'
| status | ACTIVE
| updated | 2020-10-27T15:44:42Z
| user_id | e4035d555f6b88cf42ca4cacb9fa9999dca9787392222d2eb0875e4e34e6d76f
| volumes_attached |
+-----------------------------+---------------------------------------------------------+
[student@workstation ~(developer1-finance)]$ openstack port list -c ID -c 'Fixed IP Addresses'
+--------------------------------------+------------------------------------------------+
| ID | Fixed IP Addresses
+--------------------------------------+------------------------------------------------+
| 3ad5f966-f682-4bc7-9f1e-2662cc2d950d | ip_address='192.168.1.1', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
| 42671818-08d4-4a99-bd80-99a452ee40b3 | ip_address='192.168.1.2', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
| 71467c2e-0460-4514-a6ce-e5885e60ccb3 | ip_address='192.168.1.5', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
| 9ce01db2-7b5d-4d3f-ac08-9541d7d8fbf1 | ip_address='192.168.1.12', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
+--------------------------------------+------------------------------------------------+
[root@controller0 ~]# ovn-nbctl acl-list neutron-7a6556ab-6083-403e-acfc-79caf3873660
…………
to-lport 1002 (outport == "9ce01db2-7b5d-4d3f-ac08-9541d7d8fbf1" && ip4 && ip4.src == $as_ip4_952467e9_b667_44ba_adb6_878c2e089308) allow-related
to-lport 1002 (outport == "9ce01db2-7b5d-4d3f-ac08-9541d7d8fbf1" && ip4 && ip4.src == 0.0.0.0/0 && icmp4) allow-related
to-lport 1002 (outport == "9ce01db2-7b5d-4d3f-ac08-9541d7d8fbf1" && ip4 && ip4.src == 0.0.0.0/0 && tcp && tcp.dst == 22) allow-related
to-lport 1002 (outport == "9ce01db2-7b5d-4d3f-ac08-9541d7d8fbf1" && ip4 && ip4.src == 0.0.0.0/0 && tcp && tcp.dst == 443) allow-related
to-lport 1002 (outport == "9ce01db2-7b5d-4d3f-ac08-9541d7d8fbf1" && ip4 && ip4.src == 0.0.0.0/0 && tcp && tcp.dst == 80) allow-related
to-lport 1002 (outport == "9ce01db2-7b5d-4d3f-ac08-9541d7d8fbf1" && ip6 && ip6.src == $as_ip6_952467e9_b667_44ba_adb6_878c2e089308) allow-related
to-lport 1001 (outport == "71467c2e-0460-4514-a6ce-e5885e60ccb3" && ip) drop
to-lport 1001 (outport == "9ce01db2-7b5d-4d3f-ac08-9541d7d8fbf1" && ip) drop
…………
📑5. 在workstation上,在provider-datacentre网络上创建一个浮动IP地址。将浮动IP连接到finance-server1。
使用openstack server list命令验证添加了浮动IP地址。
[student@workstation ~(developer1-finance)]$ openstack network list
+--------------------------------------+---------------------+--------------------------+
| ID | Name | Subnets
+--------------------------------------+---------------------+--------------------------+
| 7a6556ab-6083-403e-acfc-79caf3873660 | finance-network1 | 4836a9dd-e01f-4a33-a971-fa49dec9ffd5 |
| d55f6d1e-c29e-4825-8de4-01dd95f8a220 | provider-storage | 6e5af9b0-67ef-4e1e-9eda-7d6633091d11 |
| fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 | provider-datacentre | 30c03fa5-0897-426a-8c81-75cf9cc333f1 |
+--------------------------------------+---------------------+--------------------------+
[student@workstation ~(developer1-finance)]$ openstack floating ip create provider-datacentre
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| created_at | 2020-10-27T15:51:12Z |
| description | |
| fixed_ip_address | None |
| floating_ip_address | 172.25.250.107 |
| floating_network_id | fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 |
| id | 00799d8c-56cb-4c62-b238-1f5396231f66 |
| name | 172.25.250.107 |
| port_id | None |
| project_id | 3c003f65d8d64914a053f178fbbf953c |
| qos_policy_id | None |
| revision_number | 0 |
| router_id | None |
| status | DOWN |
| subnet_id | None |
| updated_at | 2020-10-27T15:51:12Z |
+---------------------+--------------------------------------+
[student@workstation ~(developer1-finance)]$ openstack server add floating ip finance-server1 172.25.250.107
[student@workstation ~(developer1-finance)]$ openstack server list -c ID -c Name -c Networks
+--------------------------------------+-----------------+------------------------------+
| ID | Name | Networks
+--------------------------------------+-----------------+------------------------------+
| 7a9ee0f5-1869-418f-9ae7-117d08a44499 | finance-server2 | finance-network1=192.168.1.12
| e997cf6c-67a7-4947-935f-d56abce814a9 | finance-server1 | finance-network1=192.168.1.5, 172.25.250.107
+--------------------------------------+-----------------+------------------------------+
📑6. 在controller0上,列出用于路由的OpenFlow流,并查看finance-network1网络交换机的路由表。
在controller0上,使用ovn-nbctl show命令来显示向北数据库内容的简要概述。。
在controller0上,使用ovn-sbctl lflow-list命令列出流。找到finance-server1的SNAT和DNAT流。找到路由流的最简单方法是将ovn-sbctl命令的输出重定向到一个文件。打开文件并使用搜索功能。请注意,浮动IP地址和内部IP地址都有OpenFlow规则。
[root@controller0 ~]# ovn-sbctl lflow-list > flow.txt
[root@controller0 ~]# less flow.txt
table=3 (lr_in_unsnat ), priority=100 , match=(ip && ip4.dst == 172.25.250.106 && inport == "l
rp-c88f518d-fac0-448f-9876-a40f469b00e9" && is_chassis_resident("cr-lrp-c88f518d-fac0-448f-9876-a40f469
b00e9")), action=(ct_snat;)
table=3 (lr_in_unsnat ), priority=100 , match=(ip && ip4.dst == 172.25.250.107 && inport == "l
rp-c88f518d-fac0-448f-9876-a40f469b00e9"), action=(ct_snat;)
………..
table=4 (lr_in_dnat ), priority=100 , match=(ip && ip4.dst == 172.25.250.107 && inport == "l
rp-c88f518d-fac0-448f-9876-a40f469b00e9"), action=(ct_dnat(192.168.1.5);)
table=4 (lr_in_dnat ), priority=50 , match=(ip && ip4.dst == 172.25.250.107), action=(reg9[
0] = 1; next;)
table=4 (lr_in_dnat ), priority=0 , match=(1), action=(next;)
………
table=0 (lr_out_undnat ), priority=100 , match=(ip && ip4.src == 192.168.1.5 && outport == "lrp
-c88f518d-fac0-448f-9876-a40f469b00e9"), action=(eth.src = fa:16:3e:85:3b:1b; ct_dnat;)
table=0 (lr_out_undnat ), priority=0 , match=(1), action=(next;)
table=1 (lr_out_snat ), priority=33 , match=(ip && ip4.src == 192.168.1.5 && outport == "lrp
-c88f518d-fac0-448f-9876-a40f469b00e9"), action=(eth.src = fa:16:3e:85:3b:1b; ct_snat(172.25.250.107);)
从上一步使用的SNAT或DNAT提取中,注意finance-server1使用的lrp inport和outport。在controller0上,使用ovn-nbctl show命令列出向北的数据库的内容。
[root@controller0 ~]# ovn-nbctl show
switch f0f71887-2544-4f29-b46c-04b0aa0b2e52 (neutron-fc5472ee-98d9-4f6b-9bc9-544ca18aefb3) (aka provider-datacentre)
port provnet-fc5472ee-98d9-4f6b-9bc9-544ca18aefb3
type: localnet
addresses: ["unknown"]
port c88f518d-fac0-448f-9876-a40f469b00e9
type: router
router-port: lrp-c88f518d-fac0-448f-9876-a40f469b00e9
port d3a97fff-95de-447c-a962-01b43e0299de
type: localport
addresses: ["fa:16:3e:dc:ab:47"]
📑7. 显示finance-router1的路由表。
[student@workstation ~(developer1-finance)]$ openstack router list -c ID -c Name
+--------------------------------------+-----------------+
| ID | Name |
+--------------------------------------+-----------------+
| e05522ef-8a15-4b7d-87d5-50506144b76b | finance-router1 |
+--------------------------------------+-----------------+
[root@controller0 ~]# ovn-nbctl lr-list
adedf86a-aa9d-443d-9b2b-14698a3cf9fa (neutron-e05522ef-8a15-4b7d-87d5-50506144b76b)
[root@controller0 ~]# ovn-nbctl lr-nat-list neutron-e05522ef-8a15-4b7d-87d5-50506144b76b
TYPE EXTERNAL_IP LOGICAL_IP EXTERNAL_MAC LOGICAL_PORT
dnat_and_snat 172.25.250.107 192.168.1.5 fa:16:3e:85:3b:1b 71467c2e-0460-4514-a6ce-e5885e60ccb3
snat 172.25.250.106 192.168.1.0/24
[student@workstation ~(developer1-finance)]$ openstack port list -c ID -c 'Fixed IP Addresses'
+--------------------------------------+------------------------------------------------+
| ID | Fixed IP Addresses
+--------------------------------------+------------------------------------------------+
| 3ad5f966-f682-4bc7-9f1e-2662cc2d950d | ip_address='192.168.1.1', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
| 42671818-08d4-4a99-bd80-99a452ee40b3 | ip_address='192.168.1.2', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
| 71467c2e-0460-4514-a6ce-e5885e60ccb3 | ip_address='192.168.1.5', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
| 9ce01db2-7b5d-4d3f-ac08-9541d7d8fbf1 | ip_address='192.168.1.12', subnet_id='4836a9dd-e01f-4a33-a971-fa49dec9ffd5' |
+--------------------------------------+------------------------------------------------+
📑8. 在controller0上,使用ovn-sbctl命令列出逻辑流。将输出重定向到一个名为dhcp. txt文件。
查找ls_in_dhcp_options、ls_in_dhcp_response和put_dhcp_opts选择finance-server1的选项。
[root@controller0 ~]# ovn-sbctl lflow-list > dhcp.txt
[root@controller0 ~]# egrep 'ls_in_dhcp_options|ls_in_dhcp_response|put_dhcp_opts|192.168.1.5' dhcp.txt
📑清除实验
[student@workstation ~]$ lab networking-ovn cleanup
💡总结
RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。
以上就是【金鱼哥】对 第六章 管理OPENSTACK网络–开放虚拟网络(OVN)简介 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。
如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!
- 点赞
- 收藏
- 关注作者
评论(0)