使用 Istioctl 安装

跟随本指南安装、配置 Istio 网格,用于深入评估、及生产发布。 如果你是 Istio 新手,只想简单尝试,请参考快速入门指南

本安装指南使用命令行工具 istioctl, 它提供丰富的定制功能,用于定制 Istio 控制平面,以及数据平面 sidecar。 它还提供用户输入验证功能,这有助于防止安装错误;提供定制选项,可以覆盖配置的任何方面。

使用这些说明,你可以选取任意一个 Istio 内置的 配置档, 为你的特定需求进一步定制配置。

istioctl 命令通过命令行的选项支持完整的 IstioOperator API, 这些选项用于单独设置、以及接收包含 IstioOperator 定制资源(CR)的 yaml 文件,

Istio 生产环境最佳实践:在一个 IstioOperator CR 中提供完整的配置。 你除了使用 istioctl 手动完成,还可以选择把安装管理工作整体委托给 Istio Operator

先决条件

开始之前,检查下列先决条件:

  1. 下载 Istio 发行版.
  2. 执行必要的平台安装.
  3. 检查 Pod 和服务的要求.

使用默认配置档安装 Istio

最简单的选择是用下面命令安装 Istio 默认 配置档

  1. $ istioctl install

此命令在 Kubernetes 集群上安装 default 配置档。 default 配置档是建立生产环境的一个良好起点, 这和较大的 demo 配置档不同,后者常用于评估一组广泛的 Istio 特性。

可以配置各种设置来修改安装。比如,要启动访问日志:

  1. $ istioctl install --set meshConfig.accessLogFile=/dev/stdout

本页和文档其他地方的许多示例都是使用 --set 来修改安装参数, 而不是用 -f 传递配置文件。 这么做可以让例子更紧凑。 这两种方法是等价的,但强烈推荐在生产环境使用 -f。 上面的命令可以用 -f 写成如下的形式:

  1. # my-config.yaml
  2. apiVersion: install.istio.io/v1alpha1
  3. kind: IstioOperator
  4. spec:
  5. meshConfig:
  6. accessLogFile: /dev/stdout
  1. $ istioctl install -f my-config.yaml

完整的 API 记录在 IstioOperator API 参考文档。 通常,你可以像使用 Helm 一样,在 istioctl 中使用 --set 参数, 并且当前 Helm 的 values.yaml API 向后兼容。 唯一的区别是你必须给原有 values.yaml 路径前面加上 values. 前缀,这是 Helm 透传 API 的前缀。

从外部 chart 安装

默认情况下,istioctl 使用内置 chart 生成安装清单。 这些 chart 随同 istioctl 一起发布,用以满足审计和定制,你可以在发行包的 manifests 目录下找到它们。 istioctl 除了使用内置 chart 外,还可以使用外部 chart。 为了选择外部 chart,可以设置参数 manifests 指向本地文件系统路径:

  1. $ istioctl install --manifests=manifests/

如果使用 istioctl 1.12.2 版本的二进制文件,此命令将得到和独立运行 istioctl install 相同的结果, 这是因为它指向了和内置 chart 相同的 chart。 除非要实验或测试新特性,我们建议使用内置的 chart,而不是外部 chart,以保障 istioctl 与 chart 的兼容性。

安装一个不同的配置档

其他的 Istio 配置档,可以通过在命令行传递配置档名称的方式,安装到集群。 例如,下面命令可以用来安装 demo 配置档。

  1. $ istioctl install --set profile=demo

检查安装了什么

istioctl 命令把安装 Istio 的 IstioOperator CR 保存到一个叫 installed-state 的 CR 副本中。 故无须检查 Istio 安装的 deployments、 pods、 services等其他资源,例如:

  1. $ kubectl -n istio-system get deploy
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. istio-ingressgateway 1/1 1 1 49m
  4. istiod 1/1 1 1 49m

可以查看 installed-state CR,来了解集群中都安装了什么,也可以看到所有的定制设置。 例如:用下面命令将它的内容导出到一个 YAML 文件:

  1. $ kubectl -n istio-system get IstioOperator installed-state -o yaml > installed-state.yaml

