VPC Access Connector 介绍 - 让 Non-VPC product 也可以访问VPC Network内的资源

什么是VPC product 和 非 VPC product

在GCP 上, VPC product 指的是属于某个制定的vpc subnet, 具有至少1个 该 subnet 的内网ip的产品
常见的例如:

  1. compute engine / MIG (managed instances group)
  2. 某些dataflow job (指定了 可选参数subnet )
  3. Cloud Composer (基于airflow)

而 Non VPC product 通常是1个共用产品和 server less 的平台,
例如:
4. Cloud Run
5. Pubsub
6. BigQuery

又 VPC product 去访问 Non VPC product 是很简单的, 因为Non VPC product 都具有1个可以由任何地方访问的google 的domain Name.

例如Pubsub 的topic url:
https://pubsub.googleapis.com/v1/projects/jason-hsbc/topics/TopicA:publish

而由 Non VPC product 去访问 VPC product 并不简单, 就如外网和内网的关系, 外网无法通过内网的ip 去访问内网的资源

而VPC Access/Connector 就是为了解决这个问题而存在的

本文会用cloud run的service 作为例子



场景介绍

1个mysql instance 部署在了1一台vm
vm 名字: tf-vpc0-subnet0-mysql0
所属subnet: vpc0-subnet0
内网ip: 192.168.0.51

但是这种情况下, 我家里的电脑的应用是不能直接访问这个mysql instance的。

为了解决这个问题, 我在另1个有外网ip的vm主机设置了1个 sqlproxy , 反向代理了这个mysql instance.
具体参考:
使用 proxySQL 来代理 Mysql

所以对于这个mysql instance
它是具有两个ip的
1个是内网ip 192.168.0.51
1个是外网ip 34.39.2.90

这样我家里的电脑就可以访问这个mysql instance



让spring boot service 可以return 当前的db instance

利用actuator 库, 让/info 接口return db的连接信息:

@Component
@Slf4j
public class AppVersionInfo implements InfoContributor {

    @Value("${pom.version}") // https://stackoverflow.com/questions/3697449/retrieve-version-from-maven-pom-xml-in-code
    private String appVersion;

    @Autowired
    private String hostname;

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Override
    public void contribute(Info.Builder builder) {
        log.info("AppVersionInfo: contribute ...");
        builder.withDetail("app", "Cloud User API")
                .withDetail("version", appVersion)
                .withDetail("hostname",hostname)
                .withDetail("dbUrl", dbUrl)
                .withDetail("description", "This is a simple Spring Boot application to demonstrate the use of BigQuery in GCP.");
    }
}

测试:

[gateman@manjaro-x13 gnome-shell]$ curl 127.0.0.1:8080/actuator/info
{"app":"Cloud User API","version":"0.0.1","hostname":"manjaro-x13","dbUrl":"jdbc:mysql://34.39.2.90:6033/demo_cloud_user?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true","description":"This is a simple Spring Boot application to demonstrate the use of BigQuery in GCP."}
[gateman@manjaro-x13 gnome-shell]$

本地是只能通过外网ip 来连接



让cloud Run service 也通过外网ip 来连接mysql

的确, 这个解决方案是可行的

我也测试过, 当部署service 到cloud run之后, 通过/info api返回的信息来看, service 的确能成功连接到mysql

[gateman@manjaro-x13 gnome-shell]$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://demo-cloud-user-7hq3m4pdya-nw.a.run.app/actuator/info
{"app":"Cloud User API","version":"0.0.1","hostname":"localhost","dbUrl":"jdbc:mysql://34.39.2.90:6033/demo_cloud_user?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true","description":"This is a simple Spring Boot application to demonstrate the use of BigQuery in GCP."}
[gateman@manjaro-x13 gnome-shell]$

但是这个方案有个缺点, 我家里电脑用外网ip 连接mysql 是没办法, 但是在GCP 上, 1个service 通过外网ip连接另1个service不是1个好选择

  1. 流量走了外网, 性能更慢, 收费更贵
  2. 安全问题

所以 Cloud Run的service 在生产上一般是要求用内网ip来访问内网的资源的



让cloud Run service 尝试通过内网ip 连接mysql

by default , 肯定是连不上的, 本文一开始讲过了

在这里插入图片描述


创建1个vpc connector

terraform 脚本:

resource "google_vpc_access_connector" "connector" {
  name          = "vpc-con"
  network = google_compute_network.tf-vpc0.id # for the network where the connector will be created
  machine_type = "e2-micro" # machine type for the connector
  region = "europe-west2"
  ip_cidr_range = "192.168.100.0/28" # means the connector will use created vms in this range
                                     # should not overlap with the sub network's ip range
}

referring:
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/vpc_access_connector

值得注意的参数

  1. network – 就是这个vpc connector 可以指向的vpc network了, 对于本文例子来讲就是 mysql 所在的vm 所在的 vpc subnet 所在的 vpc network
  2. machine_type – 明显这个vpc connector 背后还是要消耗一些24小时开机的vm, 如果是学习和测试目的, 选择最新规格的vm 类型就好, 如果是生产环境当让要看流量来选择了!
  3. ip_cidr_range – 因为每1个vpc connector 都是高可用的, 代表它实际上是1个vm group, 所以需要一些预留ip地址, 这个ip地址必须在对应的vpc-network内, 但不能与subnet 的ip range 重合。 而且必须用/28 结尾

