自定义安装配置
先决条件
在开始之前,请检查以下先决条件
- 下载 Istio 版本.
- 执行任何必要的平台特定设置。
- 检查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
,它允许更改以下设置。使用此列表来标识要自定义的设置
所有这些 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
高级安装自定义
自定义外部图表和配置文件
istioctl
的install
、manifest generate
和profile
命令可以使用以下任何来源来获取图表和配置文件
- 编译在图表中。如果未设置
--manifests
选项,这是默认选项。编译在图表中与 Istio 版本.tgz
的manifests/
目录中的图表相同。 - 本地文件系统中的图表,例如
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.yaml
和user-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 标志还会在资源中创建路径中缺失的任何中间节点。