Назад | Перейти на главную страницу

Сеть GCP от вычислений виртуальной машины до службы GKE в том же VPC

У меня есть виртуальная машина вычислительного экземпляра с именем 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-адрес, и правило не будет соответствовать?