<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ingress | 伪架构师</title>
    <link>/tags/ingress/</link>
      <atom:link href="/tags/ingress/index.xml" rel="self" type="application/rss+xml" />
    <description>ingress</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Sun, 05 Apr 2020 17:41:31 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>ingress</title>
      <link>/tags/ingress/</link>
    </image>
    
    <item>
      <title>Kubernetes 1.18 中 Ingress 的增强</title>
      <link>/post/ingress-in-1.18/</link>
      <pubDate>Sun, 05 Apr 2020 17:41:31 +0800</pubDate>
      <guid>/post/ingress-in-1.18/</guid>
      <description>

&lt;p&gt;作者：&lt;a href=&#34;https://www.linkedin.com/in/robertjscott1&#34; target=&#34;_blank&#34;&gt;Rob Scott (Google)&lt;/a&gt; &lt;a href=&#34;https://www.linkedin.com/in/cmluciano&#34; target=&#34;_blank&#34;&gt;Christopher M Luciano (IBM)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;原文：&lt;a href=&#34;https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/&#34; target=&#34;_blank&#34;&gt;Improvements to the Ingress API in Kubernetes 1.18&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kubernetes 的 Ingress API 是大量 Ingress 控制器的基础，它们通过这一 API，用方便强大的方式为 Kubernetes 提供入站流量的支持。在 Kubernetes 1.18 中，这个 API 有了三个显著的变化：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;新的 &lt;code&gt;pathType&lt;/code&gt; 字段可以用来匹配 Ingress 路径。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IngressClass&lt;/code&gt; 资源能够指定控制器实现 Ingress 的方法。&lt;/li&gt;
&lt;li&gt;主机名中可以使用通配符。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;使用-path-type-改进路径匹配&#34;&gt;使用 Path Type 改进路径匹配&lt;/h2&gt;

&lt;p&gt;Path Type 的新概念让用户可以指定路径的匹配方式，目前有三种：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ImplementationSpecific&lt;/code&gt;（缺省）：这种匹配方式的行为取决于 &lt;code&gt;IngressClass&lt;/code&gt; 控制器的实现。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Extract&lt;/code&gt;：以区分大小写的方式精确匹配整个 URL 路径。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Prefix&lt;/code&gt;：区分大消息，根据以 &lt;code&gt;/&lt;/code&gt; 分割的 URL 元素进行前缀匹配。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;使用-ingress-class-扩展配置&#34;&gt;使用 Ingress Class 扩展配置&lt;/h2&gt;

&lt;p&gt;Ingress 资源的设计初衷就是易用性，尝试使用简单的字段为所有应用提供支持。随着应用场景的不断增加，为了适应更广泛的需求，越来越多的 Ingress 控制器要靠大量的自定义注解来完成更复杂的配置。&lt;code&gt;IngressClass&lt;/code&gt; 资源提供了一种替换部分注解的思路。&lt;/p&gt;

&lt;p&gt;每个 &lt;code&gt;IngressClass&lt;/code&gt; 中都指明了用于实现 Ingress 的控制器类型，并且可以引用自定义资源来使用更多参数。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: external-lb
spec:
  controller: example.com/ingress-controller
  parameters:
    apiGroup: k8s.example.com/v1alpha
    kind: IngressParameters
    name: external-lb
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;指定-ingess-的-class&#34;&gt;指定 Ingess 的 Class&lt;/h3&gt;

&lt;p&gt;Ingress 规范中加入了 &lt;code&gt;ingressClassName&lt;/code&gt; 字段，用来指定实现这个 Ingress 资源的的 &lt;code&gt;IngressClass&lt;/code&gt;。&lt;/p&gt;

&lt;h3 id=&#34;淘汰-ingress-注解&#34;&gt;淘汰 Ingress 注解&lt;/h3&gt;

&lt;p&gt;在 1.18 加入 &lt;code&gt;IngressClass&lt;/code&gt; 之前，需要在 Ingess 资源中使用 &lt;code&gt;kubernetes.io/ingress.class&lt;/code&gt; 注解来指定 Ingress 控制器。在没有官方定义的情况下，这个注解被大量的 Ingress 控制器所支持。现在是时候淘汰他了。&lt;/p&gt;

&lt;h3 id=&#34;设置缺省的-ingressclass&#34;&gt;设置缺省的 IngressClass&lt;/h3&gt;

&lt;p&gt;可以使用 &lt;code&gt;ingressclass.kubernetes.io/is-default-class&lt;/code&gt; 注解，将其设置为 &lt;code&gt;True&lt;/code&gt;，就代表所在的 &lt;code&gt;IngressClass&lt;/code&gt; 为缺省控制器。没有显示指定 &lt;code&gt;IngressClassName&lt;/code&gt; 的新的 Ingress 资源都会使用该控制器。&lt;/p&gt;

