gcloud 上的 Kubernetes 内部负载平衡器

Kubernetes internal load balancer on gcloud

我可能会在这里问错问题,但我正在尝试创建这样的内部负载平衡器

我有一个 API 服务可以被 http://[api_service_name]:3000 访问,还有一个简单的 nginx 网关服务 proxy_pass http://[gateway_service_name]:80http://[api_service_name]:3000

我的API服务service.yaml文件是

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    service: api-service-name
  name: api-service-name
spec:
  ports:
  - name: "3000"
    port: 3000
    targetPort: 3000
  selector:
    service: api-service-name
status:
  loadBalancer: {}

我的 API 服务 deployment.yaml 文件是

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  name: api-service-name
spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        service: api-service-name
    spec:
      containers:
      - env:
        ...
        image: ...
        name: api-service-name
        ports:
        - containerPort: 3000
        resources: {}
      restartPolicy: Always
status: {}

而我的 nginx service.yaml 是

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    service: gateway-service-name
  name: gateway-service-name
spec:
  ports:
  - name: "80"
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    service: gateway-service-name
  type: LoadBalancer
  externalName: gateway-service-name
status:
  loadBalancer: {}

和deployment.yaml是

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  name: gateway-service-name
spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        service: gateway-service-name
    spec:
      containers:
      - image: ...
        name: gateway-service-name
        ports:
        - containerPort: 80
        resources: {}
      restartPolicy: Always
status: {}

这些设置适用于外部 loadbalancer/gateway。当我做 kubectl get svc 它打印

NAME                  CLUSTER-IP                EXTERNAL-IP      
gateway-service-name  gateway.int.ip.add.ress   gateway.ext.ip.add.ress
api-service-name      api.int.ip.add.ress       <none>

而且我可以浏览 http://gateway.ext.ip.add.ress/any_available_endpoints 就好了

我想弄清楚我是否可以在不需要为我的网关设置外部 IP 地址的情况下实现同样的事情,并改用 http://gateway.int.ip.add.ress/any_available_endpoints

我尝试使用默认 ClusterIp ServiceType 但它不起作用

注意:我将通过 vpn 访问网络,并且位于另一个集群上的另一个服务将在内部访问此网络

更新:我最终将我的客户端(网络)放在同一个集群中,这样我的网关就不必有外部 IP 地址,我不确定这是否是正确的方法但会保留它暂时这样

A ClusterIP Service 只能从同一集群中的其他服务访问,因此如果您的服务在 ClusterA 中而您的 VPN 在 ClusterB 中,VPN 将无法访问它作为 ClusterIP Service.

一种选择是继续使用 public IP 和 LoadBalancer Service 并配置防火墙以限制流量仅来自使用 [=17= 的 VPN ] Service (https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/)

上的设置

如果 ClusterA 和 ClusterB 都在同一个网络上(这是新集群的默认设置),您还有另一个选择是对 Service 使用 type: NodePort。这将在 ClusterA 中的每个节点的静态端口上公开服务,而无需在默认防火墙中打开任何端口。

如果 ClusterA 具有 IP 为 10.128.0.2、10.128.0.3 和 10.128.0.4 的节点,并且您像这样配置 Service

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    service: gateway-service-name
  name: gateway-service-name
spec:
  ports:
  - name: "80"
    port: 80
    nodePort: 80
    protocol: TCP
    targetPort: 80
  selector:
    service: gateway-service-name
  type: NodePort
  externalName: gateway-service-name

那么您应该能够在 http://10.128.0.2/any_available_endpointshttp://10.128.0.3/any_available_endpointshttp://10.128.0.4/any_available_endpoints

连接到您的服务