同一 VPC 中从虚拟机计算到 GKE 服务的 GCP 网络

同一 VPC 中从虚拟机计算到 GKE 服务的 GCP 网络

我有一个名为“VM”的计算实例,mysql-1与 GKE 集群位于同一帐户、同一 VPC 中。

我已经部署了一个 k8s 服务:

~ $ kubectl get services
NAME                                           TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                                        AGE
haproxy-mysql                                  LoadBalancer   10.19.242.236   8.8.8.8     3306:32375/TCP,3307:30748/TCP,3308:30064/TCP   40m 
^ replaced the actual external ip with 8.8.8.8 here

在虚拟机上,我的 mysql 在 3306 上运行

user@mysql-1:~$ netstat -ntap |grep 3306|grep LISTE
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      -
user@mysql-1:~$ ip a|grep 156
    inet 10.156.0.13/32 brd 10.156.0.13 scope global dynamic ens4

我可以从 k8s pod 连接到虚拟机:

# curl -I 10.156.0.13:3306
curl: (8) Weird server reply

我无法从 VM 使用内部和外部 IP 连接到 haproxy 服务:

user@mysql-1:~$ curl --connect-timeout 2 10.19.242.236:3306
curl: (28) Connection timed out after 2001 milliseconds
user@mysql-1:~$ curl --connect-timeout 2 8.8.8.8:3306
curl: (28) Connection timed out after 2001 milliseconds

当我使用 pod ip 时,它起作用:

$ kubectl get pods -A -o wide |grep haproxy-mysql
default       haproxy-mysql-6dd5f8cf64-72gdx                             1/1     Running   0          10m   10.16.1.39    gke-blabla-default-pool-370bb0fd-92rb   <none>           <none>
default       haproxy-mysql-6dd5f8cf64-zgmwb                             1/1     Running   0          10m   10.16.2.56    gke-blabla-default-pool-370bb0fd-prn7   <none>           <none>
user@mysql-1:~$ curl --connect-timeout 2 10.16.1.39:3306
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.

我有一条防火墙规则:

~ $ gcloud compute firewall-rules list|grep 3306
k8s-fw-ad6943bb1121311eab6fc42010a9c005  default  INGRESS    1000      tcp:3306,tcp:3307,tcp:3308          False


~ $ gcloud compute firewall-rules describe k8s-fw-ad6943bb1121311eab6fc42010a9c005
allowed:
- IPProtocol: tcp
  ports:
  - '3306'
  - '3307'
  - '3308'
creationTimestamp: '2019-11-28T11:18:23.294-08:00'
description: '{"kubernetes.io/service-name":"default/haproxy-mysql", "kubernetes.io/service-ip":"8.8.8.8"}'
direction: INGRESS
disabled: false
id: '2373636381534430096'
kind: compute#firewall
logConfig:
  enable: false
name: k8s-fw-ad6943bb1121311eab6fc42010a9c005
network: https://www.googleapis.com/compute/v1/projects/blalala-1234lab/global/networks/default
priority: 1000
selfLink: https://www.googleapis.com/compute/v1/projects/blalala-1234/global/firewalls/k8s-fw-ad6943bb1121311eab6fc42010a9c005
sourceRanges:
- 8.8.8.8/32
- 8.8.8.8/32
- 8.8.8.8/32
- 10.0.0.0/8
- 8.8.8.8/32
- 8.8.8.8/32
- 8.8.8.8/32
- 8.8.8.8/32
targetTags:
- gke-blablabla-4125f0a3-node

从上面块中明确列出的服务器(屏蔽为 8.8.8.8/32)我可以连接到该服务EXTERNAL-IP

我在这里遗漏了什么?

答案1

Pod IP 是可路由的,服务 IP 则不可路由。 创建 VPC 原生集群

内部服务的集群 IP 只能从集群内部使用。如果您想从同一 VPC 和区域内但从集群外部访问 Kubernetes 服务(例如从 Compute Engine 实例),请使用内部负载均衡器。

内部负载均衡器文档

对于外部 IP 访问,我将在此随意发言。也许这样的规则在源是私有 IP 而目标是外部 IP 的情况下不起作用(即使它在那里表示为标签)。对于传入连接,私有 IP 不会被视为源 IP,规则不会匹配?

答案2

您是否遵循了这里的所有步骤使用 Ingress 设置 HTTP 负载平衡设置你的 GKE 集群?

据我了解,你需要在内部将部署公开为服务

相关内容