在一些 istioctl 命令中,installed-state CR 被用于执行检查任务,因此不能删除:

展示可用配置档的列表

你可以用下面命令展示 istioctl 可以访问到的 Istio 配置档的名称:

  1. $ istioctl profile list
  2. Istio configuration profiles:
  3. default
  4. demo
  5. empty
  6. minimal
  7. openshift
  8. preview
  9. remote

展示配置档的配置信息

你可以浏览一个配置档的配置信息。例如,运行下面命令浏览 demo 配置档的设置信息:

  1. $ istioctl profile dump demo
  2. components:
  3. egressGateways:
  4. - enabled: true
  5. k8s:
  6. resources:
  7. requests:
  8. cpu: 10m
  9. memory: 40Mi
  10. name: istio-egressgateway
  11. ...

只浏览配置文件的某个部分的话,可以用 --config-path 参数,它将只选择配置文件中指定路径的局部内容:

  1. $ istioctl profile dump --config-path components.pilot demo
  2. enabled: true
  3. k8s:
  4. env:
  5. - name: PILOT_TRACE_SAMPLING
  6. value: "100"
  7. readinessProbe:
  8. httpGet:
  9. path: /ready
  10. port: 8080
  11. initialDelaySeconds: 1
  12. periodSeconds: 3
  13. timeoutSeconds: 5
  14. resources:
  15. requests:
  16. cpu: 10m
  17. memory: 100Mi
  18. strategy:
  19. rollingUpdate:
  20. maxSurge: 100%
  21. maxUnavailable: 25%

显示配置文件的差异

profile diff 子命令可用于显示配置档之间的差异, 它在把更改应用到集群之前,检查定制效果方面非常有用。

你可以使用此命令显示 default 和 demo 两个配置档之间的差异:

  1. $ istioctl profile diff default demo
  2. gateways:
  3. egressGateways:
  4. - - enabled: false
  5. + - enabled: true
  6. ...
  7. k8s:
  8. requests:
  9. - cpu: 100m
  10. - memory: 128Mi
  11. + cpu: 10m
  12. + memory: 40Mi
  13. strategy:
  14. ...

安装前生成清单文件

在安装 Istio 之前,可以用 manifest generate 子命令生成清单文件。 例如,用下面命令生成 default 配置档的清单文件:

  1. $ istioctl manifest generate > $HOME/generated-manifest.yaml

生成的清单文件可用于检查具体安装了什么,也可用于跟踪清单是如何随着时间而改变的。 虽然 IstioOperator CR 代表完整的用户配置,足以用于跟踪, 但 manifest generate 命令的输出还能截获底层 chart 潜在的改变,因此可以用于跟踪实际安装过的资源。

manifest generate 的输出还能传递给 kubectl apply 或类似的命令,用来安装 Istio。 然而,这些替代的安装方法不能像 istioctl install 那样,将相同的依赖顺序应用于资源, 并且也没有在 Istio 发行版中测试过。

如果尝试使用 istioctl manifest generate 安装和管理 Istio,请注意以下事项:

  1. Istio 的命名空间(默认为istio-system)必须手工创建。

  2. istioctl install 会在 Kubernetes 上下文中自动探测环境特定的设置, 但以离线运行的 manifest generate 不行,而且可能导致意外结果。 特别是,如果 Kubernetes 环境不支持第三方服务帐户令牌,则必须确保遵循这些步骤

  3. kubectl apply 执行生成的清单,会显示临时错误,这是因为集群中的资源进入可用状态的顺序有问题。

  4. istioctl install 自动清除一些资源,其实这些资源在配置改变时(例如,当你删除网关)就应该被删掉了。 但此机制在 kubectlistio manifest generate 协同使用时并不会发生,所以这些资源必须手动删除。

显示清单的差异

