gcloud 上的 Kubernetes 内部负载平衡器
Kubernetes internal load balancer on gcloud
我可能会在这里问错问题,但我正在尝试创建这样的内部负载平衡器
我有一个 API 服务可以被 http://[api_service_name]:3000
访问,还有一个简单的 nginx 网关服务 proxy_pass http://[gateway_service_name]:80
到 http://[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_endpoints
或 http://10.128.0.3/any_available_endpoints
或 http://10.128.0.4/any_available_endpoints
连接到您的服务
我可能会在这里问错问题,但我正在尝试创建这样的内部负载平衡器
我有一个 API 服务可以被 http://[api_service_name]:3000
访问,还有一个简单的 nginx 网关服务 proxy_pass http://[gateway_service_name]:80
到 http://[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_endpoints
或 http://10.128.0.3/any_available_endpoints
或 http://10.128.0.4/any_available_endpoints