自定义安装配置

先决条件

在开始之前,请检查以下先决条件

  1. 下载 Istio 版本.
  2. 执行任何必要的平台特定设置
  3. 检查Pod 和服务的必要条件

除了安装 Istio 的任何内置配置配置文件之外,istioctl install还提供了一个完整的 API 用于自定义配置。

此 API 中的配置参数可以使用命令行上的--set选项单独设置。例如,要在默认配置配置文件中启用调试日志记录,请使用以下命令

$ istioctl install --set values.global.logging.level=debug

或者,可以使用 YAML 文件指定IstioOperator配置,并使用-f选项将其传递给istioctl

$ istioctl install -f samples/operator/pilot-k8s.yaml

识别 Istio 组件

IstioOperator API 定义了组件,如以下表格所示

组件
基础
代理
入口网关
出口网关
CNI
istiod 远程

这些组件的每个可配置设置都在 API 的components.<component name>下提供。例如,要使用 API 将pilot组件的enabled设置(更改为 false),请使用--set components.pilot.enabled=false或在IstioOperator资源中进行如下设置

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    pilot:
      enabled: false

所有组件还共享一个用于更改 Kubernetes 特定设置的通用 API,位于components.<component name>.k8s下,如下一节所述。

自定义 Kubernetes 设置

IstioOperator API 允许以一致的方式自定义每个组件的 Kubernetes 设置。

每个组件都有一个KubernetesResourceSpec,它允许更改以下设置。使用此列表来标识要自定义的设置

  1. 资源
  2. 就绪探测
  3. 副本数量
  4. 水平 Pod 自动伸缩器
  5. Pod 中断预算
  6. Pod 注释
  7. 服务注释
  8. 镜像拉取策略
  9. 优先级类名称
  10. 节点选择器
  11. 亲和性和反亲和性
  12. 服务
  13. 容忍度
  14. 策略
  15. 环境
  16. Pod 安全上下文
  17. 卷和卷挂载

所有这些 Kubernetes 设置都使用 Kubernetes API 定义,因此可以参考Kubernetes 文档

以下示例覆盖文件调整了代理的资源和水平 Pod 自动伸缩设置

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    pilot:
      k8s:
        resources:
          requests:
            cpu: 1000m # override from default 500m
            memory: 4096Mi # ... default 2048Mi
        hpaSpec:
          maxReplicas: 10 # ... default 5
          minReplicas: 2  # ... default 1

使用istioctl install将修改后的设置应用到集群

$ istioctl install -f samples/operator/pilot-k8s.yaml

使用 Helm API 自定义 Istio 设置

IstioOperator API 包含一个使用values字段的Helm API 直通接口。

以下 YAML 文件通过 Helm API 配置全局设置和代理设置

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  values:
    pilot:
      traceSampling: 0.1 # override from 1.0
    global:
      monitoringPort: 15014

某些参数将临时存在于 Helm 和IstioOperator API 中,包括 Kubernetes 资源、命名空间和启用设置。Istio 社区建议使用IstioOperator API,因为它更一致,经过验证,并遵循社区毕业流程

配置网关

网关是一种特殊的组件类型,因为可以定义多个入口和出口网关。在IstioOperator API中,网关定义为列表类型。default配置文件安装一个名为istio-ingressgateway的入口网关。你可以检查此网关的默认值

$ istioctl profile dump --config-path components.ingressGateways
$ istioctl profile dump --config-path values.gateways.istio-ingressgateway

这些命令显示了网关的IstioOperator和 Helm 设置,它们一起用于定义生成的网关资源。内置网关可以像任何其他组件一样自定义。

可以通过添加一个新的列表条目来创建一个新的用户网关

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    ingressGateways:
      - name: istio-ingressgateway
        enabled: true
      - namespace: user-ingressgateway-ns
        name: ilb-gateway
        enabled: true
        k8s:
          resources:
            requests:
              cpu: 200m
          serviceAnnotations:
            cloud.google.com/load-balancer-type: "internal"
          service:
            ports:
            - port: 8060
              targetPort: 8060
              name: tcp-citadel-grpc-tls
            - port: 5353
              name: tcp-dns

请注意,Helm 值(spec.values.gateways.istio-ingressgateway/egressgateway)由所有入口/出口网关共享。如果必须对每个网关进行自定义,建议使用单独的 IstioOperator CR 来为用户网关生成清单,与主 Istio 安装分开

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: empty
  components:
    ingressGateways:
      - name: ilb-gateway
        namespace: user-ingressgateway-ns
        enabled: true
        # Copy settings from istio-ingressgateway as needed.
  values:
    gateways:
      istio-ingressgateway:
        debug: error