&lt;h2 id=&#34;主机名通配符&#34;&gt;主机名通配符&lt;/h2&gt;

&lt;p&gt;很多 Ingress 控制器都支持通配符，例如 &lt;code&gt;*.foo.com&lt;/code&gt; 可以匹配 &lt;code&gt;app1.foo.com&lt;/code&gt;，但是直到目前为止，规范还是假设使用完全匹配的 FQDN。主机名现在也可以使用通配符了。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Host&lt;/th&gt;
&lt;th&gt;Host Header&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;*.foo.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*.foo.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;根据后缀匹配&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*.foo.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*.foo.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不匹配，通配符只能对应一个 DNS 项&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*.foo.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;foo.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不匹配，通配符只能对应一个 DNS 项&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

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

&lt;p&gt;新的 Ingress 功能扩展了配置能力，下面是一个例子，其中用到了上面提到的三个新特性：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
spec:
  ingressClassName: external-lb
  rules:
  - host: *.example.com
    http:
      paths:
      - path: /example
        pathType: Prefix
        backend:
          serviceName: example-service
          servicePort: 80
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;ingress-控制器支持&#34;&gt;Ingress 控制器支持&lt;/h3&gt;

&lt;p&gt;这个功能是 Kubernetes 1.18 中新增的，因此各种控制器都需要一段时间才能提供支持。请关注相关产品的官方文档。&lt;/p&gt;

&lt;h2 id=&#34;ingress-的未来&#34;&gt;Ingress 的未来&lt;/h2&gt;

&lt;p&gt;Ingress API 将在 1.19 进入稳定阶段。它会持续使用简单的方式为 Kubernetes 入站流量提供支持。这个 API 的设计重心就在于轻量和简单，但是更好的配置能力和更广泛的案例支持也是一个持续的努力方向。&lt;/p&gt;

&lt;p&gt;目前还在开发一组高配置能力的 API。被称为 &lt;code&gt;Service API&lt;/code&gt; 的新 API 会提供一种 Ingress 的替代方案。它的存在目的不是替代 Ingress，而是提供一种更具配置能力的新方案。请查看 Github 上的 &lt;a href=&#34;http://github.com/kubernetes-sigs/service-apis&#34; target=&#34;_blank&#34;&gt;Service API&lt;/a&gt; 项目。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Istio Helm Chart 详解 - Ingress</title>
      <link>/post/istio-helm-deep-dive-ingress/</link>
      <pubDate>Tue, 09 Oct 2018 14:25:42 +0800</pubDate>
      <guid>/post/istio-helm-deep-dive-ingress/</guid>
      <description>

&lt;blockquote&gt;
&lt;p&gt;这是《Istio Helm Chart 详解》系列的第三篇。开始逐个 Chart 进行阅读。&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;全局变量之后，接下来就是 Ingress 一节了，这个 Chart 只是个兼容选项，为 Istio 提供了传统 Kubernetes Ingress 的功能。&lt;code&gt;ingress.enabled&lt;/code&gt; 变量用于在 &lt;code&gt;requirements.yaml&lt;/code&gt; 中控制该 Chart 是否启用。&lt;/p&gt;

&lt;h2 id=&#34;chart-yaml&#34;&gt;Chart.yaml&lt;/h2&gt;

&lt;p&gt;元数据文件，无需赘述。&lt;/p&gt;

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

&lt;p&gt;该文件用于处理该模块的 &lt;a href=&#34;https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/&#34; target=&#34;_blank&#34;&gt;HPA 对象&lt;/a&gt;。引用变量如下：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ingress.autoscaleMin&lt;/strong&gt;：水平伸缩的 Pod 数量下限，另外该变量被赋值的情况下才会渲染 HPA 对象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ingress.autoscaleMax&lt;/strong&gt;：水平伸缩的 Pod 数量上限。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Release.Namespace&lt;/strong&gt;：HPA 对象所在的命名空间，使用 Istio 同一值。Release 是 Helm 的保留字，用于标识该 Release 所在的命名空间。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;代码中我们看到，&lt;code&gt;targetAverageUtilization&lt;/code&gt; 设置为固定值 &lt;code&gt;80&lt;/code&gt;。&lt;/p&gt;

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

