GCP 内部负载均衡器使用 gke 上的入口资源
GCP internal load balancer using ingress resource on gke
我正在尝试找出从 GKE 集群在 GCP 上设置内部负载均衡器的最佳方法,尤其是如何使用它注册内部域名。
创建负载均衡器时,其前端不包含允许使用确定性域名访问 lb 的“服务标签”。
如果我手动创建包含此字段任意值的第二个前端,我能够在 lb IP 上解析生成的域名,一切正常......我只是不知道如何从k8s资源。
我检查了 ingress gce repo 并且“FrontendConfig”CRD 没有公开这个字段...
获得它的最佳方法是什么?使用 nginx-ingress-controller ?设置外部 DNS 来管理我自己的 DNS 区域?还有别的吗?
最佳,
马修
PS :还有一个“奇怪”的事情是,即使我在同一区域创建了一个专用的“仅代理子网”,如 documentation 中所问,lb IP在集群子网中
编辑:实际上,IP 不能位于仅代理子网中。如果您遵循下面接受的答案,请务必从另一个子网中选择一个 IP。
我更愿意为 LB 创建内部静态 IP 地址并创建内部 DNS 记录,然后最后用这些配置入口设置。
要使内部 HTTP(S) LB 正常工作,需要完成以下总体步骤:
- 创建仅代理子网。
- 保留静态内部 IP 地址。
- 为保留的 IP 创建专用 DNS 区域和 DNS 记录。
- 使用
NodePort
服务公开您的部署并使用 NEG
注释对该服务进行注释。
# web-service.yaml
apiVersion: v1
kind: Service
metadata:
name: YOUR_DEPLOYMENT_SERVICE_NAME
namespace: default
annotations:
cloud.google.com/neg: '{"ingress": true}'
spec:
ports:
name: host1
port: 80
protocol: TCP
targetPort: 9376
selector:
app: hostname
type: NodePort
- 创建入口资源并使用入口 class
gce-internal
# internal-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ilb-demo-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: "gce-internal"
kubernetes.io/ingress.regional-static-ip-name: "ADDRESS_NAME"
spec:
rules:
- host: INTERNAL_DNS_RECORD
http:
paths:
- backend:
service:
name: YOUR_DEPLOYMENT_SERVICE_NAME
port:
number: 80
参考文献:
- https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress
- https://cloud.google.com/kubernetes-engine/docs/concepts/ingress-ilb
- https://cloud.google.com/load-balancing/docs/negs
- https://cloud.google.com/compute/docs/ip-addresses/reserve-static-internal-ip-address
- https://cloud.google.com/load-balancing/docs/l7-internal/proxy-only-subnets
我正在尝试找出从 GKE 集群在 GCP 上设置内部负载均衡器的最佳方法,尤其是如何使用它注册内部域名。
创建负载均衡器时,其前端不包含允许使用确定性域名访问 lb 的“服务标签”。 如果我手动创建包含此字段任意值的第二个前端,我能够在 lb IP 上解析生成的域名,一切正常......我只是不知道如何从k8s资源。
我检查了 ingress gce repo 并且“FrontendConfig”CRD 没有公开这个字段...
获得它的最佳方法是什么?使用 nginx-ingress-controller ?设置外部 DNS 来管理我自己的 DNS 区域?还有别的吗?
最佳,
马修
PS :还有一个“奇怪”的事情是,即使我在同一区域创建了一个专用的“仅代理子网”,如 documentation 中所问,lb IP在集群子网中
编辑:实际上,IP 不能位于仅代理子网中。如果您遵循下面接受的答案,请务必从另一个子网中选择一个 IP。
我更愿意为 LB 创建内部静态 IP 地址并创建内部 DNS 记录,然后最后用这些配置入口设置。
要使内部 HTTP(S) LB 正常工作,需要完成以下总体步骤:
- 创建仅代理子网。
- 保留静态内部 IP 地址。
- 为保留的 IP 创建专用 DNS 区域和 DNS 记录。
- 使用
NodePort
服务公开您的部署并使用NEG
注释对该服务进行注释。
# web-service.yaml
apiVersion: v1
kind: Service
metadata:
name: YOUR_DEPLOYMENT_SERVICE_NAME
namespace: default
annotations:
cloud.google.com/neg: '{"ingress": true}'
spec:
ports:
name: host1
port: 80
protocol: TCP
targetPort: 9376
selector:
app: hostname
type: NodePort
- 创建入口资源并使用入口 class
gce-internal
# internal-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ilb-demo-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: "gce-internal"
kubernetes.io/ingress.regional-static-ip-name: "ADDRESS_NAME"
spec:
rules:
- host: INTERNAL_DNS_RECORD
http:
paths:
- backend:
service:
name: YOUR_DEPLOYMENT_SERVICE_NAME
port:
number: 80
参考文献:
- https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress
- https://cloud.google.com/kubernetes-engine/docs/concepts/ingress-ilb
- https://cloud.google.com/load-balancing/docs/negs
- https://cloud.google.com/compute/docs/ip-addresses/reserve-static-internal-ip-address
- https://cloud.google.com/load-balancing/docs/l7-internal/proxy-only-subnets