gcloud上的Kubernetes内部负载均衡器

gcloud上的Kubernetes内部负载均衡器,kubernetes,gcloud,internal-load-balancer,Kubernetes,Gcloud,Internal Load Balancer,我可能在这里问了一个错误的问题,但我正在尝试创建一个这样的内部负载平衡器 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: T

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

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://[API\u service\u name]:3000访问的API服务,还有一个简单的nginx网关服务,代理通过http://[gateway\u service\u name]:80到http://[API\u service\u 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: {}
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: {}
我的API service deployment.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: {}
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: {}
而部署.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: {}
这些设置适用于外部负载平衡器/网关。当我执行
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>
NAME CLUSTER-IP EXTERNAL-IP
网关服务名称gateway.int.ip.add.ress gateway.ext.ip.add.ress
api服务名称api.int.ip.add.ress
我可以浏览
http://gateway.ext.ip.add.ress/any_available_endpoints
很好

我正在试图弄清楚我是否可以实现同样的目标,而不必为我的网关提供外部ip地址,并使用
http://gateway.int.ip.add.ress/any_available_endpoints

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

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


更新:我最终将我的客户端(web)放在同一个集群中,这样我的网关就不必有外部ip地址,我不确定这是否是正确的方法,但现在将保持这种方式

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

一个选项是继续将公共IP与
负载平衡器
服务
一起使用,并配置防火墙,使用
服务
上的
负载平衡器SourceRanges
设置,将流量限制为仅来自您的VPN()

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

如果ClusterA具有IP为10.128.0.2、10.128.0.3和10.128.0.4的节点,并且您可以这样配置
服务

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_endpoints
http://10.128.0.3/any_available_endpoints
http://10.128.0.4/any_available_endpoints

我使用您的建议进行了快速尝试,但出现了此错误
spec.port[0].nodePort:无效值:80:提供的端口不在有效范围内。有效端口的范围是30000-32767
,我在谷歌上搜索了一下,遇到了一个我认为不应该静态设置以避免冲突的问题?节点ip是指我的服务集群ip还是我的pods ip?因此,我尝试删除
nodePort
并应用更改,然后我尝试了两个ip,但仍然不起作用。我最终将我的客户端放在同一个集群中,这样我的网关就不必有外部ip地址,我不确定这是否是正确的方法,但现在将保持这样