&lt;p&gt;这个模板用于为 Pod 生成 Service Account——&lt;code&gt;istio-ingress-service-account&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;其中引用变量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;global.imagePullSecrets&lt;/strong&gt;：全局变量定义的数组，提供给 Service Account，在拉取镜像时使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chart&lt;/strong&gt; 和 &lt;strong&gt;Release&lt;/strong&gt; 都是 Helm 的内置对象。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;clusterrole-yaml-和-clusterrolebinding-yaml&#34;&gt;clusterrole.yaml 和 clusterrolebinding.yaml&lt;/h2&gt;

&lt;p&gt;Kubernetes &lt;a href=&#34;https://kubernetes.io/docs/reference/access-authn-authz/rbac/&#34; target=&#34;_blank&#34;&gt;RBAC&lt;/a&gt; 系统使用，这是一个集群范围内生效的 ClusterRole，声明了 Ingress 中需要的两组权限，并最终和 Service Account 进行绑定：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;对于 extensions.thirdpartyresources 和 extensions.ingresses 对象的读写权限。&lt;/li&gt;
&lt;li&gt;对 configmaps、pods、endpoints 和 services 对象的读取权限。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其中引用变量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;istio.name&lt;/strong&gt;：定义在 istio 的 &lt;code&gt;_helpers.tpl&lt;/code&gt; 中，如果没有使用 &lt;code&gt;nameOverride&lt;/code&gt; 进行覆盖的话，会使用 Chart 名称。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chart&lt;/strong&gt; 和 &lt;strong&gt;Release&lt;/strong&gt; 都是 Helm 的内置对象。&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;这一模板用于生成 Deployment，主体部分和 Ingress Gateway 类似，使用的都是 &lt;code&gt;istio/proxyv2&lt;/code&gt; 镜像，&lt;a href=&#34;https://istio.io/docs/reference/commands/pilot-agent/#pilot-agent-proxy&#34; target=&#34;_blank&#34;&gt;参数稍有区别&lt;/a&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;istio-proxy&lt;/strong&gt;：&lt;code&gt;proxy sidecar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ingress&lt;/strong&gt;：&lt;code&gt;proxy ingress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gateways&lt;/strong&gt;：&lt;code&gt;proxy router&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其中引用变量：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;istio.name&lt;/strong&gt;：定义在 istio 的 &lt;code&gt;_helpers.tpl&lt;/code&gt; 中，如果没有使用 &lt;code&gt;nameOverride&lt;/code&gt; 进行覆盖的话，会使用 Chart 名称。&lt;/li&gt;
&lt;li&gt;使用 Chart 和 Release 数据生成标签。这里可以看到，固定使用 &lt;code&gt;istio: ingress&lt;/code&gt; 提供给 Gateway  Selector 进行选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;global.hub&lt;/strong&gt; 和 &lt;strong&gt;global.tag&lt;/strong&gt;：生成镜像地址。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replicaCount&lt;/strong&gt;：控制 Pod 数量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;global.imagePullPolicy&lt;/strong&gt;：拉取策略。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;global.priorityClassName&lt;/strong&gt;：&lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;PriorityClass&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;global.proxy.envoyStatsd.enabled&lt;/strong&gt;：如果启用，则加入 &lt;code&gt;--statsdUdpAddress&lt;/code&gt; 参数。&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;global.controlPlaneSecurityEnabled&lt;/strong&gt;：根据这一设置确定 &lt;code&gt;controlPlaneAuthPolicy&lt;/code&gt; 设置：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;# 如果启用
- --controlPlaneAuthPolicy
- MUTUAL_TLS
- --discoveryAddress
- istio-pilot:15005
# 如果没启用
- --controlPlaneAuthPolicy
- NONE
- --discoveryAddress
- istio-pilot:8080
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;resources&lt;/strong&gt; 和 &lt;strong&gt;globale.defaultResources&lt;/strong&gt;：优先使用 Chart 自身的资源定义，如果没有则使用缺省定义。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;nodeaffinity&lt;/strong&gt;：包含节点亲和性定义模板。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;另外这里还包含了对两个 secret 的可选加载：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;istio.istio-ingress-service-account&lt;/strong&gt;：用于 RBAC 的 Service Account 证书。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;istio-ingress-certs&lt;/strong&gt;：提供 https 服务时使用这一组证书。&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;这个模板用来为 Ingress 生成服务。&lt;/p&gt;

