我有一个名为“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 集群?
据我了解,你需要在内部将部署公开为服务