在本文例子中
tf-vpc0 这个vm 已经有两个subnet
分别是:
tf-vpc0-subnet0: 192.168.0.0/24
tf-vpc0-subnet1: 192.168.1.0/24

所以这里的 ip_cidr_range 不能在 192.168.0.xxx ~ 192.168.1.xxx 内
我直接选择 192.168.100.0/28 了

创建成功后
UI 上见到的details 是这样的
在这里插入图片描述
可见, 最小都要占用2台 vm, 能自动扩展成3台, 当然这个2 和3 都是可以在terraform 里配置的



在Cloud run的deploy 脚本上加上vpc connector 的参数

cloud build的脚本:

steps:
  - id: run maven package
    name: maven:3.9.6-sapmachine-17 # https://hub.docker.com/_/maven
    entrypoint: mvn
    args: ['package', '-Dmaven.test.skip=true']

  # https://cloud.google.com/build/docs/configuring-builds/substitute-variable-values
  - id: build docker image
    name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/${_APP_NAME}', '.']

  - id: upload docker image to GAR
    name: 'gcr.io/cloud-builders/docker'
    args: [ 'push', 'europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/${_APP_NAME}']

  # deploy to Cloud run
  - id: deploy image to cloud run
    name: 'gcr.io/cloud-builders/gcloud'
    args: ['run', 'deploy', 'demo-cloud-user',
           '--image=europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/${_APP_NAME}:${_APP_TAG}',
           '--port=8080',
           '--platform=managed',
           '--region=europe-west2',
           '--no-allow-unauthenticated',
           '--service-account=vm-common@jason-hsbc.iam.gserviceaccount.com',
           '--key=projects/$PROJECT_ID/locations/europe-west2/keyRings/mykeyring/cryptoKeys/mycmek',
           '--set-env-vars=APP_ENVIRONMENT=${_APP_ENV}',
           '--vpc-connector=${_VPC_CONNECTOR}',
           '--vpc-egress=all'
           ]
# https://stackoverflow.com/questions/68779751/error-publishing-source-code-from-cloud-build-to-a-bucket-using-triggers
logsBucket: gs://jason-hsbc_cloudbuild/logs/
options: # https://cloud.google.com/cloud-build/docs/build-config#options
  logging: GCS_ONLY # or CLOUD_LOGGING_ONLY https://cloud.google.com/cloud-build/docs/build-config#logging


substitutions:
  _APP_NAME: demo-cloud-user
  _APP_TAG: latest
  _APP_ENV: prod
  _VPC_CONNECTOR: vpc-con

其中 --vpc-connector 就是 这个cloud run service 要使用的 vpc connector
至于 --vpc-egress=all 就是所有出去的流量都走这个vpc connector

测试:

部署成功:
在这里插入图片描述

[gateman@manjaro-x13 conf]$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://demo-cloud-user-7hq3m4pdya-nw.a.run.app/actuator/info
{"app":"Cloud User API","version":"0.0.1","hostname":"localhost","dbUrl":"jdbc:mysql://192.168.0.42:3306/demo_cloud_user?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true","description":"This is a simple Spring Boot application to demonstrate the use of BigQuery in GCP."}
[gateman@manjaro-x13 conf]$ 
[gateman@manjaro-x13 conf]$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://demo-cloud-user-7hq3m4pdya-nw.a.run.app/user/get/3
{"returnCode":0,"returnMsg":"User fetched successfully ...","data":{"id":3,"username":"华沉鱼","address":"湖北省十堰市"}}
[gateman@manjaro-x13 conf]$!

而且连接的数据库ip是内网ip
也能正确获得数据的返回

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/722228.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python基础语法学习(工程向)-Stage3-数据可视化

json 是一种轻量的数据交互格式,可以按照json指定的格式去组织和封装数据,而本质上是一个带有特定格式的字符串。 功能 json是在各个编程语言中流通的数据格式,负责不同编程语言之间的数据传递和交互。 格式 json的格式要求较为严格&#…

Proxmox VE (PVE) 教学 (3) | 在 Proxmox VE 中安装与配置 OpenWrt

