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

admin 2024年12月27日12:28:51评论9 views字数 2961阅读9分52秒阅读模式

安装 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,它只会安装核心的控制面,具体差异见下图:深入解析 Istioctl:如何正确更新 Istio 配置?

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

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。

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

更新配置的坑

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

默认情况下 Istio 会将应用 Pod 的暴露出来的 metrics 和 sidecar 的指标合并在一起,然后暴露为 :15020/stats/prometheus 这个 endpoint。

而我们自己在 Pod 上定义的注解则是被覆盖掉了:深入解析 Istioctl:如何正确更新 Istio 配置?

但我们是将应用和 sidecar 的指标分开采集的,所以我们不需要这个自动合并。

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

会单独配置 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 的配置。

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

加上之后我重启了 Pod 发现依然还是 Istio 的注解:

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

也就是说这个配置并没有生效,即便是我把控制面也重启了也没有效果。

按照原理来说,这些配置应该是控制面下发给数据面的,大胆猜测下也就是控制面没有拿到最新的配置。

但是我卸载控制面,再安装的时候就指定这个配置确是生效的,也就是说配置没问题,只是我在安装完成后再修改就没法同步。

之后我在 stackoverflow 上找到了类似的问题:深入解析 Istioctl:如何正确更新 Istio 配置?

简单来说安装好 istio 之后我们也可以继续使用 istioctl install -f xx.yaml 进行更新。

原理

后来我仔细看了下 istioctl 这个命令的 help 文档,发现其实已经在描述里写清楚了:深入解析 Istioctl:如何正确更新 Istio 配置?甚至还有个别名就叫 apply 这就和 kubectl apply 的命令非常类似了,也更容易理解了,任何的修改只需要 apply 执行一次就可以了。

不过我也在好奇,既然创建的是一个 IstioOperator 的 CRD,理论上是需要一个 Operator 来读取这里的数据然后再创建一个控制面,同步配置之类的操作。

但当我安装好 Istio 之后并没看到有一个 Operator 的 Pod 在运行,所以就比较好奇 install 这个命令是如何实现配置同步的。

经过对 istioctl 的 debug 找到了具体的原因:

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

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

最后夹带一点私活,最近做了一个知识星球,已经试运行一段时间,效果还不错(具体详情可以扫码查看);感兴趣的朋友可以扫码领取优惠券以 49元的价格加入(支持三天内无条件退款)。

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

原文始发于微信公众号(crossoverJie):深入解析 Istioctl:如何正确更新 Istio 配置?

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月27日12:28:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   深入解析 Istioctl:如何正确更新 Istio 配置?https://cn-sec.com/archives/3559917.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息