<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>mixer | 伪架构师</title>
    <link>/tags/mixer/</link>
      <atom:link href="/tags/mixer/index.xml" rel="self" type="application/rss+xml" />
    <description>mixer</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Sat, 23 Mar 2019 01:55:47 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>mixer</title>
      <link>/tags/mixer/</link>
    </image>
    
    <item>
      <title>Istio 1.1 中的限流问题</title>
      <link>/post/ratelimit-in-istio-1-1/</link>
      <pubDate>Sat, 23 Mar 2019 01:55:47 +0800</pubDate>
      <guid>/post/ratelimit-in-istio-1-1/</guid>
      <description>

&lt;p&gt;在 &lt;a href=&#34;https://blog.fleeto.us/post/servicemesh-and-chasm/&#34; target=&#34;_blank&#34;&gt;Istio 1.1 发布&lt;/a&gt;之后，对 &lt;a href=&#34;https://item.jd.com/12527008.html&#34; target=&#34;_blank&#34;&gt;《深入浅出 Istio》&lt;/a&gt;一书中的例子&lt;a href=&#34;https://blog.fleeto.us/post/istio-book-update-for-1-1/&#34; target=&#34;_blank&#34;&gt;进行了一遍快速的检查&lt;/a&gt;，发现限流功能已经无法使用了。&lt;/p&gt;

&lt;p&gt;在解决了 &lt;a href=&#34;https://blog.fleeto.us/post/handler-in-istio-1-1/&#34; target=&#34;_blank&#34;&gt;Prometheus 的 Handler 问题&lt;/a&gt;之后，开始查看限流的问题。&lt;/p&gt;

&lt;h2 id=&#34;mixer-日志控制的两个小技巧&#34;&gt;Mixer 日志控制的两个小技巧&lt;/h2&gt;

&lt;p&gt;Mixer 策略相关内容比较多，经常需要查看 Policy 和 Telemetry 的日志，然而这两种进程的缺省日志都是很多的，可以用一点小技巧来进行清理。&lt;/p&gt;

&lt;h3 id=&#34;godebug&#34;&gt;GODEBUG&lt;/h3&gt;

&lt;p&gt;首先，Mixer 的两个 Deployment 中都会带有 &lt;code&gt;GODEBUG&lt;/code&gt; 环境变量，用于开启调试信息，可以使用 &lt;code&gt;kubectl edit&lt;/code&gt; 命令删除环境变量。&lt;/p&gt;

&lt;h3 id=&#34;controlz&#34;&gt;ControlZ&lt;/h3&gt;

&lt;p&gt;Istio 组件都带有 ControlZ 接口，可以用于控制和查看核心组件的一些配置信息，其端口都开放在 9876，可以用端口转发的方式打开进行调整，例如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ kubectl port-forward -n istio-system \
&amp;gt; istio-telemetry-c545bb9bd-x7jpz 9876:9876
Forwarding from 127.0.0.1:9876 -&amp;gt; 9876
Forwarding from [::1]:9876 -&amp;gt; 9876
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后就可以用浏览器打开 &lt;code&gt;http://127.0.0.1:9876&lt;/code&gt; 进行调整了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;images/controlz.png&#34; alt=&#34;controlz&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;言归正传&#34;&gt;言归正传&lt;/h2&gt;

&lt;p&gt;应用书中的 YAML 代码的同时，可以打开 Mixer 的日志，会发现其中有几行错误：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-plain&#34;&gt;error  failed to evaluate expression for field &#39;Dimensions[destination]&#39;; unknown attribute destination.service
error  Instance not found: instance=&#39;dest-quota.quota&#39;
error  No valid instances found                                                error  No valid actions found in rule
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里发现了一个无法识别的属性：&lt;code&gt;destination.service&lt;/code&gt;。翻查文档发现，该属性在 &lt;a href=&#34;https://archive.istio.io/v1.0/docs/reference/config/policy-and-telemetry/attribute-vocabulary/#deprecated-attributes&#34; target=&#34;_blank&#34;&gt;Istio 1.0 的 Reference&lt;/a&gt; 中声明即将过期;在 1.1 中已经停用，因此将其改为 &lt;code&gt;destination.service.host&lt;/code&gt; 即可正常使用。更新代码已经上传到随书代码库的 &lt;a href=&#34;https://github.com/fleeto/istio-for-beginner/tree/1.1&#34; target=&#34;_blank&#34;&gt;1.1 分支&lt;/a&gt;中的第八章内容里。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Istio 1.1 中的 Handler</title>
      <link>/post/handler-in-istio-1-1/</link>
      <pubDate>Fri, 22 Mar 2019 19:18:15 +0800</pubDate>
      <guid>/post/handler-in-istio-1-1/</guid>
      <description>&lt;p&gt;一直觉得 Mixer 的功能会比较不稳定，这次在&lt;a href=&#34;https://item.jd.com/12527008.html&#34; target=&#34;_blank&#34;&gt;《深入浅出 Istio》&lt;/a&gt;一书的的验证过程中发现，Prometheus 的部分无法工作了，因此今天排查一下，也因此有了些收获，这里做一个简单的记录。&lt;/p&gt;