&lt;p&gt;引用变量包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;istio.name&lt;/strong&gt;：定义在 istio 的 &lt;code&gt;_helpers.tpl&lt;/code&gt; 中，如果没有使用 &lt;code&gt;nameOverride&lt;/code&gt; 进行覆盖的话，会使用 Chart 名称。&lt;/li&gt;
&lt;li&gt;使用 Chart 和 Release 数据生成标签。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;service.loadBalancerIP&lt;/strong&gt;：如果指定了 IP，则使用指定 IP。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;service.type&lt;/strong&gt;：如果没有负载均衡支持，可以考虑采用 NodePort 方式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;service.annotations&lt;/strong&gt;：可以设置一系列的键值对，通过遍历的形式为 Service 对象生成注解。&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;service.ports&lt;/strong&gt;：可以定义其它的非标准端口，以数组形式供 Helm 进行遍历，例如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;- port: 80
name: http
nodePort: 32000
- port: 443
name: https
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;常用链接&#34;&gt;常用链接&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Helm 内置对象：&lt;a href=&#34;https://docs.helm.sh/chart_template_guide/#built-in-objects&#34; target=&#34;_blank&#34;&gt;https://docs.helm.sh/chart_template_guide/#built-in-objects&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Istio 大入门 - Ingress</title>
      <link>/post/istio-ingress-dive/</link>
      <pubDate>Sat, 11 Aug 2018 14:44:26 +0800</pubDate>
      <guid>/post/istio-ingress-dive/</guid>
      <description>

&lt;blockquote&gt;
&lt;p&gt;本文涉及细节较多，需读者对 Docker、Kubernetes 以及 Istio 有一定了解和实践经验，否则可能难于操作。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Istio 从 v1alpha3 开始，用 Ingress Gateway 组件替代了符合 Kubernetes 规范的 Ingress Controller，因此对入站流量具有了更大的控制能力，但是用法也有了较大不同。&lt;/p&gt;

&lt;p&gt;安装：在使用 Helm 进行 Istio 部署的时候，需要使用下面的设置来启用 Ingress Gateway：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;gateways:
  enabled: true
  istio-ingressgateway:
    enabled: true
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;基本概念&#34;&gt;基本概念&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;VirtualService&lt;/code&gt; 是流量控制的核心组件，起着承上（&lt;code&gt;Gateway&lt;/code&gt;）启下（&lt;code&gt;DestinationRule&lt;/code&gt;）的作用。这三种对象在本文中涉及的主要职责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Gateway&lt;/code&gt; 对象：

&lt;ul&gt;
&lt;li&gt;选择 Gateway Ingress Controller。&lt;/li&gt;
&lt;li&gt;设置端点开放方式：域名、端口、入站协议等。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DestinationRule&lt;/code&gt;：

&lt;ul&gt;
&lt;li&gt;定义负载均衡行为。&lt;/li&gt;
&lt;li&gt;定义服务版本子集。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VirtualService&lt;/code&gt;：

&lt;ul&gt;
&lt;li&gt;根据 Gateway 选择服务版本。&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;根据 &lt;a href=&#34;https://istio.io/docs/reference/config/istio.networking.v1alpha3/#VirtualService&#34; target=&#34;_blank&#34;&gt;VirtualService 对象文档&lt;/a&gt;中的说明，&lt;code&gt;VirtaulService&lt;/code&gt; 对象中的 &lt;code&gt;gateways&lt;/code&gt; 字段的类型为 &lt;code&gt;string[]&lt;/code&gt;，包括一或多个字符串值。如果省略该字段内容，会隐式的赋值为 &lt;code&gt;[&amp;quot;mesh&amp;quot;]&lt;/code&gt;，&lt;code&gt;mesh&lt;/code&gt; 网关指代所有的网格内通信。如果要对外提供服务，就需要定义 &lt;code&gt;Gateway&lt;/code&gt; 对象，并在 &lt;code&gt;gateways&lt;/code&gt; 字段中进行赋值。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;注意，一旦在 &lt;code&gt;gateways&lt;/code&gt; 中填写了非缺省的对象名称，要继续对内部通信进行流量控制，必须显式的将内置的 &lt;code&gt;mesh&lt;/code&gt; 对象名称也加入到列表之中。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#34;准备工作&#34;&gt;准备工作&lt;/h2&gt;

&lt;h3 id=&#34;环境准备&#34;&gt;环境准备&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;安装和部署 Kubernetes 以及 Istio，并启用 Ingress Gateway 支持。&lt;/li&gt;
&lt;li&gt;将备用的两个域名（假设为 &lt;code&gt;flask.example2.com&lt;/code&gt; 以及 &lt;code&gt;flask.example1.com&lt;/code&gt;）指向 &lt;code&gt;istio-ingressgateway&lt;/code&gt; 服务的外部 IP。&lt;/li&gt;
&lt;li&gt;为测试域名生成 HTTPS 证书。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;域名准备&#34;&gt;域名准备&lt;/h3&gt;

