1、Istio安装配置
Istio安装配置
本节实战
实战名称 |
---|
🚩 实战:istioctl 方式安装istio-2023.11.3(测试成功) |
🚩 实战:手动注入 Envoy Sidecar-2023.11.3(测试成功) |
🚩 实战:自动注入 Envoy Sidecar-2023.11.8(测试成功) |
🚩 实战:BookInfo 示例应用-2023.11.5(测试成功) |
🚩 实战:自定义一个端口访问应用-2023.11.6(测试成功) |
目录
[toc]
前言
前面在服务网格基础章节我们和大家已经了解了 Istio 的基本概念以及架构,本章节我们将来快速了解 Istio 的基本使用方法,对 Istio 有一个最基本的认识。
1、安装
安装 Istio 之前,需要准备一个 Kubernetes 集群,我们可以使用任何支持的平台,例如 Minikube、Kind、Kubeadm 等,但是需要注意的是目前的 Istio 最新版本为 v1.19.3 版本,不同的版本支持的 Kubernetes 版本不同,可以参考下表进行对照:
我们这里选择最新的版本为 v1.19.3,Kubernetes 版本为 v1.27.6:
$kubectlgetnodesNAMESTATUSROLESAGEVERSIONmaster1Readycontrol-plane43dv1.27.6node1Ready<none>43dv1.27.6node2Ready<none>43dv1.27.6
安装方式
在 Kubernetes 集群上安装 Istio 的方法有很多方式,可以根据自己的需求选择不同的安装方式,我们可以先对比下每种方式的优缺点。
1.使用 istioctl install
具有高安全性、简单的安装和管理方法,这也是社区推荐的安装方法。
优点:
完整的配置和运行状态的验证。
使用提供了扩展的配置、自定义选项的
IstioOperator
API。不需要集群内的高权限 Pod,通过执行
istioctl
命令修改。
缺点:
需要维护多个 Istio 版本的二进制文件。
istioctl
命令可能根据你的运行环境设置诸如JWT_POLICY
之类的值,从而在不同的 Kubernetes 环境中产生不同的安装结果。
整体来说,这里的缺点对我们可能影响不大。
2.使用 istioctl manifest generate 安装
生成 Kubernetes 的配置清单,并通过 kubectl apply --prune
命令应用到集群中。该方法适用于需要严格审查或者增加配置清单的情况。
优点:
Chart 是由与
istioctl install
和 Operator 里使用的相同的IstioOperator
API 生成的。使用提供了扩展的配置、自定义选项的
IstioOperator
API。
缺点:
一些在
istioctl install
和 Operator 中会进行的检查将不会执行。与
istioctl install
相比,UX 不够简洁。错误反馈没有
istioctl install
的详细、全面。
3.使用 Helm 安装
使用 Helm 的 Chart 可以通过 Helm 的工作流轻松的完成,并在升级的过程中自动清理资源。
优点:
使用熟悉、常用的行业标准工具。
Helm 原生的版本、升级管理。
缺点:
相比于
istioctl install
和 Operator 相比,检查较少。一些管理任务需要更多步骤,具有更高的复杂性。
4.使用 Istio Operator 安装
不建议在新安装时使用 Operator,虽然 Operator 将继续得到支持,但新的功能特性不会被优先考虑。
Istio Operator 提供了一种安装路径,无需使用 istioctl
二进制文件。这可以用于简化升级工作流程,不必担心在集群中运行特权控制器的问题。此方法适用于不需要严格审计或增加输出清单的情况。
优点:
与
istioctl install
相同的 API,但通过集群中的控制器 Pod 进行操作,实现了完全声明式操作。IstioOperator API
提供了广泛的配置/定制选项。不需要管理多个
istioctl
二进制文件。
缺点:
- 集群中运行的高权限控制器存在安全风险。
安装 Istio
==🚩 实战:istioctl
方式安装istio-2023.11.3(测试成功)==
实验环境:
k8sv1.25.4(containerd:[root@master1 ~]#istioctl versionclientversion:1.19.3controlplaneversion:1.19.3dataplaneversion:1.19.3(8 proxies)
实验软件:
能执行 istioctl
命令说明安装成功,但是提示 no ready Istio pods in "istio-system"
,这是因为我们还没有安装 Istio,接下来我们就来安装 Istio。
我们可以从其中一个 Istio 内置配置文件开始入手, 然后根据特定需求进一步自定义配置文件。
注意:这里的IstioOperator和我们之前k8s里Operator不一样,这里没有直接的控制器,它是通过istioctl命令来做的一些解析。
istioctl 能够识别的一个安装配置文件,只是这个配置文件采用了类似于K8s CRD的方式来声明而已,并没有对应的控制器Pod。
demo
:这个配置旨在展示 Istio 功能,具有适度的资源要求。它适合运行官方的 Bookinfo 示例应用和相关任务,比较适合用于快速入门的安装配置,比如我们这里就可以使用该配置。此配置文件启用了高级别的追踪和访问日志,因此不适合进行性能测试。我们也可以使用istioctl profile dump demo
命令来查看该配置文件的具体配置资源对象。minimal
:与默认配置文件相同,但只安装了控制平面组件。这样我们就可以使用单独的配置文件来配置控制平面和数据平面组件(例如网关)。remote
:用于配置一个远程集群, 这个从集群由外部控制平面管理, 或者由多集群网格的主集群中的控制平面管理。empty
:不部署任何内容,可以作为自定义配置的基本配置文件。preview
:预览文件包含的功能都属于实验性阶段。该配置文件是为了探索 Istio 的新功能。确保稳定性、安全性和性能(使用风险需自负)。ambient
:Ambient 配置文件用于帮助开始使用Ambient Mesh
。需要注意的是 Ambient 目前处于 Alpha 状态。请勿在生产环境中使用 Ambient 模式。openshift
:用于在 OpenShift 上安装 Istio。
除了安装 Istio 内置的配置之外,istioctl install
还提供了一套完整的用于定制配置的 API - IstioOperator API。
此 API 中的配置参数可以使用命令行选项 --set
进行独立设置,比如要在 default
配置中启动 debug
的日志特性,我们可以使用下面的命令:
$istioctlinstall--setvalues.global.logging.level=debug
或者,可以在 YAML 文件中指定 IstioOperator
的配置,然后用 -f
选项传递给 istioctl
即可:
$istioctlinstall-fsamples/operator/pilot-k8s.yaml
IstioOperator API
定义主要包括如下几个组件:
base
pilot
ingressGateways
egressGateways
cni
istiodRemote
针对每一个组件的配置内容通过 components.<component name>
下的 API 中提供。例如,要用 API 更改 pilot
组件的 enabled
设置, 可以使用 --set components.pilot.enabled=false
命令,或在 IstioOperator
资源中设置:
apiVersion:install.istio.io/v1alpha1kind:IstioOperatorspec:components:pilot:enabled:false
这样安装后就不会启动 pilot
组件了。
所有的组件共享一个通用 API,用来修改 Kubernetes 特定的设置,它在 components.<component name>.k8s
路径下,它允许修改如下设置:
- Resources
- Readiness probes
- Replica count
- HorizontalPodAutoscaler
- PodDisruptionBudget
- Pod annotations
- Service annotations
- ImagePullPolicy
- Priority class name
- Node selector
- Affinity and anti-affinity
- Service
- Toleration
- Strategy
- Env
- Pod security context
所有这些 Kubernetes 设置也就是平时我们使用的 Kubernetes API 定义,配置方式完全一样。比如我们要调整 Pilot 组件的资源限制和 Pod 水平伸缩,可以用如下所示的配置:
apiVersion:install.istio.io/v1alpha1kind:IstioOperatorspec:components:pilot:k8s:resources:requests:cpu:1000m# 覆盖默认的 500mmemory:4096Mi# ... 默认 2048MihpaSpec:maxReplicas:10# ... 默认 5minReplicas:2# ... 默认 1
然后我们就可以直接使用 istioctl install
把改变的设置应用到集群:
$istioctlinstall-fsamples/operator/pilot-k8s.yaml
🍀
了解了 Istio 安装的基本概念之后,我们就可以开始安装 Istio 了,我们这里选择 demo
配置文件进行安装,选择它是因为它包含了一组专为测试准备的功能集合,另外还有用于生产或性能测试的配置组合。
执行下面的命令即可:
$istioctlinstall--setprofile=demo-y✔Istiocoreinstalled✔Istiodinstalled✔Egressgatewaysinstalled✔Ingressgatewaysinstalled✔InstallationcompleteMadethisinstallationthedefaultforinjectionandvalidation.
可以看到上面的 demo
配置应用后,启用了 Istio core
、Istiod
、Egress gateways
、Ingress gateways
几个组件,这些组件都是通过 IstioOperator
API 进行配置的。
🍀
安装完成后会自动创建一个 istio-system
命名空间,包含如下几个 Pod,分别对应上面的几个组件:
[root@master1 ~]#kubectl get po -nistio-system
这其实也和 Istio 架构中的组件是一一对应的,我们可以再看下 Istio 架构图:
istio-egressgateway
:出口网关,用于处理出站流量。istio-ingressgateway
:入口网关,用于处理入站流量,接收传入的 HTTP/TCP 连接。istiod
:Istio 控制平面,用于管理和配置数据平面,提供服务网格的核心功能。
当然安装后并没有出现架构图上面的数据平面相关组件,这是因为数据平面的 Envoy Sidecar 代理是伴随应用 Pod 一起的,所以需要部署应用后才会出现。
安装成功。😘
2、注入 Envoy Sidecar
要为应用注入 Envoy Sidecar 代理有几种方法:
1.手动注入 Sidecar
==🚩 实战:手动注入 Envoy Sidecar-2023.11.3(测试成功)==
实验环境:
k8sv1.25.4(containerd:[root@master1 ~]#istioctl versionclientversion:1.19.3controlplaneversion:1.19.3dataplaneversion:1.19.3(8 proxies)
实验软件:
比如我们为一个 Deployment 手动注入 Sidecar,可以使用下面的方法:
默认情况下 Pod 的注入是基于 Sidecar 注入模板,在 istio-sidecar-injector
Configmap 中配置,我们可以将配置导出到本地,然后手动指定注入也可以:
然后指定输入文件,运行 kube-inject
并部署应用即可:
正常部署后我们的应用 Pod 中会多出一个 Sidecar 容器:
2.自定义注入
上面我们了解到 Pod 的注入是基于 istio-sidecar-injector
这个 Configmap 模板的,同样的我们也可以自行定义注入 Sidecar 代理。我们可以通过在 Pod 中手动添加一个 istio-proxy
容器来完成,Sidecar 注入将会把自定义的任何配置视为默认注入模板的覆盖。
自定义这些设置时,需格外小心,因为允许完全自定义生成的 Pod,包括进行一些更改而导致 Sidecar 容器无法正常运行。
例如,以下配置可自定义各种设置,包括降低 CPU 请求,添加 Volume 挂载,和添加 preStop Hook:
apiVersion:v1kind:Podmetadata:name:examplespec:containers:- name:helloimage:alpine- name:istio-proxy# 这个容器名需要叫 istio-proxyimage:auto# 设置为 auto,自动选择要使用的 Imageresources:requests:cpu:"100m"volumeMounts:- mountPath:/etc/certsname:certslifecycle:preStop:exec:command:["sleep","10"]volumes:- name:certssecret:secretName:istio-certs
一般来说 Pod 中的任何字段我们都可以配置,但是必须注意某些字段:
- Kubernetes 要求在注入运行之前配置 image,虽然可以可以设置一个指定的 Image 来覆盖默认的 image 配置,但建议将 image 设置为
auto
,可使 Sidecar 注入自动选择要使用的 Image。 - Pod 中一些字段取决于相关设置。例如,CPU 请求必须小于 CPU 限制。
3.自动注入 Sidecar
==🚩 实战:自动注入 Envoy Sidecar-2023.11.8(测试成功)==
实验环境:
k8sv1.27.6(containerd:[root@master1 ~]#istioctl versionclientversion:1.19.3controlplaneversion:1.19.3dataplaneversion:1.19.3(8 proxies)
实验软件: