Используйте внешний IP-адрес в облаке Google со службой Kubernetes, чтобы предоставить его Интернету

# #kubernetes #google-cloud-platform #phpmyadmin #static-ip-address

Вопрос:

У меня есть служба phpmyadmin, работающая в кластере kubernetes. Я хочу зарезервировать внешний IP-адрес (статический) в облаке Google для использования с этой службой, чтобы он мог быть доступен из Интернета. Я попытался зарезервировать IP-адрес в GCP и использовал его в файле службы kubernetes, как показано ниже:

 apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: phpmyadmin
  name: phpmyadmin
spec:
  externalIPs: [xx.xxx.xxx.xxx]  #the external IP from Google cloud
  ports:
  - name: "8080"
    port: 8080
    targetPort: 80
  selector:
    io.kompose.service: phpmyadmin
status:
  loadBalancer: {}
 

Когда я указываю spec.type: LoadBalancer , тогда служба доступна из Интернета с IP-адресом по умолчанию, который генерируется из type: LoadBalancer .

Я попытался изменить правила брандмауэра для внешнего IP-адреса, разрешив вход на порт 8080, но это не сработало.

Ответ №1:

Вместо того, чтобы устанавливать значение exteranlIPs , вы должны установить spec.loadBalancerIP spec.type LoadBalancer значение:

 apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: /snap/kompose/19/kompose-linux-amd64 convert
    kompose.version: 1.21.0 (992df58d8)
  creationTimestamp: null
  labels:
    io.kompose.service: phpmyadmin
  name: phpmyadmin
spec:
  ports:
  - name: "8080"
    port: 8080
    targetPort: 80
  selector:
    io.kompose.service: phpmyadmin
  type: LoadBalancer
  loadBalancerIP: "YOUR_IP_ADDRESS"
status:
  loadBalancer: {}
 

Обратите внимание, что предоставление доступа к вашим Pod через внешний статический IP-адрес поддерживает только региональный трафик с балансировкой нагрузки, поэтому ваш зарезервированный статический IP-адрес должен быть региональным.

Для глобального IP-адреса вам необходимо предоставить HTTP (s) балансировщик нагрузки через Ingress объект.

Ответ №2:

Правила брандмауэра применяются на уровне экземпляра. они не могут предотвратить попадание трафика на сам балансировщик нагрузки.

Ссылка : https://cloud.google.com/load-balancing/docs/https/#firewall_rules

Возможно, ваша служба GKE LB по умолчанию использует балансировщик нагрузки HTTP, возможно, вы можете проверить балансировщик нагрузки NLB: https://cloud.google.com/load-balancing/docs/choosing-load-balancer#summary-of-google-cloud-load-balancers

Весь порт: https://cloud.google.com/kubernetes-engine/docs/how-to/service-parameters#all_ports

 apiVersion: v1
kind: Service
metadata:
  name: helloworld
  labels:
    app: helloworld
  annotations:
    cloud.google.com/neg: '{"exposed_ports": {"8080":{}}}'
spec:
  ports:
  - name: 8080-8080
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: helloworld
  # Use LoadBalancer type instead of ClusterIP
  type: LoadBalancer
 

Пример : https://spring-gcp.saturnism.me/deployment/kubernetes/load-balancing/external-load-balancing