&lt;h3 id=&#34;工作负载&#34;&gt;工作负载&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;首先编写一个基于 Flask 的 Python 脚本，并打入镜像，脚本功能很简单，显示环境变量中的 &amp;ldquo;VERSION&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;接下来编写 Dockerfile，安装 Python3、Flask，并进行构建和推送。&lt;/li&gt;
&lt;li&gt;编写 Kubernetes 工作负载文件，常见的 Deployment + Service 模式。&lt;/li&gt;
&lt;li&gt;在 Kubernetes 上运行工作负载。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;以上涉及代码可以在页面尾部获取。&lt;/p&gt;

&lt;h3 id=&#34;目标规则定义&#34;&gt;目标规则定义&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: flask
spec:
  host: flask
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里根据工作负载中的标签，将 &lt;code&gt;flask&lt;/code&gt; 服务拆分为 &lt;code&gt;v1&lt;/code&gt; 和 &lt;code&gt;v2&lt;/code&gt; 两个版本。&lt;/p&gt;

&lt;h2 id=&#34;在外网开放服务&#34;&gt;在外网开放服务&lt;/h2&gt;

&lt;p&gt;这里我们设计，将所有外网请求经过 &lt;code&gt;flask.example1.com&lt;/code&gt; 路由到 &lt;code&gt;v2&lt;/code&gt; 版本上。&lt;/p&gt;

&lt;p&gt;首先要编写一个 &lt;code&gt;Gateway&lt;/code&gt; 定义：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: flask-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - flask.example1.com
        - flask.example2.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里定义了一个 &lt;code&gt;Gateway&lt;/code&gt;，其中要求 80 端口响应两个域名的请求。接下来定义一个 &lt;code&gt;VirtualService&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
    name: flask
spec:
    hosts:
    - &amp;quot;flask.example1.com&amp;quot;
    gateways:
    - flask-gateway
    http:
    - route:
        - destination:
            host: flask
            subset: v2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后使用 curl 进行访问：&lt;code&gt;curl http://flask.example1.com&lt;/code&gt; 会发现返回了字符串 &amp;ldquo;v2&amp;rdquo;，证明我们的定义生效了，该域名指向了 &lt;code&gt;v2&lt;/code&gt; 服务。&lt;/p&gt;

&lt;p&gt;再用 curl 访问第二个域名 &lt;code&gt;curl http://flask.example2.com&lt;/code&gt;，会看到返回了 404，这是因为我们的 &lt;code&gt;Gateway&lt;/code&gt; 虽然接收了请求，但是并没有服务路由完成这一请求。那么可以再定义一个 &lt;code&gt;VirtualService&lt;/code&gt;，让 &lt;code&gt;flask.example2.com&lt;/code&gt; 域名指向 &lt;code&gt;v1&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
    name: flask1
spec:
    hosts:
    - &amp;quot;flask.example2.com&amp;quot;
    gateways:
    - flask-gateway
    http:
    - route:
        - destination:
            host: flask
            subset: v1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;再次使用 &lt;code&gt;curl http://flask.example2.com&lt;/code&gt;，访问，会看到返回结果变成了 &lt;code&gt;v1&lt;/code&gt;，证明我们的服务定义生效了。&lt;/p&gt;

&lt;h2 id=&#34;将一个域名服务升级为-tls&#34;&gt;将一个域名服务升级为 tls&lt;/h2&gt;

&lt;p&gt;随意修改一个需求，要求开放 &lt;code&gt;flask.example2.com&lt;/code&gt; 为 http，而 &lt;code&gt;flask.example1.com&lt;/code&gt; 升级为 https，既然涉及 https，就要用到证书，&lt;a href=&#34;https://istio.io/zh/docs/tasks/traffic-management/secure-ingress/&#34; target=&#34;_blank&#34;&gt;官方文档（中文版哦）&lt;/a&gt;陈述如下：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;具体说来就是使用 kubectl 命令在命名空间 istio-system 中创建一个 secret 对象，命名为 istio-ingressgateway-certs。Istio 网关会自动载入这个 secret。
这里的 secret 必须 在 istio-system 命名空间中，并且命名为 istio-ingressgateway-certs，否则就不会被正确载入，也就无法 Istio gateway 中使用了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;接着是使用命令为 &lt;code&gt;flask.example1.com&lt;/code&gt; 的证书创建 &lt;code&gt;Secret&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ kubectl create -n istio-system secret tls \
    istio-ingressgateway-certs \
    --key key.pem --cert cert.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最后修改我们的 &lt;code&gt;Gateway&lt;/code&gt; 定义：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: flask-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - flask.example2.com
    - port:
        number: 443
        name: https-rocks
        protocol: HTTPS
      tls:
        mode: SIMPLE
        serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
        privateKey: /etc/istio/ingressgateway-certs/tls.key
      hosts:
        - flask.example1.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后再次使用 curl 分别访问 &lt;code&gt;https://flask.example1.com/version&lt;/code&gt; 以及 &lt;code&gt;http://flask.example2.com/version&lt;/code&gt;，会发现返回了预期结果，而一旦错用 &lt;code&gt;http&lt;/code&gt; 和 &lt;code&gt;https&lt;/code&gt;，就会出现异常，这是因为我们的 &lt;code&gt;Gateway&lt;/code&gt; 限制了端口。&lt;/p&gt;

