--概览
我在GKE上自定义安装了istio(类型=nodeport)。安装命令如下
istioctl install --set profile=default --set values.gateways.istio-ingressgateway.type=NodePort
我正在构建入口并指定NodePort服务作为后端。我发现GCP指定的另一个后端设置为默认值,即使我指定了NodePort。因此,我无法通过TCP/IP连接到GCP LoadBalancer。如果我为入口等设置了与pod readinessprobe相同的端口,那么健康检查也会在那里进行。有没有办法解决这个问题?
--细节
LB的详细视图
# This is a value that is automatically set by istio
$ k get svc istio-ingressgateway -n istio-system -o yaml
ports:
- name: status-port
nodePort: 32476
port: 15021
protocol: TCP
targetPort: 15021
- name: http2
nodePort: 32241
port: 80
protocol: TCP
targetPort: 8080
- name: https
nodePort: 31739
port: 443
protocol: TCP
targetPort: 8443
- name: tcp-istiod
nodePort: 32488
port: 15012
protocol: TCP
targetPort: 15012
- name: tls
nodePort: 32741
port: 15443
protocol: TCP
targetPort: 15443
$ k get po istio-ingressgateway-6f8bbbbd8c-qmkln -n istio-system -o yaml
:
readinessProbe:
failureThreshold: 30
httpGet:
path: /healthz/ready
port: 15021
scheme: HTTP
initialDelaySeconds: 1
periodSeconds: 2
successThreshold: 1
timeoutSeconds: 1
#
spec:
rules:
- host: www.custom.com
http:
paths:
- backend:
serviceName: istio-ingressgateway
servicePort: 80
- backend:
serviceName: istio-ingressgateway
servicePort: 15021
istio-system istio-ingressgateway NodePort 10.47.13.185 <none> 15021:31761/TCP,80:31561/TCP,443:31257/TCP,15012:31841/TCP,15443:32172/TCP 9h
我把这个答案分成了几个部分:
这正如预期的那样工作,因为使用GKE
创建的入口
将有2个后端:
YAML
清单中指定的。default-超文本传输协议-backend
。例如,您可以遵循以下步骤:
之后,您应该会看到类似的设置:
第一个后端服务使用实例组将请求发送到与入口资源不匹配的默认后端。
第二个后端服务是使用NEG(网络endpoint组)发送与Inrit
资源匹配的请求(在本例中为nginx
部署
)。
我已经标记了红色方块以将其与库伯内特斯资源连接起来(查看端口):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.20.6.229 <none> 80:32612/TCP 51m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default-http-backend NodePort 10.20.15.39 <none> 80:30603/TCP 121m
问题中包含的入口定义部分是以引用具有两个不同后端的相同路径的方式创建的:
http:
paths:
- backend:
serviceName: istio-ingressgateway
servicePort: 80
- backend:
serviceName: istio-ingressgateway
servicePort: 15021
以上示例:
要解决这个问题,您需要删除15021后端,并使用backendConfig资源来配置健康检查和安全策略(稍后将详细介绍)。
旁注!
YAML清单正在使用一种古老且很快会被弃用的方式来描述入口。有关更多参考,请参阅本文档:
将云装甲与Istio结合使用的方法之一是:
backendConfig
作为IstioService
的先决条件。服务
。入口
资源以指向istio-ingressgate
。例如,可以创建仅阻止单个IP地址的安全策略。可以通过云控制台(Web UI)或云控制台(Web UI)完成:
让我们假设创建了名为:denend-first
的安全策略来阻止单个IP地址。
您需要创建一个backendConfig
来配置运行状况检查并强制执行安全策略:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: ingress-backendconfig
namespace: istio-system
spec:
healthCheck:
requestPath: /healthz/ready
port: 15021
type: HTTP
securityPolicy:
name: deny-single # <-- IMPORTANT
您需要在istio ingressgateway的服务中添加以下注释:
cloud.google.com/backend-config: '{"default": "ingress-backendconfig"}'
cloud.google.com/neg: '{"ingress":true}'
此注释将通知GCP
要应用的安全策略以及将流量传递到istio-ingress网关
所需的健康检查。
将请求从HTTP(S)负载平衡器发送到istio ingressgateway的基本定义如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: istio-ingress
namespace: istio-system
spec:
rules:
- http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: istio-ingressgateway
port:
number: 80
要检查设置是否正常工作,您可以生成Bookinfo应用程序。
使用2个不同的IP地址进行测试:
217.AAA.BBB.CCC
$curl 34. XXX. YYY. ZZZ/productpage
<!doctype html><meta charset="utf-8"><meta name=viewport content="width=device-width, initial-scale=1"><title>403</title>403 Forbidden%
94.EEE.FFF.GGG
$curl 34. XXX. YYY. ZZZ/productpage
<html>
<head>
<title>Simple Bookstore App</title>
<-- REDACTED -->
旁注!
您收到的“封闭端口”可能与以下事实有关,即istio ingressgateway被配置为侦听特定路径,如productpage,而不是code。(如果请求专门针对端口80而不是15021)
其他资源:
我已经在laravel中创建了一个项目,但是当我尝试使用php artisan serve运行它时,我得到了一个错误:需要Mcrypt php扩展。我需要一些帮助
在AWS EKS上,我有ALB入口控制器,入口资源指向端口32509上的NodePort服务,目标端口80,服务上有。 在这种情况下,外部流量如何在NodePort服务下路由到我的pod? 类似于,ALB
我设置服务的方式如下: 部署(2个吊舱)- 到目前为止,它提供了正确的证书,但由于某些原因,它指向了“错误”的后端。在GKE wbeconsole上,它只是说我的后端服务不健康,一旦我点击它们,它们就不存在了。我在这里做错了什么? 这是我的ingress yaml文件 部署yaml LB服务yaml
我正在学习如何使用入口在谷歌Kubernetes引擎上公开我的应用程序。我学习了几本教程,大致了解了需要什么。然而,我不知道为什么我的服务被标记为不健康,尽管它们可以从我直接定义的NodePort服务访问。 这是我的部署文件:(我删除了一些数据,但大部分保持不变) 在阅读时,我需要一个ReadinessProbe和LivinessProbe,以便GKE在我定义的路径上运行健康检查,并且通过使用我自
在使用GKE ingress时,我观察到GKE ingress为负载平衡器创建了多个后端服务,这导致后端服务如此之多,我们甚至面临后端服务作为其全局配额的配额耗尽问题。我的问题是,尽管ingress中有多条路径规则,但为什么NGINX ingress controller不像GCE ingress那样创建多个后端服务。我阅读了这里的文档, https://cloud.google.com/kube
在我开始之前,我想提一下,我正在使用GKE的免费试用版。我有一个在GKE集群中运行的简单服务器。我有一个用于公开服务器的服务。我正在尝试配置入口控制器并将其连接到此服务。 如果我的服务是LoadBalancer、NodePort类型,那么一切都会完美工作。但是,如果我的服务是ClusterIP类型,则会出现以下错误 然后,GKE停止尝试为入口配置IP。为什么我不能配置集群IP类型的服务,是否有解决