使用这一组命令,以 YAML 风格的差异对比方式,显示 default 配置项和定制安装生成的两个清单之间的差异:

  1. $ istioctl manifest generate > 1.yaml
  2. $ istioctl manifest generate -f operator/samples/pilot-k8s.yaml > 2.yaml
  3. $ istioctl manifest diff 1.yaml 2.yaml
  4. Differences of manifests are:
  5. Object Deployment:istio-system:istio-pilot has diffs:
  6. spec:
  7. template:
  8. spec:
  9. containers:
  10. '[0]':
  11. resources:
  12. requests:
  13. cpu: 500m -> 1000m
  14. memory: 2048Mi -> 4096Mi
  15. nodeSelector: -> map[master:true]
  16. tolerations: -> [map[effect:NoSchedule key:dedicated operator:Exists] map[key:CriticalAddonsOnly
  17. operator:Exists]]
  18. Object HorizontalPodAutoscaler:istio-system:istio-pilot has diffs:
  19. spec:
  20. maxReplicas: 5 -> 10
  21. minReplicas: 1 -> 2

验证安装是否成功

你可以用 verify-install 命令检查 Istio 是否安装成功,此命令用你指定的清单对比集群中实际的安装情况。

如果你在部署前还没有生成清单文件,那现在就运行下面命令生成一个:

  1. $ istioctl manifest generate <your original installation options> > $HOME/generated-manifest.yaml

紧接着运行 verify-install 命令,查看安装是否成功:

  1. $ istioctl verify-install -f $HOME/generated-manifest.yaml

定制配置

除了安装 Istio 内置的 配置档istioctl install 提供了一套完整的用于定制配置的API。

此 API 中的配置参数能用命令行选项 --set 独立设置。 例如,要在 default 配置档中启动调试日志特性,使用这个命令:

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

或者,可以在 YAML 文件中指定 IstioOperator 的配置,然后用 -f 选项传递给 istioctl

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

为了向后兼容,以前的 Helm 安装选项,除了 Kubernetes 资源设置之外,均被完整的支持。 为了在命令行设置他们,在选项名前面加上 “values.“。 例如,下面的命令覆盖了 Helm 配置选项 pilot.traceSampling

  1. $ istioctl install --set values.pilot.traceSampling=0.1

Helm 值也可以在 IstioOperator CR(YAML 文件)中设置,就像使用 Helm API 定制 Istio 设置 中描述的那样。

如果你需要配置 Kubernetes 资源方面的设置,请用定制 Kubernetes 设置中介绍的 IstioOperator API。

识别 Istio 组件

IstioOperator API 定义的组件如下面表格所示:

组件
base
pilot
ingressGateways
egressGateways
cni
istiodRemote

针对每一个组件的配置内容通过 components.<component name> 下的 API 中提供。 例如,要用 API 改变(改为 false)pilot 组件的 enabled 设置, 使用 --set components.pilot.enabled=false, 或在 IstioOperator 资源中就像这样来设置:

  1. apiVersion: install.istio.io/v1alpha1
  2. kind: IstioOperator
  3. spec:
  4. components:
  5. pilot:
  6. enabled: false

所有的组件共享一个通用 API,用来修改 Kubernetes 特定的设置,它在 components.<component name>.k8s 路径下, 后续章节将会进一步描述它。

定制 Kubernetes 设置

IstioOperator API 支持以一致性的方式定制每一个组件的 Kubernetes 设置。

每个组件都有一个 KubernetesResourceSpec, 它允许修改如下设置。 使用此列表标识要定制的设置:

  1. Resources
  2. Readiness probes
  3. Replica count
  4. HorizontalPodAutoscaler
  5. PodDisruptionBudget
  6. Pod annotations
  7. Service annotations
  8. ImagePullPolicy
  9. Priority class name
  10. Node selector
  11. Affinity and anti-affinity
  12. Service
  13. Toleration
  14. Strategy
  15. Env
  16. Pod security context

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

下面覆盖文件的例子调整 Pilot 的资源限制和 Pod 水平伸缩的设置:

  1. apiVersion: install.istio.io/v1alpha1
  2. kind: IstioOperator
  3. spec:
  4. components:
  5. pilot:
  6. k8s:
  7. resources:
  8. requests:
  9. cpu: 1000m # override from default 500m
  10. memory: 4096Mi # ... default 2048Mi
  11. hpaSpec:
  12. maxReplicas: 10 # ... default 5
  13. minReplicas: 2 # ... default 1
  14. nodeSelector:
  15. master: "true"
  16. tolerations:
  17. - key: dedicated
  18. operator: Exists
  19. effect: NoSchedule
  20. - key: CriticalAddonsOnly
  21. operator: Exists