&lt;p&gt;这里如此操作的原因可以在他的部署中找到：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ kubectl get deployment istio-ingressgateway \
    -o yaml -n istio-system
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;返回的 YAML 中会有这么一段&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;...
- mountPath: /etc/istio/ingressgateway-ca-certs
    name: ingressgateway-ca-certs
    readOnly: true
...
volumes:
- name: ingressgateway-certs
secret:
    defaultMode: 420
    optional: true
    secretName: istio-ingressgateway-certs
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上方代码可以看到，Ingress Gateway 中用可选方式加载了一个名称为 &lt;code&gt;istio-ingressgateway-certs&lt;/code&gt; 的 &lt;code&gt;Secret&lt;/code&gt;，并 Mount 到了 &lt;code&gt;/etc/istio/ingressgateway-ca-certs&lt;/code&gt; 目录之中，这就是上文中要求我们固定 Secret 名称和命名空间的原因。众所周知，&lt;code&gt;tls&lt;/code&gt; 类型的 &lt;code&gt;Secret&lt;/code&gt; 加载后会成为 &lt;code&gt;tls.key&lt;/code&gt; 和 &lt;code&gt;tls.crt&lt;/code&gt; 两个文件，因此在我们的 &lt;code&gt;Gateway&lt;/code&gt; 定义中就使用了 &lt;code&gt;/etc/istio/ingressgateway-certs/tls.crt&lt;/code&gt; 这样的文件名。&lt;/p&gt;

&lt;h2 id=&#34;所有域名都升级为-tls&#34;&gt;所有域名都升级为 tls&lt;/h2&gt;

&lt;p&gt;根据上一节的描写，不难发现按照官方文档，一个 &lt;code&gt;Gateway&lt;/code&gt; 是无法处理两个域名的 https 的：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;tls secret 只能包含一个证书对。&lt;/li&gt;
&lt;li&gt;泛域名证书可以完成这一任务，但因为 Envoy 的限制，这里无法同时使用两个泛域名。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;讨论到这里就很明显了，关键在于如何加载多个证书对，可以修改前面所说的加载指令为加载多个 &lt;code&gt;Secret&lt;/code&gt;，或者干脆换成 &lt;code&gt;Configmap&lt;/code&gt;，当然这样会引起服务中断，&lt;code&gt;Configmap&lt;/code&gt; 用于存放证书也略显粗糙——好在我们还可以换用 &lt;code&gt;Generic&lt;/code&gt; 类型的证书，这里我们可以删除原有 Secret 重新创建 ：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;kubectl delete secret istio-ingressgateway-certs \
    -n istio-system

kubectl create secret generic  \
    istio-ingressgateway-certs \
    -n istio-system \
    --from-file=rocks-crt.pem \
    --from-file=rocks-key.pem \
    --from-file=xyz-crt.pem \
    --from-file=xyz-key.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;接下来改造我们的 &lt;code&gt;Gateway&lt;/code&gt; 定义：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: flask-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: https-rocks
      protocol: HTTPS
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/rocks-crt.pem
      privateKey: /etc/istio/ingressgateway-certs/rocks-key.pem
    hosts:
    - &amp;quot;flask.example1.com&amp;quot;
  - port:
      number: 443
      name: https-xyz
      protocol: HTTPS
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/xyz-crt.pem
      privateKey: /etc/istio/ingressgateway-certs/xyz-key.pem
    hosts:
    - &amp;quot;flask.example2.com&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这样一来，我们开放了两个 HTTPS 端口，各自使用不同的证书，分别都可以通过 &lt;code&gt;curl&lt;/code&gt; 命令获得正确结果了。&lt;/p&gt;

&lt;h2 id=&#34;补充&#34;&gt;补充&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;tls.mode&lt;/code&gt; 实际还支持双向和透传两种方式，都可以在流量控制参考中找到相关内容。&lt;/p&gt;

