Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes Istio复杂K8sObjectOverlay.PathValue_Kubernetes_Istio - Fatal编程技术网

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其他属性
我已经更新了原始回复,那里有更好的代码格式。