istioctl install 把改变的设置应用到集群:

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

使用 Helm API 定制 Istio 设置

IstioOperator API 使用 values 字段为 Helm API 保留了一个透传接口。

下面的 YAML 文件通过 Helm API 来配置 global 和 Pilot 的设置:

  1. apiVersion: install.istio.io/v1alpha1
  2. kind: IstioOperator
  3. spec:
  4. values:
  5. pilot:
  6. traceSampling: 0.1 # override from 1.0
  7. global:
  8. monitoringPort: 15050

一些参数,比如 Kubernetes resources、namespaces、和开关设置,暂时并存在 Helm 和 IstioOperator APIs 中。 Istio 社区推荐使用 IstioOperator API ,因为它更一致、更有效、且遵循社区毕业流程.

配置网关

网关因为支持定义多个入站、出站网关,所以它是一种特殊类型的组件。 在 IstioOperator API 中,网关被定义为列表类型。 default 配置档会安装一个名为 istio-ingressgateway 的入站网关。 你可以检查这个网关的默认值:

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

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

从 1.7 开始,覆盖路由配置时必须指定路由名称。 不指定名称时,也不会再设置 istio-ingressgatewayistio-egressgateway 做为默认名称。

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

  1. apiVersion: install.istio.io/v1alpha1
  2. kind: IstioOperator
  3. spec:
  4. components:
  5. ingressGateways:
  6. - name: istio-ingressgateway
  7. enabled: true
  8. - namespace: user-ingressgateway-ns
  9. name: ilb-gateway
  10. enabled: true
  11. k8s:
  12. resources:
  13. requests:
  14. cpu: 200m
  15. serviceAnnotations:
  16. cloud.google.com/load-balancer-type: "internal"
  17. service:
  18. ports:
  19. - port: 8060
  20. targetPort: 8060
  21. name: tcp-citadel-grpc-tls
  22. - port: 5353
  23. name: tcp-dns

注意:Helm 的值(spec.values.gateways.istio-ingressgateway/egressgateway)被所有的入/出站网关共享。 如果必须为每个网关定制这些选项,建议你使用一个独立的 IstioOperator CR 来生成用户网关的清单,并和 Istio 主安装清单隔离。

  1. apiVersion: install.istio.io/v1alpha1
  2. kind: IstioOperator
  3. spec:
  4. profile: empty
  5. components:
  6. ingressGateways:
  7. - name: ilb-gateway
  8. namespace: user-ingressgateway-ns
  9. enabled: true
  10. # Copy settings from istio-ingressgateway as needed.
  11. values:
  12. gateways:
  13. istio-ingressgateway:
  14. debug: error

高级安装定制

定制外部 chart 和配置项

istioctlinstallmanifest generateprofile 命令可以使用以下任意源来生成 chart 和 配置档:

  • 内置的 chart。如果没有设置 --manifests,则用 default。 内置的 chart 和 Istio .tgz 发行包内 manifests/ 目录下的内容相同。
  • 本地文件系统中的chart,例如,istioctl install --manifests istio-1.12.2/manifests
  • GitHub 上的 chart,例如,istioctl install --manifests https://github.com/istio/istio/releases/download/1.12.2/istio-1.12.2-linux-arm64.tar.gz

本地文件系统的 chart 和配置档可以通过编辑 manifests/ 目录下的文件定制。 要进行广泛的更改,建议拷贝 manifests 目录,然后修改副本。 但请注意,manifests 目录中的内容结构必须要保留。

存放在目录 manifests/profiles/ 下面配置档,可编辑,也可通过创建一个指定配置档名称和 .yaml 新文件的方式来添加。 istioctl 扫描 profiles 子目录,所有找到的配置档都可以在 IstioOperatorSpec 的 profile 字段中通过名称引用。 在用户的覆盖配置被应用前,内建 profile 默认的 YAML 文件被覆写。 例如,你可以创建一个名为 custom1.yaml 的新profile,新配置档在 default 配置档的基础上定制了部分设置,然后应用用户的覆盖文件:

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