&lt;p&gt;首先我发现，&lt;strong&gt;istio-system 中系统默认安装的 Prometheus 资源不见了&lt;/strong&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-plain&#34;&gt;$ kubectl get prometheus --all-namespaces
No resources found.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;但是好在相关的 Rule 还在，写法有了一些变化，例如 &lt;code&gt;istio-system&lt;/code&gt; 中的 &lt;code&gt;promtcp&lt;/code&gt; 的定义：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
...
  name: promtcp
  namespace: istio-system
spec:
  actions:
  - handler: prometheus
    instances:
    - tcpbytesent.metric
    - tcpbytereceived.metric
  match: context.protocol == &amp;quot;tcp&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;过去我们习惯的 Handler 填写一般会是 &lt;code&gt;handler.prometheus&lt;/code&gt;，也就是名为 handler 的 prometheus 资源。例如&lt;a href=&#34;https://istio.io/docs/tasks/telemetry/metrics/collecting-metrics/#collecting-new-metrics&#34; target=&#34;_blank&#34;&gt;官方文档&lt;/a&gt;中的写法：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;# Rule to send metric instances to a Prometheus handler
apiVersion: &amp;quot;config.istio.io/v1alpha2&amp;quot;
kind: rule
metadata:
  name: doubleprom
  namespace: istio-system
spec:
  actions:
  - handler: doublehandler.prometheus
    instances:
    - doublerequestcount.metric
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;很明显的，1.1 的用法发生了变更，这个新用法中并没有提及对象名称，只知道名字是 &lt;code&gt;prometheus&lt;/code&gt;。在 Istio 1.1 的 Helm 源码中搜索一下 &lt;code&gt;name: prometheus&lt;/code&gt; 就会看到，在 &lt;code&gt;helm/istio/charts/mixer/templates/config.yaml&lt;/code&gt; 中定义了一个对象，一个 &lt;code&gt;handler&lt;/code&gt; 类型的对象：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: &amp;quot;config.istio.io/v1alpha2&amp;quot;
kind: handler
metadata:
  name: prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这样就可以查查他的定义了，运行 &lt;code&gt;kubectl get -n istio-system handler prometheus -o yaml&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: config.istio.io/v1alpha2
kind: handler
metadata:
...
  name: prometheus
  namespace: istio-system
...
spec:
  compiledAdapter: prometheus
  params:
    metrics:
    - instance_name: requestcount.metric.istio-system
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;是的，这个名为 &lt;code&gt;prometheus&lt;/code&gt; 的 &lt;code&gt;handler&lt;/code&gt; 对象和以前几乎一毛一样。现在有两种定义 Prometheus 的 Handler 了，对此&lt;a href=&#34;https://discuss.istio.io/t/promethues-or-handler/1547&#34; target=&#34;_blank&#34;&gt;开发给出的解释&lt;/a&gt;是，并非所有 Adapter 都会创建自己的 CRD，因此推荐共用的 Handler 类型来进行定义。&lt;/p&gt;

&lt;p&gt;在 &lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/istio.policy.v1beta1/#Handler&#34; target=&#34;_blank&#34;&gt;Reference&lt;/a&gt; 中对这一对象做了个大概的讲解。需要注意其中的 &lt;code&gt;compiledAdapter: prometheus&lt;/code&gt;，用于指定 Adapter 类型。其中使用 &lt;code&gt;compiledAdapter&lt;/code&gt; 和 &lt;code&gt;adapter&lt;/code&gt; 两个字段分别用于描述进程内外的两种适配器类型。&lt;/p&gt;

&lt;p&gt;因此在 1.1 中，Handler 真正的成为了 Handler，下面给出一个简单的定义，来讲解一下自定义指标中，新 Handler 的定义方法，其中给指标定义名称为 &lt;code&gt;cxl_counter&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: config.istio.io/v1alpha2
kind: handler
metadata:
  labels:
    app: mixer
    chart: mixer
    heritage: Tiller
    release: istio
  name: prometheus
spec:
  compiledAdapter: prometheus
  params:
    metrics:
      - instance_name: cxl.metric.default
        kind: COUNTER
        label_names:
          - source_app
          - source_workload
          - source_workload_namespace
          - source_version
          - destination_app
          - destination_workload
          - destination_workload_namespace
          - destination_version
          - destination_service
          - destination_service_name
          - destination_service_namespace
          - reporter
          - response_code
        name: cxl_counter
    metricsExpirationPolicy:
      metricsExpiryDuration: 10m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;原有 Handler 的定义方式，同样的指标，定义为 &lt;code&gt;double_counter&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: config.istio.io/v1alpha2
kind: prometheus
metadata:
  name: handler
spec:
  metrics:
    - instance_name: cxl.metric.default
      kind: COUNTER
      label_names:
        - source_app
        - source_workload
        - source_workload_namespace
        - source_version
        - destination_app
        - destination_workload
        - destination_workload_namespace
        - destination_version
        - destination_service
        - destination_service_name
        - destination_service_namespace
        - reporter
        - response_code
      name: double_counter
  metricsExpirationPolicy:
    metricsExpiryDuration: 10m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;用一个 Rule，将同样的指标分别输出到两个 Handler 之中：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
  name: prom-http
spec:
  actions:
    - handler: prometheus
      instances:
        - cxl.metric
    - handler: handler.prometheus
      instances:
        - cxl.metric
  match: context.protocol == &amp;quot;http&amp;quot; || context.protocol == &amp;quot;grpc&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;而指标的定义不变：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: config.istio.io/v1alpha2
kind: metric
metadata:
  name: cxl
spec:
  dimensions:
    destination_app: destination.labels[&amp;quot;app&amp;quot;] | &amp;quot;unknown&amp;quot;
    destination_service: destination.service.host | &amp;quot;unknown&amp;quot;
    destination_service_name: destination.service.name | &amp;quot;unknown&amp;quot;
    destination_service_namespace: destination.service.namespace | &amp;quot;unknown&amp;quot;
    destination_version: destination.labels[&amp;quot;version&amp;quot;] | &amp;quot;unknown&amp;quot;
    destination_workload: destination.workload.name | &amp;quot;unknown&amp;quot;
    destination_workload_namespace: destination.workload.namespace | &amp;quot;unknown&amp;quot;
    source_app: source.labels[&amp;quot;app&amp;quot;] | &amp;quot;unknown&amp;quot;
    source_version: source.labels[&amp;quot;version&amp;quot;] | &amp;quot;unknown&amp;quot;
    source_workload: source.workload.name | &amp;quot;unknown&amp;quot;
    source_workload_namespace: source.workload.namespace | &amp;quot;unknown&amp;quot;
    reporter:
      conditional((context.reporter.kind | &amp;quot;inbound&amp;quot;) == &amp;quot;outbound&amp;quot;, &amp;quot;source&amp;quot;,
      &amp;quot;destination&amp;quot;)
    response_code: response.code | 200
  monitored_resource_type: &#39;&amp;quot;UNSPECIFIED&amp;quot;&#39;
  value: &amp;quot;2&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;制造请求之后，会发现新旧 Handler 同时工作，并用各自的名字写入了指标。在 Prometheus 中即可查看。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里真的要吐槽一句，Metric 定义中的所有 Label 需要照抄到 Handler 定义中，映射关系出错的时候，出的不是 Warning，而是 Panic。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;涉及到的代码已经更新到版本库的 &lt;a href=&#34;https://github.com/fleeto/istio-for-beginner/tree/1.1&#34; target=&#34;_blank&#34;&gt;1.1 分支&lt;/a&gt;的第八章内容里。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Istio Helm Chart 详解 - Mixer</title>
      <link>/post/istio-helm-deep-dive-mixer/</link>
      <pubDate>Mon, 05 Nov 2018 16:37:23 +0800</pubDate>
      <guid>/post/istio-helm-deep-dive-mixer/</guid>
      <description>

&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;

&lt;p&gt;Mixer 是 Istio 的核心组件之一，负责服务网格中的遥测和策略两部分重要功能，因此 Mixer 的部署也分成了 Policy 和 Telemetry 两部分。&lt;/p&gt;

&lt;h2 id=&#34;values-yaml-中的全局变量&#34;&gt;values.yaml 中的全局变量&lt;/h2&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;mixer:
  enabled: true
  replicaCount: 1
  autoscaleMin: 1
  autoscaleMax: 5
  image: mixer

  istio-policy:
    autoscaleEnabled: true
    autoscaleMin: 1
    autoscaleMax: 5
    cpu:
      targetAverageUtilization: 80

  istio-telemetry:
    autoscaleEnabled: true
    autoscaleMin: 1
    autoscaleMax: 5
    cpu:
      targetAverageUtilization: 80

  prometheusStatsdExporter:
    hub: docker.io/prom
    tag: v0.6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里看到，和我们前面说到的功能分离相同，Policy 和 Telemetry 两个组件也是分别设置了各自的变量。根据前面几篇的经验看，&lt;code&gt;istio-policy&lt;/code&gt; 和 &lt;code&gt;istio-telemetry&lt;/code&gt; 两部分是用于控制两个部署的自动伸缩。而 &lt;code&gt;prometheusStatsdExporter&lt;/code&gt; 部分则是指定了一个镜像，用于提供 Prometheus 监控使用。而从 &lt;code&gt;enable&lt;/code&gt; 位置来看，两个组件是不推荐单独启用的，但是 HPA 是可以分别设置的。&lt;/p&gt;