大家好,很长时间没有更新这个系列了。最近正在开发新项目,刚刚想起来我是不是还有一个什么专栏没更新。 本期的网络配置背景同于前两期的描述( 详见https://www.hestudio.net/category/proxmox-ve/ ),这一期只是对网络配置的扩展,也就是安装软路由,实现网络配置的更多功…

高效、智能、安全:小型机房EasyCVR+AI视频综合监控解决方案

一、背景需求分析 随着信息技术的迅猛发展,小型机房在企事业单位中扮演着越来越重要的角色。为了确保机房的安全稳定运行,远程监控成为了必不可少的手段。 二、视频监控 视频监控是机房远程监控的重要组成部分。通过安装IP摄像机及部署视频监控系统Ea…

C++智能指针auto_ptr(有缺陷已废弃)

一、auto_ptr不能共享所有权 auto_ptr类没有拷贝构造函数。可以看出将Right对象的资源释放掉了。 在下面的操作中,ptr1的值给ptr2,那么此时ptr1的值将会为nullptr。在构造和赋值都发生了所有权的转移。调用函数的时候,接收参数的时候同样也会…

统一数据治理平台OpenMetadata 1.4.0版本发布!数据血缘、高级数据质量报告功能发布!...

OpenMetadata作为数据治理和元数据管理领域的领先开源平台,持续致力于满足数据用户和组织的多样化需求。最新的1.4.0版本为用户带来了一系列创新功能和重大改进,进一步增强了平台的功能性和易用性。 我们在社区统计数据中也看到了OpenMetadata的增长&…

JVM 基本组成

一、为什么要学习 JVM ? 1. “ ⾯试造⽕箭,⼯作拧螺丝” , JVM 属于⾯试官特别喜欢提问的知识点; 2. 未来在⼯作场景中,也许你会遇到以下场景: 线上系统突然宕机,系统⽆法访问,甚⾄直…

谷粒商城实战(042集群学习-mysql集群-主从同步)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第361p-第p363的内容 集群 集群的基础形式 MySQL集群 MMM机制 这里使用了vip虚拟ip方式(如192.168.0.101,192.168.0.102&…

Qt Quick 教程(一)

文章目录 1.Qt Quick2.QML3.Day01 案例main.qml退出按钮,基于上面代码添加 4.使用Qt Design StudioQt Design Studio简介Qt Design Studio工具使用版本信息 1.Qt Quick Qt Quick 是一种现代的用户界面技术,将声明性用户界面设计和命令性编程逻辑分开。 …

【Hive安装】— “schematool -initSchema -dbType mysql -verbose” 报错!!!

项目场景:Hive 元数据配置到 MySQL 执行 “schematool -initSchema -dbType mysql -verbose” 命令 问题描述 报错:org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !! 原因…

Exploring Performance and Cost Optimization with ASIC-Based CXL Memory——论文阅读

EuroSys 2024 Paper CXL论文阅读笔记整理 问题 随着内存密集型应用程序对内存需求的增加,受限于物理限制,如DDR DIMM插槽的可用性和发热问题,以及使用高密度DIMM的成本考虑,现代应用程序的内存需求很容易超过单机的内存容量[2&a…

【漏洞复现】海康威视 综合安防管理平台 session接口 远程代码执行漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] K小姐的座位分配(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

42、基于神经网络的训练堆叠自编码器进行图像分类(matlab)

1、训练堆叠自编码器进行图像分类的原理及流程 基于神经网络的训练堆叠自编码器进行图像分类的原理和流程如下: 堆叠自编码器(Stacked Autoencoder)是一种无监督学习算法,由多个自编码器(Autoencoder)堆叠…

【Windows】配置Flutter开发环境

一、下载 flutter sdk 点此跳至下载官网 下载好flutter sdk,并解压到自定义的位置。 二、配置环境变量 此电脑 --> 右键 选择 属性 --> 点击 高级系统设置 --> 会弹出系统属性的窗口,点击 环境变量 按钮 1.配置加速镜像地址 PUB_HOSTED_…

IP协议的相关特性

IP协议的报文结构 如图: 上述的IP协议是ipv4的版本,如上述图中的4位版本号。 现当今的世界仅有两个版本分为ipv4和ipv6。 在这里我以ipv4来介绍IP协议。 IP协议的报头最长为60个字节,最短为20个字节。 如图8个服务类型: 这里不…

python5 正则表达式

Python中的正则表达式是一种强大的工具,用于在文本中搜索、匹配和处理特定模式的字符串。它们通过定义一种模式,使得可以轻松地搜索、替换、提取和验证文本数据,在Python中的正则表达式由re模块提供支持的。 正则表达式通常用于以下任务&…

【HTML01】HTML基础-基本元素-附带案例-作业

文章目录 HTML 概述学HTML到底学什么HTML的基本结构HTML的注释的作用html的语法HTML的常用标签:相关单词参考资料 HTML 概述 英文全称:Hyper Text Markup Language 中文:超文本标记语言,就将常用的50多个标记嵌入在纯文本中&…

AI办公自动化:用通义千问批量翻译长篇英语TXT文档

在deepseek中输入提示词: 你是一个Python编程专家,现在要完成一个编写基于qwen-turbo模型API和dashscope库的程序脚本,具体步骤如下: 打开文件夹:F:\AI自媒体内容\待翻译; 获取里面所有TXT文档&#xff…

【博弈】843. 猜猜这个单词

本题涉及知识点 博弈 LeetCode843. 猜猜这个单词 给你一个由 不同 字符串组成的单词列表 words ,其中 words[i] 长度均为 6 。words 中的一个单词将被选作秘密单词 secret 。 另给你一个辅助对象 Master ,你可以调用 Master.guess(word) 来猜单词&…