&lt;h2 id=&#34;涉及链接&#34;&gt;涉及链接&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Istio 流量控制参考：&lt;code&gt;https://istio.io/docs/reference/config/istio.networking.v1alpha3/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用 HTTPS 加密 Gateway：&lt;code&gt;https://istio.io/zh/docs/tasks/traffic-management/secure-ingress/&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&#34;代码&#34;&gt;代码&lt;/h2&gt;

&lt;h3 id=&#34;python-脚本&#34;&gt;Python 脚本&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

from flask import Flask
import os

app = Flask(__name__)

@app.route(&amp;quot;/&amp;quot;)
def hello_world():
    return &amp;quot;Hello, World!&amp;quot;

@app.route(&amp;quot;/version&amp;quot;)
def getversion():
    return os.getenv(&amp;quot;VERSION&amp;quot;)
if __name__ == &amp;quot;__main__&amp;quot;:
    app.run(host=&amp;quot;0.0.0.0&amp;quot;, port=80, debug=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;dockerfile&#34;&gt;Dockerfile&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-dockerfile&#34;&gt;FROM alpine
RUN  apk add --update --no-cache python3 &amp;amp;&amp;amp; \
  mkdir /web &amp;amp;&amp;amp; \
  pip3 install Flask
COPY server.py /web
CMD &amp;quot;/web/server.py&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;kubernetes-工作负载&#34;&gt;Kubernetes 工作负载&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Service
metadata:
  name: flask
  labels:
    app: flask
spec:
  ports:
    - name: http
      port: 80
  selector:
    app: flask
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: flask-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: flask
        version: v1
    spec:
      containers:
        - image: &#39;abc:25000/python-flask-server:v2&#39;
          imagePullPolicy: IfNotPresent
          name: flask
          env:
            - name: VERSION
              value: v1
          ports:
            - containerPort: 80
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: flask-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: flask
        version: v2
    spec:
      containers:
        - image: &#39;abc:25000/python-flask-server:v2&#39;
          imagePullPolicy: IfNotPresent
          name: flask
          env:
            - name: VERSION
              value: v2
          ports:
            - containerPort: 80
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Kubernetes 1.2 中利用 Ingress 简化复杂网络</title>
      <link>/post/kubernetes-1.2-with-ingress/</link>
      <pubDate>Wed, 06 Apr 2016 07:50:05 +0800</pubDate>
      <guid>/post/kubernetes-1.2-with-ingress/</guid>
      <description>

&lt;p&gt;原文：&lt;a href=&#34;https://kubernetes.io/blog/2016/03/kubernetes-1.2-and-simplifying-advanced-networking-with-ingress&#34; target=&#34;_blank&#34;&gt;Kubernetes 1.2 and simplifying advanced networking with Ingress&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;在 Kubernetes 中，服务和 Pod 的 IP 地址缺省只能被集群网络路由。所有边缘路由器传来的流量要么被丢弃，要么被转向。在 Kubernetes 中，我们对 Ingress 对象做了改进，用于简化传入连接进入集群服务的过程。对其进行配置，能够给服务外部可达的 URL，负载均衡，Terminate SSL，提供具名虚拟主机等大量功能。&lt;/p&gt;

&lt;h2 id=&#34;ingress-controller&#34;&gt;Ingress Controller&lt;/h2&gt;

&lt;p&gt;如今，受容器或者虚拟机的影响，对 Web 服务器或者负载均衡的配置变得麻烦了。多数的 Web 服务器配置文件很像。虽说有些应用有些古怪，但是总的说来还是可以通过一些逻辑来达到目的的。在 Kuberntes 1.2 中，Ingress 实现了这些想法，Ingress 控制器就是用于处理这些特别的 Ingress “类” （可能是负载均衡的一个实例，或者复杂一些的提供 GSLB、CDN、DDoS 保护等功能的前端）中的这些个性的东西。Ingress Controller 是一个守护进程，以 Kuberntes Pod 的形式进行部署，他会监控 API 服务的 /ingress 终结点来获取对 &lt;a href=&#34;http://kubernetes.io/docs/user-guide/ingress/&#34; target=&#34;_blank&#34;&gt;Ingress 资源&lt;/a&gt; 的更新。他的任务就是实现 Ingress 请求。&lt;/p&gt;

&lt;p&gt;为了运行下面的例子，你的 Kubternetes 集群必须仅有一个支持 TLS 的 Ingress 控制器。如果你的集群运行在云提供商环境中，首先查找一下 “kube-system” 命名空间，查找 Ingress 控制器的 RC。如果没有的话，需要部署一个 &lt;a href=&#34;https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx&#34; target=&#34;_blank&#34;&gt;nginx 控制器&lt;/a&gt; 或者 用不到 100 行代码&lt;a href=&#34;https://github.com/kubernetes/contrib/tree/master/ingress/controllers#writing-an-ingress-controller&#34; target=&#34;_blank&#34;&gt;自行实现&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;务必花费少许时间来了解一下现存控制器的限制（ GCE, nginx ）。&lt;/p&gt;

&lt;h2 id=&#34;tls-termination-和-http-负载均衡&#34;&gt;TLS termination 和 HTTP 负载均衡&lt;/h2&gt;

&lt;p&gt;Ingress 用于承接服务，所以很适合做负载均衡以及中心化的安全配置。如果你熟悉 Go 语言，Ingress 在集群中扮演了 &lt;a href=&#34;https://golang.org/pkg/net/http/#Server&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;net/http’s “Server”&lt;/code&gt;&lt;/a&gt; 的角色。下面的例子示范了如何配置 TLS termination。负载均衡是 Ingress 的必选项目，所以只要创建了这一对象，就有了负载均衡能力。&lt;/p&gt;

&lt;p&gt;首先创建一个测试服务。我们会运行一个简单的 Echo 服务器，用来告知我们正在运行的内容（&lt;a href=&#34;https://github.com/kubernetes/contrib/tree/master/ingress/echoheaders&#34; target=&#34;_blank&#34;&gt;源代码&lt;/a&gt;）：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ kubectl run echoheaders 
--image=gcr.io/google_containers/echoserver:1.3 --port=8080
$ kubectl expose deployment echoheaders --target-port=8080 
--type=NodePort
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果你是在云服务提供商提供的集群上运行，确认你可以由外网通过 Nodeport 访问到这一服务。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ NODE_IP=$(kubectl get node `kubectl get po -l run=echoheaders 
--template &#39;{{range .items}}{{.spec.nodeName}}{{end}}&#39;` --template
&#39;{{range $i, $n := .status.addresses}}{{if eq $n.type 
&amp;quot;ExternalIP&amp;quot;}}{{$n.address}}{{end}}{{end}}&#39;)
$ NODE_PORT=$(kubectl get svc echoheaders --template &#39;{{range $i, $e 
:= .spec.ports}}{{$e.nodePort}}{{end}}&#39;)
$ curl $NODE_IP:$NODE_PORT
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这是一个简单的检查，如果最后一步失败了，可能需要设置一下&lt;a href=&#34;https://github.com/kubernetes/contrib/blob/master/ingress/controllers/gce/BETA_LIMITATIONS.md#creating-the-firewall-rule-for-glbc-health-checks&#34; target=&#34;_blank&#34;&gt;防火墙规则&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;接下来创建我们的 TLS secret：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout 
/tmp/tls.key -out /tmp/tls.crt -subj &amp;quot;/CN=echoheaders/O=echoheaders&amp;quot;
$ echo &amp;quot;
apiVersion: v1
kind: Secret
metadata:
name: tls
data:
tls.crt: `base64 -w 0 /tmp/tls.crt`
tls.key: `base64 -w 0 /tmp/tls.key`
&amp;quot; | kubectl create -f
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;配置 Ingress：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
spec:
tls:
- secretName: tls
backend:
    serviceName: echoheaders
    servicePort: 8080
&amp;quot; | kubectl create -f -
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这样就得到了一个负载均衡 IP：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ kubectl get ing 
NAME      RULE      BACKEND            ADDRESS         AGE
test      -         echoheaders:8080   130.X.X.X      4m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果等到 Ingress 控制器把你的后端设置为健康，会看到访问该 IP 80 端口的请求会被重定向到 443 端口，并会使用指定的 TLS 进行验证。&lt;/p&gt;

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

&lt;p&gt;可以在 &lt;a href=&#34;http://kubernetes.io/docs/user-guide/ingress/&#34; target=&#34;_blank&#34;&gt;Ingress API&lt;/a&gt; 获得更多的信息。Ingress 还在 Beta 阶段，我们期待你的反馈。你也可以贡献控制器或者 API 代码。所有跟 &lt;a href=&#34;https://www.google.com/webhp?sourceid=chrome-instant&amp;amp;ion=1&amp;amp;espv=2&amp;amp;ie=UTF-8#q=ingress%20meaning&#34; target=&#34;_blank&#34;&gt;&amp;ldquo;Ingress&amp;rdquo;&lt;/a&gt; 的内容都可以，包含 DNS、不同的 TLS 模式、SNI、4 层负载均衡、内容缓存、更多的算法和健康检查等。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