&lt;h2 id=&#34;rbac-相关&#34;&gt;RBAC 相关&lt;/h2&gt;

&lt;p&gt;这里可以看到，Mixer 的两个组件使用的是同一个 &lt;code&gt;istio-mixer-service-account&lt;/code&gt;，根据对 &lt;code&gt;clusterole.yaml&lt;/code&gt; 的观察，可以看到如下权限：&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组&lt;/th&gt;
&lt;th&gt;资源&lt;/th&gt;
&lt;th&gt;权限&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;config.istio.io&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读写&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rbac.istio.io&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读写&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apiextensions.k8s.io&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;customresourcedefinitions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;quot;configmaps&amp;quot;, &amp;quot;endpoints&amp;quot;, &amp;quot;pods&amp;quot;, &amp;quot;services&amp;quot;, &amp;quot;namespaces&amp;quot;, &amp;quot;secrets&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extensions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;replicasets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;config.istio.io&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;replicasets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;读&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;autoscale-yaml&#34;&gt;&lt;code&gt;autoscale.yaml&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;这里用了一个循环：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;{{- range $key, $spec := .Values }}
{{- if or (eq $key &amp;quot;istio-policy&amp;quot;) (eq $key &amp;quot;istio-telemetry&amp;quot;) }}
{{- if and $spec.autoscaleEnabled $spec.autoscaleMin }}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;分别遍历全局变量中的 &lt;code&gt;mixer.istio-policy&lt;/code&gt; 和 &lt;code&gt;mixer.istio-telemetry&lt;/code&gt;，使用各自的 HPA 参数对伸缩过程进行配置。&lt;/p&gt;

&lt;p&gt;两个 HPA 对象的名字来自上面的循环：&lt;code&gt;istio-policy&lt;/code&gt; 和 &lt;code&gt;istio-telemetry&lt;/code&gt;。引用变量包括这两个分组中的所有变量。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里不难发现 Mixer 中的根级变量 &lt;code&gt;autoscaleMin&lt;/code&gt;、&lt;code&gt;autoscaleMax&lt;/code&gt; 是无用的，该问题在新版本中已经修正。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;service-yaml&#34;&gt;&lt;code&gt;service.yaml&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;和 HPA 的情况类似，这里用循环的方式生成了两个 Service，分别为 &lt;code&gt;istio-policy&lt;/code&gt; 和 &lt;code&gt;istio-telemetry&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;端口方面，两个服务都开放了 &lt;code&gt;grpc-mixer&lt;/code&gt;、&lt;code&gt;grcp-mixer-mtls&lt;/code&gt; 以及 &lt;code&gt;http-monitoring&lt;/code&gt; 三个端口：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grpc-mixer: 9091&lt;/code&gt;：用于 Mixer 的 gRPC API 端口。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grpc-mixer-mtls: 15004&lt;/code&gt;：启用 mtls 的时候使用的 API 端口。如果启用了 controlPlaneAuthPolicy，则使用该端口进行 Mixer API 通信。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http-monitoring&lt;/code&gt;：用于监测 Mixer 存活状态。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另外如果是 &lt;code&gt;istio-telemetry&lt;/code&gt;，还多定义了一个端口 &lt;code&gt;prometheus&lt;/code&gt;，Prometheus 可以从这一端口获取遥测数据。&lt;/p&gt;

&lt;p&gt;此处仅引用了 &lt;code&gt;Chart&lt;/code&gt; 和 &lt;code&gt;Release&lt;/code&gt; 的全局变量。&lt;/p&gt;

&lt;h2 id=&#34;statsdtoprom-yaml&#34;&gt;&lt;code&gt;statsdtoprom.yaml&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;这个组件用来把 Envoy 的 Statsd 指标转换为 Promtheus 指标。这里包含了 Service 和 Deployment 两部分。&lt;/p&gt;

&lt;h3 id=&#34;deployment&#34;&gt;Deployment&lt;/h3&gt;

&lt;p&gt;这里实际上是引用了 Prom 的一个 &lt;a href=&#34;https://github.com/prometheus/statsd_exporter&#34; target=&#34;_blank&#34;&gt;Exporter&lt;/a&gt;，除了引用了 &lt;code&gt;Chart&lt;/code&gt; 和 &lt;code&gt;Release&lt;/code&gt; 全局变量之外，还使用了如下几个变量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prometheusStatsdExporter.hub&lt;/code&gt;：镜像仓库的地址。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prometheusStatsdExporter.tag&lt;/code&gt;：镜像版本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.imagePullPolicy&lt;/code&gt;：镜像拉取策略。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prometheusStatsdExporter.resources&lt;/code&gt;：可以定义这一 Pod 的资源使用策略。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nodeSelector&lt;/code&gt;：可以根据资源情况，为该 Pod 进行节点选择，避免资源争用。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;除去上面的变量之外，还可以看到如下信息：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;该 Pod 不接受自动注入。&lt;/li&gt;
&lt;li&gt;开放了 TCP 端口 9102 以及 UDP 端口 9125。&lt;/li&gt;
&lt;li&gt;加载一个 ConfigMap：istio-statsd-prom-bridge，用于配置文件。&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;上文提到的 Configmap 来自于模板文件 &lt;code&gt;configmap.yaml&lt;/code&gt;，这一文件没有提供任何额外配置。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&#34;service&#34;&gt;Service&lt;/h3&gt;

&lt;p&gt;这里声明了 Exporter 的端口使用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TCP 端口 9102 提供给 Prometheus 进行数据抓取。&lt;/li&gt;
&lt;li&gt;UDP 端口 9125，Envoy 会发送指标进入 Exporter。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;autoscale-yaml-1&#34;&gt;&lt;code&gt;autoscale.yaml&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;这里使用 &lt;code&gt;values.yaml&lt;/code&gt; 中定义的内容，分别给 Telemetry 和 Policy 两个组件定义了各自的自动伸缩。&lt;/p&gt;

&lt;p&gt;缺省情况下，都是最少单副本，最多 5 副本，平均 CPU 用量 80%。&lt;/p&gt;

&lt;h2 id=&#34;deployment-yaml&#34;&gt;&lt;code&gt;deployment.yaml&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;这个文件稍微有点古怪，首先分别定义了 &lt;code&gt;policy_container&lt;/code&gt; 和 &lt;code&gt;telemetry_container&lt;/code&gt; 两个模板，然后在文件尾部进行合并。&lt;/p&gt;

&lt;h3 id=&#34;policy-container&#34;&gt;policy_container&lt;/h3&gt;

&lt;p&gt;这个 Deployment 负责 Mixer 的策略实施功能，其主进程为 &lt;a href=&#34;https://istio.io/docs/reference/commands/mixs/&#34; target=&#34;_blank&#34;&gt;mixs&lt;/a&gt;，并且注入了 Sidecar。除了 Chart 和 Release 之外，引用全局变量包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;global.priorityClassName&lt;/code&gt;：&lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#pod-priority&#34; target=&#34;_blank&#34;&gt;Pod 优先级&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.hub&lt;/code&gt;：镜像仓库。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.tag&lt;/code&gt;：镜像标签。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image&lt;/code&gt;：镜像名称，如果名称中包含 &lt;code&gt;/&lt;/code&gt;，则忽略 &lt;code&gt;global.hub&lt;/code&gt; 和 &lt;code&gt;global.tag&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resource&lt;/code&gt; 和 &lt;code&gt;global.defaultResources&lt;/code&gt;：如果没有特别定义资源限制，则沿用 Chart 设计的缺省限制。&lt;strong&gt;需要注意的是，Policy 和 Telemetry 的两个组件，资源设置是共享的同一套值。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.controlPlaneSecurityEnabled&lt;/code&gt;：根据这个参数来设置 &lt;strong&gt;istio-proxy&lt;/strong&gt; 的 &lt;code&gt;--controlPlaneAuthPolicy&lt;/code&gt;，在 &lt;code&gt;MUTUAL_TLS&lt;/code&gt; 和 &lt;code&gt;NONE&lt;/code&gt; 之间选择。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;global.proxy.resources&lt;/code&gt; 和 &lt;code&gt;global.defaultResources&lt;/code&gt;：如果没有定义全局的 Proxy 资源限制，也会沿用缺省限制。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;mixs policy&lt;/code&gt; 进程使用了 &lt;code&gt;unix:///sock/mixer.socket&lt;/code&gt; 进行监听，这一点在 Envoy 配置中也有对应的处理。&lt;/p&gt;

&lt;h3 id=&#34;telemetry-container&#34;&gt;telemetry_container&lt;/h3&gt;

&lt;p&gt;该容器仅在命令行（&lt;code&gt;args&lt;/code&gt;）上和 &lt;code&gt;policy&lt;/code&gt; Pod 有差别，就无需介绍了。&lt;/p&gt;

