我在Google Kubernetes Engine上创建了一个部署和服务。这些在云计算实例上运行。
我需要使我的 k8s 应用程序可从其他计算实例访问,但不能从外部世界访问。这是因为有一些遗留实例在集群外部运行,这些实例无法迁移(至少目前还无法迁移(。
我的理解是,Service
使 Pod 可以从其他群集节点访问,而Ingress
会将 Pod 暴露给具有外部 IP 的外部流量。
中间的东西:我需要在集群外部公开我的 Pod,但只能向其他本地计算实例(在同一区域中(公开。我不明白我应该怎么做。
在 Google Kubernetes Engine 中,这是通过一个LoadBalancer
类型的服务来实现的,该服务被注释为内部负载均衡器。它的文档在 https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing。
假设您有一个带有标签app: echo-pod
的部署,该部署侦听端口 080,并且您希望将其作为端口 80 公开给 GCE 实例,该服务将如下所示:
apiVersion: v1
kind: Service
metadata:
name: echo-internal
annotations:
cloud.google.com/load-balancer-type: "Internal"
labels:
app: echo-pod
spec:
type: LoadBalancer
selector:
app: echo-pod
ports:
- port: 80
targetPort: 8080
protocol: TCP
创建服务和内部负载均衡器需要一些时间。创建后,它将具有外部 IP:
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echo-internal LoadBalancer 10.4.11.165 10.128.0.35 80:31706/TCP 2m33s
kubernetes ClusterIP 10.4.0.1 <none> 443/TCP 20m
10.128.0.35
IP 实际上是只能在您的 VPC 内部访问的内部 IP 地址。从另一个 GCE 实例中,您可以在公开的端口上访问它:
$ curl http://10.128.0.35
Hostname: echo-deployment-5f55bb9855-hxl7b
注意:您需要在预置集群时启用"负载平衡"加载项。但它默认处于启用状态,除非您在创建群集时明确禁用了"启用 HTTP 负载平衡"选项,否则它应该可以正常工作。