Kubernetes Istio复杂K8sObjectOverlay.PathValue
可以通过部署 您可以使用修补程序修补由某个组件创建的任何内容,这需要一个。我一生都无法理解如何提供复杂的路径值 以下是我找到的一些(在那些页面上搜索“补丁:”以防有所帮助) 我尝试应用的修补程序正在更改从以下位置创建的默认入口网关:Kubernetes Istio复杂K8sObjectOverlay.PathValue,kubernetes,istio,Kubernetes,Istio,可以通过部署 您可以使用修补程序修补由某个组件创建的任何内容,这需要一个。我一生都无法理解如何提供复杂的路径值 以下是我找到的一些(在那些页面上搜索“补丁:”以防有所帮助) 我尝试应用的修补程序正在更改从以下位置创建的默认入口网关: 。。。 规格: 配置文件:默认值 组件: 入口通道: -名称空间:istio系统 姓名:istio ingressgateway 已启用:true 我可以查看使用kubectl edit gateway/ingresgateway-n istio system创建
。。。
规格:
配置文件:默认值
组件:
入口通道:
-名称空间:istio系统
姓名:istio ingressgateway
已启用:true
我可以查看使用kubectl edit gateway/ingresgateway-n istio system
创建的默认入口网关,并查看以下代码片段:
spec:
服务器:
-主持人:
- '*'
端口:
名称:http
电话:80
协议:HTTP
我的目标是将其改为:
spec:
选择器:
istio:ingressgateway#使用istio默认控制器
服务器:
-端口:
电话:80
名称:http
协议:HTTP
主持人:
- "*"
tls:
httpsRedirect:true#为http请求发送301重定向
-端口:
电话:443
姓名:https-443
协议:HTTPS
主持人:
- "*"
tls:
模式:简单#在此端口上启用HTTPS
服务器证书:/etc/istio/ingresgateway证书/tls.crt
私钥:/etc/istio/ingresgateway证书/tls.key
我认为我应该添加到上面第一个YAML块的ObjectOverlay应该从以下内容开始:
k8s:
覆盖层:
-apiVersion:networking.istio.io/v1beta1
种类:网关
姓名:安格尔斯格特韦
补丁:
-路径:spec.servers。
但我不知道如何指定要向第一个列表项添加tls.httpsRedirect:true
,或者如何创建具有上述相对复杂值的列表项
我上面链接的文档我不清楚。Istio本身只是指向的链接,所以我想这就是我寻求帮助的地方。AFAIK这是不可能的,正如您在下面的文档中所看到的,它更像是启用、禁用某些组件、内存和标签
如果要编辑特定组件(如入口网关),请使用 您可以使用将要安装的每个istio组件生成yaml 在您的示例中,使用
istioctl manifest generate --set profile=default > my-default.yaml
用于查找入口网关,它应该如下所示
apiVersion: networking.istio.io/v1alpa3
kind: Gateway
metadata:
name: ingressgateway
namespace: istio-system
labels:
release: istio
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
使用您的规格修改它
apiVersion: networking.istio.io/v1alpa3
kind: Gateway
metadata:
name: ingressgateway
namespace: istio-system
labels:
release: istio
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
tls:
httpsRedirect: true # sends 301 redirect for http requests
- port:
number: 443
name: https-443
protocol: HTTPS
hosts:
- "*"
tls:
mode: SIMPLE # enables HTTPS on this port
serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
privateKey: /etc/istio/ingressgateway-certs/tls.key
并使用kubectl apply将istio与修改后的入口网关一起安装
kubectl apply -f my-default.yaml
我自己测试过,一切正常。希望它能回答您的问题。这是覆盖的一部分,将添加另一个服务器条目和一些示例规范。只要把它调整成你想要的样子。您还可以使用spec.servers[0]路径覆盖第一个服务器条目,然后将该值设置为您想要的值
ingressGateways:
- enabled: true
k8s:
overlays:
- apiVersion: networking.istio.io/v1alpha3
kind: Gateway
name: ingressgateway
patches:
- path: spec.servers[1]
value:
hosts:
- '*.example.com'
port:
name: https
number: 443
protocol: HTTPS
tls:
credentialName: example-cert
mode: SIMPLE
privateKey: sds
serverCertificate: sds
更新:
我还没有尝试过,但您可以尝试将该表达式定义为路径,我认为它只需在对象的其余部分中设置一个值:
- path: spec.servers[0].tls.httpsRedirect
value: true
但是,可能需要定义整个tls对象,我现在不确定它是否仅在定义了httpsRedirect属性的情况下有效
- path: spec.servers[0].tls
value:
httpsRedirect: true
other required attributes defined here just like httpsRedirect
您必须将整个阵列作为补丁提供。 下面是v1.4.9上的一个工作示例:
apiVersion: install.istio.io/v1alpha2
kind: IstioOperator
spec:
profile: default
gateways:
components:
ingressGateway:
enabled: true
k8s:
overlays:
- kind: Gateway
name: ingressgateway
patches:
- path: spec.servers
value:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
- port:
number: 443
name: domain-com
protocol: HTTPS
tls:
mode: SIMPLE
serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
privateKey: /etc/istio/ingressgateway-certs/tls.key
hosts:
- "*.domain.com"
我不认为这表明我的要求是不可能实现的。我看到这里提到的选项没有提到其中指定的K8sObjectOverlay.PathValues,因此网关选项中没有提到
服务器:
,这并不意味着它不能按照我上面描述的方式进行编辑。也就是说,我意识到这是一种非标准的方法。我试图通过没有第二个入口网关yaml来解决的问题是,我不能立即背靠背地应用这些更改;从初始istio部署到应用入口网关更改或入口网关无法生效(因为它找不到预期的资源),我必须等待一段时间。这使我无法制作一个单独的头盔图表,以我想要的方式部署Istio,因为我需要在应用YAML之间进行睡眠。您的答案看起来与我目前的答案非常相似,这有助于验证我的方法是否更标准+我想知道这是否只是覆盖了这些值,还是可以像你想的那样“添加”它们。我会努力找到答案。如果我发现了什么,我会编辑我的答案。明确指出,资源可以这样添加/删除/修改:要添加、删除或替换的值。对于add,路径应该是一个新叶。对于“删除”,应取消设置值。对于“替换”,路径应引用现有节点。所有值都是字符串,但都会根据架构转换为适当的类型。
因此,如果不完全重新定义[0]
,就无法将tls.httpsredict:true
添加到[0]
?我还没有尝试过,但您可以尝试将该表达式定义为路径,我认为它只是在对象的其余部分中设置了一个值:`-path:spec.servers[0].tls.httpsRedirect value:true`可能需要定义整个tls对象,但我现在不确定它是否仅在定义了httpsRedirect属性的情况下有效<代码>-路径:spec.servers[0]。tls值:httpsRedirect:true其他属性
我已经更新了原始回复,那里有更好的代码格式。