&lt;h2 id=&#34;config-yaml&#34;&gt;&lt;code&gt;config.yaml&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;这里包含了 Mixer 初始配置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/istio.policy.v1beta1/#AttributeManifest&#34; target=&#34;_blank&#34;&gt;attributemanifest&lt;/a&gt;：

&lt;ul&gt;
&lt;li&gt;istioproxy：定义了 Sidecar 中的属性清单。&lt;/li&gt;
&lt;li&gt;kubernetes：Kubernetes 相关的属性清单。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/adapters/stdio/&#34; target=&#34;_blank&#34;&gt;stdio&lt;/a&gt;：定义使用 JSON 格式进行输出的 stdio handler。&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/templates/logentry/&#34; target=&#34;_blank&#34;&gt;logentry&lt;/a&gt;：定义了两个不同用途的日志模板实例，用不同属性组成不同内容，用于记录访问日志：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;accesslog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcpaccesslog&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/templates/metric/&#34; target=&#34;_blank&#34;&gt;metric&lt;/a&gt; 对象用于定义遥测数据的结构清单：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requestcount&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requestduration&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requestsize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;responsesize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcpbytesent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcpbytereceived&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/adapters/prometheus/&#34; target=&#34;_blank&#34;&gt;prometheus&lt;/a&gt; Handler：把前面定义的 &lt;code&gt;metric&lt;/code&gt; 实例逐个映射为 Prometheus 的监控指标。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/adapters/kubernetesenv/&#34; target=&#34;_blank&#34;&gt;kubernetesenv&lt;/a&gt;：该 Handler 为 Mixer 提供 Kubernetes 集群的连接。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/templates/kubernetes/&#34; target=&#34;_blank&#34;&gt;kubernetes&lt;/a&gt;：用于生成 Kubernetes 相关的数据。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/policy-and-telemetry/istio.policy.v1beta1/&#34; target=&#34;_blank&#34;&gt;rule&lt;/a&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stdio&lt;/code&gt;：定义一条规则，将 &lt;code&gt;http&lt;/code&gt; 和 &lt;code&gt;grpc&lt;/code&gt; 协议的访问日志，用 &lt;code&gt;accesslog&lt;/code&gt; 的样式输出到 &lt;code&gt;stdio&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stdiotcp&lt;/code&gt;：定义一条规则，将 &lt;code&gt;http&lt;/code&gt; 和 &lt;code&gt;grpc&lt;/code&gt; 协议的访问日志，用 &lt;code&gt;tcpaccesslog&lt;/code&gt; 的样式输出到 &lt;code&gt;stdio&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;promhttp&lt;/code&gt;：将 &lt;code&gt;http&lt;/code&gt; 和 &lt;code&gt;grpc&lt;/code&gt; 协议产生的 &lt;code&gt;requestcount&lt;/code&gt;、&lt;code&gt;requestduration&lt;/code&gt;、&lt;code&gt;requestsize&lt;/code&gt; 以及 &lt;code&gt;responsesize&lt;/code&gt; 四种指标送入前面建立的 Prometheus handler。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;promtcp&lt;/code&gt;：将 &lt;code&gt;tcp&lt;/code&gt; 协议产生的 &lt;code&gt;tcpbytesent&lt;/code&gt; 和 &lt;code&gt;tcpbytereceived&lt;/code&gt; 指标送入前面建立的 Prometheus handler。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubeattrgenrulerule&lt;/code&gt;：将 &lt;code&gt;kubernetesenv&lt;/code&gt; 生成的数据交由 &lt;code&gt;kubernetes&lt;/code&gt; 属性模板处理。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcpkubeattrgenrulerule&lt;/code&gt;：将 &lt;code&gt;kubernetesenv&lt;/code&gt; 生成的 tcp 通信相关数据交由 &lt;code&gt;kubernetes&lt;/code&gt; 属性模板处理。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;目标规则：两条规则分别定义了到 policy 和 &lt;code&gt;telemetry&lt;/code&gt;控制器的连接池，如果启用了 &lt;code&gt;controlPlaneSecurityEnabled&lt;/code&gt;，则加入对 15004 端口的 tls 定义。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;

&lt;p&gt;在 Istio 中 Mixer 一直是一个备受争议的组件，一方面表达了 Istio 的远大设计目标，另一方面因为自身结构以及众多 Adapter 的缺陷，持续遭到用户诟病，因此也是目前为止部署体系变化最大的一块，相信后续版本中，Mixer 还会做出频繁的好的和坏的变更。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>试译：Mixer 的适配器模型</title>
      <link>/post/mixer-modal-of-istio/</link>
      <pubDate>Fri, 10 Nov 2017 09:53:02 +0800</pubDate>
      <guid>/post/mixer-modal-of-istio/</guid>
      <description>

