深入解析 Istioctl:如何正确更新 Istio 配置?

开发 前端
在 istioctl install -f xx.yaml 执行之后会直接解析 xx.yaml 里的 IstioOperator 生成所有的 manifest 资源,在这个过程中也会生成一个 ConfigMap,所有的配置都是存放在其中的。

安装 Istio

最近这段时间一直在做服务网格(Istio)相关的工作,背景是我们准备自建 Istio,首先第一件事情就是要安装。

我这里直接使用官网推荐的 istioctl 进行安装:

$ cat <<EOF > ./my-config.yaml
apiVersion: install.istio.io/v1alpha1  
kind: IstioOperator  
metadata:  
  namespace: istio-1-18-5  
spec:  
  profile: minimal  
  revision: istio-1-18-5  
  meshConfig:  
    accessLogFile: /dev/stdout
EOF
$ istioctl install -f my-config.yaml -n istio-1-18-5

这里我使用的 profile 是 minimal,它只会安装核心的控制面,具体差异见下图:

图片图片

输出以下内容时代表安装成功:

This will install the Istio 1.18.5 minimal profile with ["Istio core" "Istiod"] components into the cluster. Proceed? (y/N) y
✔ Istio core installed                                                                                                                                   
✔ Istiod installed                                                                         
✔ Installation complete

之后我们便可以在指定的 namespace 下查询到控制面的 Pod:

k get pod -n istio-1-18-5
NAME                                   READY   STATUS    RESTARTS   AGE
istiod-istio-1-18-5-6cb9898585-64jtg   1/1     Running   0          22h

然后只需要将需要注入 sidecar 的 namespace 中开启相关的配置即可,比如我这里将 test 这个 namespace 开启 sidecar 注入:

apiVersion: v1
kind: Namespace
metadata:
  labels:
    istio.io/rev: istio-1-18-5
    kubernetes.io/metadata.name: test

最主要的就是加上 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 资源:

k get IstioOperator -A
NAMESPACE      NAME                           REVISION       STATUS   AGE
istio-1-18-5   installed-state-istio-1-18-5   istio-1-18-5            27h

所有控制面的配置都可以在这里面修改,所以我想当然的在这里加入了 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。

参考链接:

  • https://istio.io/v1.18/docs/setup/install/istioctl
  • https://istio.io/latest/docs/ops/integrations/prometheus/#option-1-metrics-merging
  • https://stackoverflow.com/questions/70076326/how-to-update-istio-configuration-after-installation

责任编辑:武晓燕 来源: crossoverJie
相关推荐

2024-08-08 11:13:05

2010-09-25 15:30:10

虚拟化

2009-12-03 13:10:06

2024-12-06 10:43:27

2009-12-02 13:07:27

PHP XMLRead

2010-05-21 18:33:02

2010-01-07 16:50:54

Linux配置PHP环

2009-12-14 15:37:35

Ruby on Rai

2016-05-18 17:15:17

互动出版网

2020-08-12 11:05:32

Vue 源码应用

2010-09-27 09:33:29

2022-08-02 09:56:47

入口文件代码

2011-08-08 11:24:05

网络配置Windows XP

2010-03-22 15:28:19

Cisco交换机配置

2010-02-23 10:51:32

WCF Address

2013-11-26 16:32:47

Android关机移动编程

2010-09-17 15:44:21

网络协议

2023-12-05 07:21:17

IstioEnvoy

2010-10-09 11:20:13

2016-10-31 19:41:29

Java垃圾回收
点赞
收藏

51CTO技术栈公众号