Istio 安装过程中遇到的坑
安装 Istio
最近这段时间一直在做服务网格(Istio)相关的工作,背景是我们准备自建 Istio,首先第一件事情就是要安装。
我这里直接使用官网推荐的 istioctl 进行安装:
1 | $ cat <<EOF > ./my-config.yaml |
这里我使用的 profile 是 minimal,它只会安装核心的控制面,具体差异见下图:
输出以下内容时代表安装成功:
1 | This will install the Istio 1.18.5 minimal profile with ["Istio core" "Istiod"] components into the cluster. Proceed? (y/N) y |
之后我们便可以在指定的 namespace
下查询到控制面的 Pod:
1 | k get pod -n istio-1-18-5 |
然后只需要将需要注入 sidecar 的 namespace 中开启相关的配置即可,比如我这里将 test 这个 namespace 开启 sidecar 注入:
1 | apiVersion: v1 |
最主要的就是加上 istio.io/rev: istio-1-18-5
的标签,标签的值就是我们在安装 istio 时指定的值:revision: istio-1-18-5
。
此时只要我们在这个 namespace 下部署一个 Pod 就会为这个 Pod 挂载一个 sidecar。
更新配置的坑
默认情况下 Istio 会将应用 Pod 的暴露出来的 metrics 和 sidecar 的指标合并在一起,然后暴露为 :15020/stats/prometheus
这个 endpoint。
而我们自己在 Pod 上定义的注解则是被覆盖掉了:
但我们是将应用和 sidecar 的指标分开采集的,所以我们不需要这个自动合并。
会单独配置 15090 端口的采集任务
所以我需要将这个功能关闭,安装文档的说明只需要在控制面中将 enablePrometheusMerge
修改为 false 即可。
安装好 Istio 控制面之后会创建一个 IstioOperator 的 CRD 资源:
1 | k get IstioOperator -A |
所有控制面的配置都可以在这里面修改,所以我想当然的在这里加入了 enablePrometheusMerge: false
的配置。
加上之后我重启了 Pod 发现依然还是 Istio 的注解:
也就是说这个配置并没有生效,即便是我把控制面也重启了也没有效果。
按照原理来说,这些配置应该是控制面下发给数据面的,大胆猜测下也就是控制面没有拿到最新的配置。
但是我卸载控制面,再安装的时候就指定这个配置确是生效的,也就是说配置没问题,只是我在安装完成后再修改就没法同步。
之后我在 stackoverflow 上找到了类似的问题:
简单来说安装好 istio 之后我们也可以继续使用 istioctl install -f xx.yaml
进行更新。
原理
后来我仔细看了下 istioctl 这个命令的 help 文档,发现其实已经在描述里写清楚了:
甚至还有个别名就叫 apply
这就和 kubectl apply
的命令非常类似了,也更容易理解了,任何的修改只需要 apply
执行一次就可以了。
不过我也在好奇,既然创建的是一个 IstioOperator
的 CRD,理论上是需要一个 Operator 来读取这里的数据然后再创建一个控制面,同步配置之类的操作。
但当我安装好 Istio 之后并没看到有一个 Operator 的 Pod 在运行,所以就比较好奇 install
这个命令是如何实现配置同步的。
经过对 istioctl
的 debug 找到了具体的原因:
在 istioctl install -f xx.yaml
执行之后会直接解析 xx.yaml
里的 IstioOperator
生成所有的 manifest
资源,在这个过程中也会生成一个 ConfigMap
,所有的配置都是存放在其中的。
所以其实我手动修改这个 ConfigMap
也可以动态更新控制面的配置,之前我只是修改了 CRD,我以为还有一个 Operator 来监听这里的变化然后同步数据;实际上并不存在这个逻辑,而是直接应用的 manifest
。
参考链接: