<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>K8s on Hxysayhi</title>
    <link>https://hxysayhi.github.io/tags/k8s/</link>
    <description>Recent content in K8s on Hxysayhi</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 25 Jul 2022 20:27:32 +0000</lastBuildDate>
    <atom:link href="https://hxysayhi.github.io/tags/k8s/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>envoy proxy调研笔记</title>
      <link>https://hxysayhi.github.io/posts/4a1349e1/</link>
      <pubDate>Mon, 25 Jul 2022 20:27:32 +0000</pubDate>
      <guid>https://hxysayhi.github.io/posts/4a1349e1/</guid>
      <description>&lt;h1 id=&#34;内容提要&#34;&gt;内容提要&lt;/h1&gt;&#xA;&lt;p&gt;我们主要想了解 envoy 如何提供 L4/L7的代理服务，envoy具体提供哪些功能，我们如何利用这些功能实现我们的业务场景。在envoy如何提供代理能力方面，主要有两点：1. envoy 如何从控制面获取配置； 2. envoy 如何根据配置信息进行路由。在如何利用envoy提供的功能实现我们的业务场景方面，主要是 如何将 k8s集群中的相关资源对象的描述信息，转换为envoy 的配置。&lt;/p&gt;&#xA;&lt;p&gt;本文我们将围绕以上两个方面，进行介绍，主要有以下相关内容：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#t1&#34;&gt;envoy是什么？&lt;/a&gt;为了解决什么问题，具有什么特点，能力边界在哪里。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#t2&#34;&gt;envoy的基本概念与框架&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;明确envoy中的基本术语，以及envoy的基本工作框架，处理流程。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#t3&#34;&gt;envoy的动态配置能力&lt;/a&gt;。控制面如何将k8s集群中的route资源描述信息动态实时地传达到envoy？&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#t4&#34;&gt;envoy如何进行路由？&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;有了路由配置信息后，envoy如何对请求进行路由。这部分内容主要聚焦在路由能力，这个能力主要是由http route filter提供。这部分涉及到一些代码实现层面的处理以及相关数据结构。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#t5&#34;&gt;envoy的主要组件与模型&lt;/a&gt;：线程模型、常见组件、过滤器等。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#t6&#34;&gt;控制面组件实践&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;对几个控制面组件的简单对比。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#t7&#34;&gt;envoy支持特性概览&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;为了便于评估envoy能够对哪些业务需求提供支持，简单罗列了envoy提供的功能特性。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h1 id=&#34;envoy-是什么&#34;&gt;&lt;!-- raw HTML omitted --&gt;Envoy 是什么&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;#t1&#34;&gt;¶&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;根据&lt;a href=&#34;https://www.envoyproxy.io/&#34;&gt;envoy官网&lt;/a&gt;的定义，envoy是一个开源的为云原生应用而设计的边缘和服务代理（edge and service proxy）。使用c++ 编写，设计定位是用于大规模微服务服务网格架构的通用数据平面。为的是解决以下在大规模微服务场景中存在的挑战：1. 复杂异构系统中的网络维护；2. 流量监控中的困难；3.  扩缩容。&lt;/p&gt;&#xA;&lt;p&gt;通常来说有两种部署方式，一种是作为sidecar 和微服务应用部署在一起，将网络相关的逻辑从微服务中抽离出来，提供服务网格的数据面能。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://hxysayhi.github.io/pic/4a1349e1/p0.png&#34; alt=&#34;Untitled&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;另一种部署方式是作为一个代理网关部署，作为微服务集群的流量入口。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://hxysayhi.github.io/pic/4a1349e1/p1.png&#34; alt=&#34;Untitled&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;envoy可以提供的能力有：负载均衡、可用性增强能力（如超时、熔断、重试等）、可观测性、指标监控等。&lt;/p&gt;&#xA;&lt;p&gt;envoy的一大特点是可以通过xDS实现实时的动态配置更新。在k8s容器集群中，部署的应用会不停地新增、减少、漂移，路由配置会不停地发生变化，xDS 这一特性能很好地在这种频繁发生路由配置变化的场景下高效运作。不仅仅是路由相关的配置可以热加载生效，envoy 可以通过xds进行除本身二进制文件之外的几乎所有变更，也就是除非需要更新envoy本身，否则任何变更都无需将envoy停止运行，这为我们的运维变更带来了极大的便利性。&lt;/p&gt;&#xA;&lt;p&gt;除了支持xds进行动态配置，envoy也支持进行静态配置，但是通常来说，由于其配置具有很高的灵活度，也导致了配置具有较高的复杂性，难以人工维护，通常来说都是由代码生成。&lt;/p&gt;&#xA;&lt;p&gt;envoy只扮演数据平面的角色，不扮演控制平面的角色。尽管envoy适用于k8s集群云原生场景，但是并不会对k8s集群的路由相关资源进行监控，并转换为相关的路由配置。因此我们需要有控制面程序来完成对k8s集群中路由相关资源进行监控，来完成路由配置的生成，并通过xds将配置同步到envoy中。&lt;/p&gt;&#xA;&lt;p&gt;当前常见的控制面实现有：istio、contour、emissary-ingress（ambassador）、gloo等。以conotur为例，常见的部署形态如下所示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://hxysayhi.github.io/pic/4a1349e1/p2.png&#34; alt=&#34;Untitled&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;参考链接：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.tetrate.io/blog/get-started-with-envoy-in-5-minutes/&#34;&gt;https://www.tetrate.io/blog/get-started-with-envoy-in-5-minutes/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.tetrate.io/what-is-envoy-proxy/#:~:text=Introducing%20Envoy%20Proxy,data%20plane%20for%20service%20mesh&#34;&gt;https://www.tetrate.io/what-is-envoy-proxy/#:~:text=Introducing Envoy Proxy,data plane for service mesh&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h1 id=&#34;envoy的基本概念和框架&#34;&gt;&lt;!-- raw HTML omitted --&gt;envoy的基本概念和框架&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;#t2&#34;&gt;¶&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;基本概念&#34;&gt;基本概念：&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.envoyproxy.io/docs/envoy/v1.21.4/intro/arch_overview/intro/terminology&#34;&gt;https://www.envoyproxy.io/docs/envoy/v1.21.4/intro/arch_overview/intro/terminology&lt;/a&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>envoy 动态路由配置信息查看</title>
      <link>https://hxysayhi.github.io/posts/61a05b5d/</link>
      <pubDate>Mon, 09 May 2022 22:13:26 +0000</pubDate>
      <guid>https://hxysayhi.github.io/posts/61a05b5d/</guid>
      <description>&lt;p&gt;envoy 通过静态配置和动态配置接口共同决定 路由配置信息。在contour +  envoy 的部署使用模式下，envoy 的静态配置中主要定义了如何从contour 获取动态配置信息，而contour 作为 envoy 的控制面 xds server运行，将从k8s 集群 的ingress 资源描述中获取到的路由信息通过xds发送给 envoy。&lt;/p&gt;&#xA;&lt;p&gt;因此，我们可以通过两种方式来获取 envoy路由配置的相关信息：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一种是通过contour 暴露的接口，去看 contour 给 envoy 发送的内容&lt;/li&gt;&#xA;&lt;li&gt;一种是通过 envoy 暴露的接口去看envoy接收生效的内容&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;查看-contour发送的内容&#34;&gt;查看 contour发送的内容&lt;/h3&gt;&#xA;&lt;p&gt;contour 提供了命令行交互能力，可以执行命令 &lt;code&gt;contour cli eds&lt;/code&gt; 等命令去获取endpoint等配置的信息。&lt;/p&gt;&#xA;&lt;p&gt;相关命令：&lt;/p&gt;&#xA;&lt;p&gt;获取 contour pod信息：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CONTOUR_POD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;kubectl -n projectcontour get pod -l app&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;contour -o jsonpath&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{.items[0].metadata.name}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;进入该pod执行查看命令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl -n projectcontour exec &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;CONTOUR_POD&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; -c contour -- contour cli eds --cafile&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/certs/ca.crt --cert-file&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/certs/tls.crt --key-file&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/certs/tls.key&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中eds 表示查看 endpoint 相关配置&lt;/p&gt;&#xA;&lt;p&gt;支持以下基本信息查看：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;eds： endpoint 信息&lt;/li&gt;&#xA;&lt;li&gt;cds： cluster信息&lt;/li&gt;&#xA;&lt;li&gt;rds： route信息&lt;/li&gt;&#xA;&lt;li&gt;lds： listener 信息&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;注意这个是一个持续监听的接口，执行后不会退出，当k8s集群ingress相关资源对象发生变化时，又或获取最新配置内容。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
