我有一个GKE集群,它使用了Nginx入侵控制器作为它的入口引擎。目前,当我设置Nginx控制器时,我定义了一个服务kind: LoadBalancer,并将它指向先前在GCP上保留的外部静态IP。问题是,它只绑定到一个区域静态IP地址(如果我没有弄错的话,L4负载均衡器)。我想要一个全球负载均衡器代替。
我知道我可以通过使用GKE入口控制器来实现这一点,而不是使用Nginx入侵控制器。但是,我仍然想使用Nginx Ingress,因为它有强大的注释,比如根据条件重写标题等;GKE宏注释不可用的东西。
最后,是否有任何方法将全局负载均衡器与Nginx入口控制器结合起来,或者将全局负载均衡器放在由nginx创建的L4负载均衡器的前面?
我们需要有全球负载均衡器,以保护云装甲。
发布于 2022-07-22 20:03:36
最后,我设法使Nginx控制器和L7 HTTP(S)负载均衡器一起工作。
基于他自己的问题“repply”,我设法使它发挥作用。唯一的区别是,他的解决方案将安装一个经典的HTTP(S) LoadBalancer,而不是新版本,我还介绍了IP地址的创建、自签名证书的创建以及HTTP代理从HTTP重定向到HTTPS。我会在这里列出对我有用的详细步骤。
这些步骤假设我们已经创建了一个启用了VPC-native traffic routing的集群。
在需要HTTP(S) LoadBalancer之前,我只需要将NGINX页面提供的清单应用于Nginx控制器的安装,它将创建一个LoadBalancer类型的服务,然后自动创建一个区域性L4 LoadBalancer。
但是现在我需要有云装甲和WAF,L4负载平衡器不支持它。一个HTTPS(S)负载均衡器是需要云装甲工作。
为了让Nginx入侵控制器与新的HTTPS(S) LoadBalancer一起工作,我们需要将Nginx入侵控制器服务上的type: LoadBalancer更改为ClusterIP,并向其添加NEGE 213注释D14。我们这样做是因为我们不希望它为我们生成一个L4 LoadBalancer。相反,我们将手动创建一个HTTP(S) LoadBalancer,并通过它的NEG注释将其绑定到ingress-nginx-controller。稍后,当我们将我们的Nginx入侵控制器部署设置为我们的HTTPS LoadBalancer的后端服务时,这个绑定将发生。因此,回到Nginx大会控制器服务,它将以这样的方式结束:
apiVersion: v1
kind: Service
metadata:
annotations:
labels:
helm.sh/chart: ingress-nginx-4.0.15
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 1.1.1
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
annotations:
cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "ingress-nginx-80-neg"}}}'
spec:
type: ClusterIP
ipFamilyPolicy: SingleStack
ipFamilies:
- IPv4
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
appProtocol: http
- name: https
port: 443
protocol: TCP
targetPort: https
appProtocol: https
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
--如果使用HELM安装Nginx,则需要重写配置以将NEG注释添加到服务中。所以values.yaml看起来是这样的:
controller:
service:
type: ClusterIP
annotations:
cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "ingress-nginx-80-neg"}}}'要安装它,请将入口-nginx添加到helm存储库中:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update然后安装它:
helm install -f values.yaml ingress-nginx ingress-nginx/ingress-nginx接下来的步骤是:
ZONE=us-central1-a
CLUSTER_NAME=<cluster-name>
HEALTH_CHECK_NAME=nginx-ingress-controller-health-check
NETWORK_NAME=<network-name>
CERTIFICATE_NAME=self-managed-exp-<day>-<month>-<year>
NETWORK_TAGS=$(gcloud compute instances describe \
$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}') \
--zone=$ZONE --format="value(tags.items[0])")创建静态IP地址(如果已经跳过):
必须是高级层
gcloud compute addresses create ${CLUSTER_NAME}-loadbalancer-ip \
--global \
--ip-version IPV4创建防火墙规则,允许L7 HTTP(S)负载均衡器访问集群gcloud compute firewall-rules create ${CLUSTER_NAME}-allow-tcp-loadbalancer \
--allow tcp:80 \
--source-ranges 130.211.0.0/22,35.191.0.0/16 \
--target-tags $NETWORK_TAGS \
--network $NETWORK_NAME为我们将要创建的后端服务创建健康检查。
gcloud compute health-checks create http ${CLUSTER_NAME}-nginx-health-check \
--port 80 \
--check-interval 60 \
--unhealthy-threshold 3 \
--healthy-threshold 1 \
--timeout 5 \
--request-path /healthz创建一个后端服务,用于通知LoadBalancer如何连接和分发贸易到豆荚.gcloud compute backend-services create ${CLUSTER_NAME}-backend-service \
--load-balancing-scheme=EXTERNAL \
--protocol=HTTP \
--port-name=http \
--health-checks=${CLUSTER_NAME}-nginx-health-check \
--global现在是时候将Nginx服务(前面注释过的那个)添加到上一步创建的后端服务:gcloud compute backend-services add-backend ${CLUSTER_NAME}-backend-service \
--network-endpoint-group=ingress-nginx-80-neg \
--network-endpoint-group-zone=$ZONE \
--balancing-mode=RATE \
--capacity-scaler=1.0 \
--max-rate-per-endpoint=100 \
--global创建负载均衡器本身(URL映射)gcloud compute url-maps create ${CLUSTER_NAME}-loadbalancer \
--default-service ${CLUSTER_NAME}-backend-service创建自管理证书。(这可能是Google管理的证书,但我们将在这里介绍self-managed).。
gcloud compute ssl-certificates create $CERTIFICATE_NAME \
--certificate=my-cert.pem \
--private-key=my-cert-key.pem \
--global最后,我将通过控制台接口设置负载平衡器前端,这要容易得多。
要创建
前端,请在控制台上输入负载平衡器,然后单击"Edit".前端配置选项卡将是不完整的。去吧,,

点击“添加前端IP和给它命名,并在字段协议上选择HTTPS。On IP地址从短暂的更改为以前分配的静态IP选择您的证书,并在需要时将启用HTTPS重定向。(我做了)
保存LoadBalancer。在进入LoadBalancer页面时,我们应该看到nginx实例健康和绿色。在我的例子中,我已经将Nginx控制器设置为有4个副本:
最后,我们只需要将我们的域指向LoadBalancer IP并创建我们的入侵文件。
注意:大会现在将不处理证书。证书现在将由LoadBalancer外部管理。因此,大会将没有tls定义:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/upstream-fail-timeout: "1200"
nginx.ingress.kubernetes.io/configuration-snippet: |
set $http_origin "${scheme}://${host}";
more_set_headers "server: hide";
more_set_headers "X-Content-Type-Options: nosniff";
more_set_headers "Referrer-Policy: strict-origin";
name: ingress-nginx
namespace: prod
spec:
rules:
- host: app.mydomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80发布于 2022-06-11 15:29:16
您可以将Nginx创建为LoadBalancer类型的服务,并按照此谷歌文档为其提供一个NEG注释。
https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing
然后可以将此NEG用作HTTP(S)负载平衡的后端服务(目标)
您可以使用本文中的gcloud命令。
https://stackoverflow.com/questions/72476714
复制相似问题