&lt;p&gt;原文：&lt;a href=&#34;https://istio.io/blog/2017/adapter-model.html&#34; target=&#34;_blank&#34;&gt;Mixer Adapter Model&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mixer 插件架构概述&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Istio 0.2 引入了新的 Mixer 适配器模型，从而具有了更大的灵活性去接入各种基础设施后端。本文尝试讲述这一模型及其工作机制。&lt;/p&gt;

&lt;h2 id=&#34;为什么是适配器模型&#34;&gt;为什么是适配器模型？&lt;/h2&gt;

&lt;p&gt;各种基础设施都提供了用于支持服务构建的功能，例如访问控制、遥测、配额、计费等等。传统服务会直接和这些后端系统打交道，和后端紧密耦合，并集成其中的个性化语义以及用法。&lt;/p&gt;

&lt;p&gt;Mixer 服务构成了基础设施和 Istio 之间的抽象层。Istio 组件和运行于 Service Mesh 中的服务，借助 Mixer 的能力就能在不直接访问后端接口的情况下和这些后端进行交互。&lt;/p&gt;

&lt;p&gt;Mixer 除了作为应用和基础设施之间的隔离层之外，操作者还可以借助 Mixer 的中介模型，注入或者操作应用和后端之间的策略，例如哪些数据需要报告给哪些后端、哪些后端提供认证等。&lt;/p&gt;

&lt;p&gt;每种后端都有各自不同的接口和操作方式，因此 Mixer 需要有代码来支持这种差异，我们称这些内容为&lt;a href=&#34;https://github.com/istio/istio/wiki/Mixer-Adapter-Dev-Guide&#34; target=&#34;_blank&#34;&gt;适配器&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;适配器是 Go 包的形式存在的，直接链接到 Mixer 二进制中。如果缺省适配器无法满足特定的用例，创建自己的适配器也是比较简单的。&lt;/p&gt;

&lt;h2 id=&#34;哲学&#34;&gt;哲学&lt;/h2&gt;

&lt;p&gt;本质上 Mixer 这个模块就是用来处理属性和路由的。代理把&lt;a href=&#34;https://istio.io/docs/concepts/policy-and-control/attributes.html&#34; target=&#34;_blank&#34;&gt;属性&lt;/a&gt;作为前置检查和遥测报告的一部分发送出来，转换为对适配器的一系列调用。运维人员提供了用于描述如何将属性转换为适配器指令的配置。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://istio.io/docs/concepts/policy-and-control/img/mixer-config/machine.svg&#34; alt=&#34;Attribute Machine&#34; /&gt;&lt;/p&gt;

&lt;p&gt;配置是一个复杂的任务。有证据表明，绝大多数的服务中断都来自于配置错误。为了解决这一问题，Mixer 加入了很多限制来避免错误。例如在配置中使用强类型，以此保障在任何上下文中都只能使用有意义的属性或表达式。&lt;/p&gt;

&lt;h2 id=&#34;handler-适配器的配置&#34;&gt;Handler：适配器的配置&lt;/h2&gt;

&lt;p&gt;Mixer 使用的每个适配器都需要一些配置来进行操作。一般来说适配器需要一些数据进项实例化，例如后端的 URL、认证信息、缓存选项等等。每个适配器使用一个 &lt;a href=&#34;https://developers.google.com/protocol-buffers/&#34; target=&#34;_blank&#34;&gt;protobuf&lt;/a&gt; 消息来定义所需的配置数据。&lt;/p&gt;

&lt;p&gt;可以通过创建 &lt;a href=&#34;https://istio.io/docs/concepts/policy-and-control/mixer-config.html#handlers&#34; target=&#34;_blank&#34;&gt;Handler&lt;/a&gt; 的方式来为适配器提供配置。Handler 就是一套能让一个适配器就绪的完整配置。对同一个适配器可以有任意数量的 Handler，这样就可以在不同场景下复用了。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;例如：memquota 适配器，可以配置多个不同的 Handler，用于进行不同的限制。
或者同类服务的不同服务端点的实例&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;template-模板-适配器的输入结构-schema&#34;&gt;Template（模板？）：适配器的输入结构（Schema）&lt;/h2&gt;

&lt;p&gt;一个请求到达 Mesh 中的服务时，一般会发生两次对 Mixer 的调用，一次是前置检查，一次是遥测报告。每一次这种调用，Mixer 都需要调用一个或更多的适配器。不同的适配器需要不同的数据块作为输入来进行处理。例如日志适配器需要日志输入，指标适配器需要指标输入，认证适配器需要凭据输入。适配器在请求时消费的数据就是由 Mixer 的 &lt;a href=&#34;https://istio.io/docs/reference/config/mixer/template/&#34; target=&#34;_blank&#34;&gt;Template&lt;/a&gt; 来描述的。&lt;/p&gt;

