У меня есть виртуальная машина вычислительного экземпляра с именем mysql-1
в той же учетной записи, в том же VPC, что и кластер GKE.
У меня развернут сервис 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 я могу подключиться к vm:
# curl -I 10.156.0.13:3306
curl: (8) Weird server reply
с виртуальной машины я не могу подключиться к службе haproxy, используя как внутренние, так и внешние IP-адреса:
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
Что мне здесь не хватает?
вы выполнили все шаги здесь Настройка балансировки нагрузки HTTP с помощью Ingressнастроить свой кластер GKE?
Насколько я понимаю, вам нужно Представьте свое развертывание как услугу внутри компании
IP-адреса пода являются маршрутизируемыми, служебные IP-адреса - нет. Создание кластера с поддержкой VPC:
IP-адреса кластера для внутренних служб доступны только внутри кластера. Если вы хотите получить доступ к Kubernetes Service из того же VPC и региона, но извне кластера (например, из экземпляра Compute Engine), используйте внутренний балансировщик нагрузки.
Документация по внутреннему балансировщику нагрузки
Для внешнего IP-доступа я буду снимать здесь с бедра. Возможно, такие правила не будут работать, если источник - частный IP, а цель - внешний IP (даже если он выражен там как тег). Для входящего соединения этот частный IP-адрес не будет рассматриваться как исходный IP-адрес, и правило не будет соответствовать?