高级安装自定义

自定义外部图表和配置文件

istioctlinstallmanifest generateprofile命令可以使用以下任何来源来获取图表和配置文件

  • 编译在图表中。如果未设置--manifests选项,这是默认选项。编译在图表中与 Istio 版本.tgzmanifests/目录中的图表相同。
  • 本地文件系统中的图表,例如istioctl install --manifests istio-1.24.0/manifests

可以通过编辑manifests/中的文件来自定义本地文件系统图表和配置文件。对于大规模更改,我们建议复制manifests目录并在其中进行更改。但是请注意,必须保留manifests目录中的内容布局。

配置文件位于manifests/profiles/下,可以通过创建具有所需配置文件名称和.yaml扩展名的新文件来进行编辑和添加新文件。istioctl会扫描profiles子目录,并在该目录中找到的所有配置文件都可以通过IstioOperatorSpec配置文件字段中的名称来引用。内置配置文件在应用用户覆盖之前会叠加到默认配置文件 YAML 上。例如,你可以创建一个名为custom1.yaml的新配置文件,它会自定义default配置文件中的某些设置,然后在此基础上应用一个用户覆盖文件

$ istioctl manifest generate --manifests mycharts/ --set profile=custom1 -f path-to-user-overlay.yaml

在这种情况下,custom1.yamluser-overlay.yaml文件将叠加到default.yaml文件上,以获得用作清单生成输入的最终值。

一般情况下,创建新配置文件没有必要,因为可以通过传递多个覆盖文件来实现类似的效果。例如,上面的命令等效于传递两个用户覆盖文件

$ istioctl manifest generate --manifests mycharts/ -f manifests/profiles/custom1.yaml -f path-to-user-overlay.yaml

只有在需要通过IstioOperatorSpec按名称引用配置文件时才需要创建自定义配置文件。

修补输出清单

IstioOperator CR(istioctl的输入)用于生成输出清单,该清单包含要应用到集群的 Kubernetes 资源。输出清单可以通过IstioOperator 覆盖 API 在生成后但应用到集群之前进一步自定义,以添加、修改或删除资源。

以下示例覆盖文件(patch.yaml)演示了可以进行的输出清单修补类型

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  profile: empty
  hub: docker.io/istio
  tag: 1.1.6
  components:
    pilot:
      enabled: true
      namespace: istio-control
      k8s:
        overlays:
          - kind: Deployment
            name: istiod
            patches:
              # Select list item by value
              - path: spec.template.spec.containers.[name:discovery].args.[30m]
                value: "60m" # overridden from 30m
              # Select list item by key:value
              - path: spec.template.spec.containers.[name:discovery].ports.[containerPort:8080].containerPort
                value: 1234
              # Override with object (note | on value: first line)
              - path: spec.template.spec.containers.[name:discovery].env.[name:POD_NAMESPACE].valueFrom
                value: |
                  fieldRef:
                    apiVersion: v2
                    fieldPath: metadata.myPath
              # Deletion of list item
              - path: spec.template.spec.containers.[name:discovery].env.[name:REVISION]
              # Deletion of map item
              - path: spec.template.spec.containers.[name:discovery].securityContext
          - kind: Service
            name: istiod
            patches:
              - path: spec.ports.[name:https-dns].port
                value: 11111 # OVERRIDDEN

将文件传递给istioctl manifest generate -f patch.yaml会将上述修补程序应用到默认配置文件输出清单。两个修补资源将按如下所示进行修改(出于简洁起见,省略了资源的某些部分)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: istiod
spec:
  template:
    spec:
      containers:
      - args:
        - 60m
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              apiVersion: v2
              fieldPath: metadata.myPath
        name: discovery
        ports:
        - containerPort: 1234
---
apiVersion: v1
kind: Service
metadata:
  name: istiod
spec:
  ports:
  - name: https-dns
    port: 11111
---

请注意,修补程序按给定顺序应用。每个修补程序都应用到先前修补程序的输出之上。输出清单中不存在的修补程序中的路径将被创建。

列表项路径选择

istioctl --set标志和IstioOperator CR 中的k8s.overlays字段都支持通过[index][value][key:value]来选择列表项。–set 标志还会在资源中创建路径中缺失的任何中间节点。

此信息是否有用?
你对改进有什么建议吗?

感谢你的反馈!