&lt;p&gt;每个 Template 对应一个 protobuf 消息。在运行时一个 Templates 描述了一系列的发送给一或多个适配器的数据。适配器和 Template 是多对多的关系，其对应关系由开发者决定。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/reference/config/mixer/template/metric.html&#34; target=&#34;_blank&#34;&gt;Metric（指标）&lt;/a&gt;和&lt;a href=&#34;https://istio.io/docs/reference/config/mixer/template/logentry.html&#34; target=&#34;_blank&#34;&gt;Logentry（日志条目）&lt;/a&gt;是最重要的两个 Template，分别用于描述工作负载的一个指标和一条日志。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Template 定义同样来自于 Adapter&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;instances-实例-属性映射&#34;&gt;Instances(实例？) ：属性映射&lt;/h2&gt;

&lt;p&gt;创建 &lt;a href=&#34;https://istio.io/docs/concepts/policy-and-control/mixer-config.html#instances&#34; target=&#34;_blank&#34;&gt;Instance&lt;/a&gt; 用于决定把什么数据发送给特定的适配器。Instance 决定了 Mixer 如何把来自代理的属性拆分为各种数据然后分发给不同的适配器。&lt;/p&gt;

&lt;p&gt;一般来说需要使用 &lt;a href=&#34;https://istio.io/docs/concepts/policy-and-control/mixer-config.html#attribute-expressions&#34; target=&#34;_blank&#34;&gt;Attribute Expression&lt;/a&gt; 来创建 Instance。属性表达式的功能是使用属性和常量来生成可以给 Instance 字段赋值的结果。&lt;/p&gt;

&lt;p&gt;每个 Instance 字段都有类型，类型的定义来自于 Template，每个&lt;a href=&#34;https://github.com/istio/api/blob/master/mixer/v1/config/descriptor/value_type.proto&#34; target=&#34;_blank&#34;&gt;属性也有类型&lt;/a&gt;，然后每个属性表达式还是有类型。只有类型一致的情况才可以进行赋值。例如不能把整数型的表达式赋值给字符串字段。强类型设计的目的就是降低配置出错引发的风险。&lt;/p&gt;

&lt;h2 id=&#34;rules-规则-把数据分发给适配器&#34;&gt;Rules（规则）：把数据分发给适配器&lt;/h2&gt;

&lt;p&gt;拼图的最后一块就是 &lt;a href=&#34;https://istio.io/docs/concepts/policy-and-control/mixer-config.html#rules&#34; target=&#34;_blank&#34;&gt;Rules&lt;/a&gt;，他负责告诉 Mixer，哪个 Instance 应该在什么时候发送给哪个 Handler。每个 Rule 包含了一系列的 Instance，以及将要发送这些 Instance 的目标 Handler。Mixer 被触发以后，就会调用指定的 Handler，令其处理指定的 Instance。&lt;/p&gt;

&lt;p&gt;Rules 包含有匹配断言，这一断言是一个返回布尔值的属性表达式。只有断言成功的属性表达式才会触发 Handler。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;符合条件的 Instance 被发给 Handler&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;未来&#34;&gt;未来&lt;/h2&gt;

&lt;p&gt;我们一直在尝试提高适配器的使用和开发的端到端体验。例如计划中包含很多特性来帮助用户更方便的创建 Tempalte。另外表达式语言也在不断地发展和成熟。&lt;/p&gt;

&lt;p&gt;长期来看，我们在评估如何让适配器不再直接连入 Mixer 的方式，这样会更加方便的进行开发和使用。&lt;/p&gt;

&lt;h2 id=&#34;结论&#34;&gt;结论&lt;/h2&gt;

&lt;p&gt;新的 Mixer 适配器模型，设计目的是提供一个有弹性的框架，以此支持开放的基础设施后端。&lt;/p&gt;

&lt;p&gt;Handler 为适配器提供了配置，Template 在运行时能够决定不同的适配器需要的数据种类，数据经由 Instance，被 Rules 发送给一个或多个 Handler。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://istio.io/docs/concepts/policy-and-control/&#34; target=&#34;_blank&#34;&gt;策略和控制&lt;/a&gt;中介绍了更多的 Mixer 架构的内容，&lt;a href=&#34;https://istio.io/docs/reference/config/mixer/&#34; target=&#34;_blank&#34;&gt;Mixer 参考&lt;/a&gt;包含更多的 Template、Handler 以及 Rules 的内容。&lt;a href=&#34;https://github.com/istio/istio/tree/master/samples/bookinfo/kube&#34; target=&#34;_blank&#34;&gt;Bookinfo 示例中&lt;/a&gt;提供了对应的示例文件。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