在此用例中,文件 custom1.yamluser-overlay.yaml 将覆盖 default.yaml 文件,以得到作为 manifest generation 输入的最终值。

通常,没有必要创建新的配置档,这是因为传入多个覆盖文件也可以达到同样的效果。 例如,上面命令等价于传入两个用户覆盖文件:

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

只有需要在 IstioOperatorSpec 中指向一个配置档名称时,才需要创建定制配置档。

为输出清单打补丁

传递给 istioctlIstioOperator CR,用于生成输出清单,该清单包含将应用到集群的 Kubernetes 资源。 在输出的清单已经生成但没有应用之时,此清单可以通过 IstioOperator 覆盖 API 深度定制以增加、修改、或删除资源。

下面例子覆盖文件(patch.yaml)展示输出清单补丁这种类型可以做什么:

  1. apiVersion: install.istio.io/v1alpha1
  2. kind: IstioOperator
  3. spec:
  4. profile: empty
  5. hub: docker.io/istio
  6. tag: 1.1.6
  7. components:
  8. pilot:
  9. enabled: true
  10. namespace: istio-control
  11. k8s:
  12. overlays:
  13. - kind: Deployment
  14. name: istiod
  15. patches:
  16. # Select list item by value
  17. - path: spec.template.spec.containers.[name:discovery].args.[30m]
  18. value: "60m" # overridden from 30m
  19. # Select list item by key:value
  20. - path: spec.template.spec.containers.[name:discovery].ports.[containerPort:8080].containerPort
  21. value: 1234
  22. # Override with object (note | on value: first line)
  23. - path: spec.template.spec.containers.[name:discovery].env.[name:POD_NAMESPACE].valueFrom
  24. value: |
  25. fieldRef:
  26. apiVersion: v2
  27. fieldPath: metadata.myPath
  28. # Deletion of list item
  29. - path: spec.template.spec.containers.[name:discovery].env.[name:REVISION]
  30. # Deletion of map item
  31. - path: spec.template.spec.containers.[name:discovery].securityContext
  32. - kind: Service
  33. name: istiod
  34. patches:
  35. - path: spec.ports.[name:https-dns].port
  36. value: 11111 # OVERRIDDEN

将此文件传给 istioctl manifest generate -f patch.yaml 会把上面的补丁应用到 default 配置档的输出清单。 两个打了补丁的资源将做如下修改(为了简洁,只显示资源的部分内容):

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: istiod
  5. spec:
  6. template:
  7. spec:
  8. containers:
  9. - args:
  10. - 60m
  11. env:
  12. - name: POD_NAMESPACE
  13. valueFrom:
  14. fieldRef:
  15. apiVersion: v2
  16. fieldPath: metadata.myPath
  17. name: discovery
  18. ports:
  19. - containerPort: 1234
  20. ---
  21. apiVersion: v1
  22. kind: Service
  23. metadata:
  24. name: istiod
  25. spec:
  26. ports:
  27. - name: https-dns
  28. port: 11111
  29. ---

注意:补丁按照给定的顺序执行。每个补丁基于前面补丁的输出来执行。 在补丁中的路径,如果在输出清单不存在,将被创建。

列出选中的项目目录

istioctl --set 参数和 IstioOperator CR 中的 k8s.overlays 字段,两者均支持由[index][value]、或 [key:value] 选中的列表项。 –set 参数也为资源中缺少的路径创建所有的中间节点。

卸载 Istio

要从集群中完整卸载 Istio,运行下面命令:

  1. $ istioctl x uninstall --purge

可选的 --purge 参数将删除所有 Istio 资源,包括可能被其他 Istio 控制平面共享的、集群范围的资源。

或者,只删除指定的 Istio 控制平面,运行以下命令:

  1. $ istioctl x uninstall <your original installation options>

  1. $ istioctl manifest generate <your original installation options> | kubectl delete -f -

控制平面的命名空间(例如:istio-system)默认不会删除, 如果确认不再需要,用下面命令删除它:

  1. $ kubectl delete namespace istio-system