关于Sidecar注入以及问题记录
安装 Sidecar注入为了充分利用 Istio 的所有特性,网格中的 Pod 必须运行一个 Istio Sidecar 代理。 下面的章节描述了向 Pod 中注入 Istio Sidecar 的两种方法:使用 istioctl 手动注入或启用 Pod 所属命名空间的 Istio Sidecar 注入器自动注入。 当 Pod 所属命名空间启用自动注入后,自动注入器会使用准入控制器在创建 Pod 时自动注入代理配置。 手动注入直接修改配置,如 Deployment,并将代理配置注入其中。 如果您不确定使用哪一种方法,建议使用自动注入。 自动注入 Sidecar使用 Istio 提供的准入控制器变更 Webhook, 可以将 Sidecar 自动添加到可用的 Kubernetes Pod 中。 虽然准入控制器默认情况下是启用的,但一些 Kubernetes 发行版会禁用这些控制器。 如果出现这种情况,根据指示说明来启用准入控制器。 当您在一个命名空间中设置了 istio-injection=enabled 标签,且 Injection Webhook 被启用后,任何新的 Pod...
gRPC协议在K8S环境下的负载问题
gRPC协议在K8S环境下的负载问题参考: https://www.lixueduan.com/posts/grpc/13-loadbalance-on-k8s/ https://www.cyub.vip/2021/11/09/k8s%E7%8E%AF%E5%A2%83%E4%B8%8B%E9%83%A8%E7%BD%B2grpc%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%A1%88/ 概述系统中多个服务间的调用用的是 gRPC 进行通信,最初没考虑到负载均衡的问题,因为用的是 Kubernetes,想的是直接用 K8s 的 Service 不就可以实现负载均衡吗。 但是真正测试的时候才发现,所有流量都进入到了某一个 Pod,这时才意识到负载均衡可能出现了问题。 因为 gRPC 是基于 HTTP/2 之上的,而 HTTP/2 被设计为一个长期存在的 TCP 连接,所有请求都通过该连接进行多路复用。 这样虽然减少了管理连接的开销,但是在负载均衡上又引出了新的问题。 由于我们无法在连接层面进行均衡,为了做 gRPC...
EnvoyFilter-ChatGPT译文
介绍 EnvoyFilter 提供了一种机制,可以自定义 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 修改某些字段的值、添加特定过滤器,甚至添加全新的监听器、集群等。这个功能必须小心使用,因为不正确的配置可能会破坏整个网格。与其他 Istio 网络对象不同,EnvoyFilters 是附加应用的。在特定命名空间中给定工作负载可以存在任意数量的 EnvoyFilters 。这些 EnvoyFilters 的应用顺序如下:所有位于配置根命名空间中的 EnvoyFilters ,然后是匹配工作负载命名空间中所有匹配到的 EnvoyFilters。 注意点注意1:此 API 的某些方面与 Istio 网络子系统以及Envoy XDS API 的内部实现密切相关。虽然EnvoyFilter API本身将保持向后兼容性,但通过此机制提供的任何 envoy 配置都应该在Istio代理版本升级时进行仔细监控,以确保已弃用字段被适当地删除和替换。 注意2:当多个Envoy Filters...
idea添加对istio的智能提示
转自: https://blog.51cto.com/u_15127588/3305078 JetBrains 系列 IDE 有一个非常好用的 Kubernetes 的官方插件:JetBrains Kubernetes Plugin 。该插件支持资源对象关键字的自动补全和语法检查,这对于编写或者修改 YAML 文件非常方便。但是此前版本不支持 自定义的 CRD 对象,这对于该插件的易用性来说,略有一些遗憾。 现在新版的 Kubernetes 插件已经支持通过文件导入或者 URL 导入 CRD 定义文件,从而支持任意 CRD 资源对象的关键字自动补全和语法检查。 12Custom resource definition (CRD) supportCustom resources can be validated by providing complementary OpenAPI 2.0 files with CRD schemas and/or CRD resource definitions (YAML) (limited support). 下面以服务网格 Istio...
istio问题整理
1. Service 端口命名约束Istio 支持多平台,不过 Istio 和 Kubernetes 的兼容性是最优的,不管是设计理念,核心团队还是社区,都有一脉相承的意思。但 Istio 和 Kubernetes 的适配并非完全没有冲突,一个典型问题就是 Istio 需要 Kubernetes service 按照协议进行端口命名(port naming)。 端口命名不满足约束而导致的流量异常,是使用 mesh 过程中最常见的问题,其现象是协议相关的流控规则不生效,这通常可以通过检查该 port LDS 中 filter 的类型来定位。 原因Kubernetes 的网络对应用层是无感知的,Kubernetes 的主要流量转发逻辑发生在 node 上,由 iptables/ipvs 来实现,这些规则并不关心应用层里是什么协议。 Istio 的核心能力是对 7 层流量进行管控,但前提条件是 Istio 必须知道每个受管控的服务是什么协议,istio 会根据端口协议的不同,下发不同的流控功能(envoy filter),而 Kubernetes...
利用istio实现灰度发布
Kubernetes 中如何实现灰度发布当你Kubernetes 集群中部署业务时,可以利用 Kubernetes 原生提供的灰度发布的方式去上线业务。这种方式是通过在旧版本和新版本的服务之间,定义一个差异化的 Label,根据不同版本之间的公共 Label 负载流量到后端 Pod,最终实现根据 Pod 的副本数控制流量的百分比。 如下图所示:用户定义了两个 Deployment 对象,其中旧版本名为 frontend-stable,有3个副本。新版本为 frontend-canary,有1个副本。此时定义了一个 Service 对象,使用它们之间公共的 Label 进行选择。这就使得用户访问 frontend 这个 Service 时,能以 3:1 的比例同时访问到两个版本。并且还可以通过调整副本数持续控制流量比例,最终达到完整上线。 Kubernetes 默认的实现方式在简单的部署场景下很有效,但是在一些复杂场景中,仍然会有较大的局限,如: 业务配置自动伸缩后,会直接影响灰度发布的流量比例 低百分比的流量控制占用资源高,如 1 % 的流量到达新版本,则至少需要 100...
单环境,多分支并行开发方案(流量染色/istio)
需求 同一套环境, 两个微服务serviceA和serviceB, 且分别有2个版本original, v1 调用链路: serviceA -> serviceB 具体分为以下几种情况 如果serviceA和serviceB都有v1版本 serviceA(v1) -> serviceB(v1) 如果serviceA有v1版本, serviceB没有 serviceA(v1) -> serviceB(original) 如果serviceA没有v1版本, 而serviceB有 serviceA(original) -> serviceB(v1) 技术方案流量染色 什么是流量染色 在元数据中心(这里可以代指我们的k8s集群),维护每个环境对应的服务列表;在流量的入口处,对请求添加标识;在基础框架层,对流量标识进行解析、透传 和 服务路由。 实际操作一般是在我们的 HTTP...
记录jaeger的安装及简单使用
前言Jaeger 是一个开源的端到端的分布式跟踪系统, 允许用户在复杂的分布式系统中监控和排查故障。 利用Rancher的安装方式安装cert-manager参考文档: jaeger requires:https://www.jaegertracing.io/docs/1.49/operator/#prerequisite cmctl(the tool which is to manage and verify cert-manager) install:https://cert-manager.io/v1.6-docs/usage/cmctl/#installation cert-manager...
查看Envoy访问日志
简介: istio-proxy也是我们常说的sidecar,istio默认使用envoy注入的,envoy的日志级别包括trace, debug, info, warning, error, critical, off Envoy 访问日志记录了通过 Envoy 进行请求 / 响应交互的相关记录,可以方便地了解具体通信过程和调试定位问题。 修改日志级别的几种方式全局配置istio配置都是在configmap中的,可以通过修改configmap来修改全局的proxy日志级别: 开启 Envoy 访问日志,执行以下命令修改 istio 配置1kubectl -n istio-system edit configmap istio 1234data: mesh: |- accessLogEncoding: JSON accessLogFile: /dev/stdout 其中,accessLogEncoding表示 accesslog 输出格式,Istio 预定义了 TEXT 和 JSON 两种日志输出格式。默认使用 TEXT,通常改成 JSON...