阶段八:容器编排技术之K8s的Ingress工具

Ingress 控制器

概念介绍

官方手册:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/

image

Ingress Controller可以为外网用户访问K8S集群内部pod提供代理服务。

image
image
image

具体分类

Ingress控制器有很多种:

Kubernetes Ingress Controller

官方手册:http://github.com/kubernetes/ingress-nginx 实现:Go/Lua(nginx 是用 C 写的) 开源许可证:Apache 2.0

Kubernetes 的“官方”控制器(之所以称为官方,是想把它区别于 NGINX 公司的控制器)。

这是社区开发的控制器,它基于 nginx Web 服务器,并补充了一组用于实现额外功能的 Lua 插件。

由于 NGINX 十分流行,再加上把它用作控制器时所需的修改较少,它对于 K8s 普通工程师来说,可能是最简单和最直接的选择

image

NGINX Ingress Controller

官方手册:http://github.com/nginxinc/kubernetes-ingress 实现:Go 开源许可证:Apache 2.0

这是 NGINX 公司开发的官方产品,它也有一个基于 NGINX Plus 的商业版。NGINX 的控制器具有很高的稳定性、持续的向后兼容性,且没有任何第三方模块。

由于消除了 Lua 代码,和官方控制器相比,它保证了较高的速度,但也因此受到较大限制。相较之下,它的付费版本有更广泛的附加功能,如实时指标、JWT 验证、主动健康检查等。

NGINX Ingress 重要的优势是对 TCP/UDP 流量的全面支持,最主要缺点是缺乏流量分配功能。

image

Traefik

官方手册:http://github.com/containous/traefik 实现:Go 开源许可证:MIT

【流量 Traffic】

最初,这个代理是为微服务请求及其动态环境的路由而创建的,因此具有许多有用的功能:

在 2019 年 9 月发布的 Traefik v2.0 中,虽然它增加许多不错的新功能,如带有 SNI 的 TCP/SSL、金丝雀部署、流量镜像/shadowing 和经过改进的 Web UI,但一些功能(如 WAF 支持)还在策划讨论中。

与新版本同期推出的还有一个名叫 Maesh 的服务网格,它建在 Traefik 之上。

金丝雀(Canary)版本的来历 20世纪初,英国矿工在下矿时,会携带金丝雀,由于金丝雀对一氧化碳浓度更为敏感,一旦金丝雀鸣叫不安,就会立即避险,减少伤亡。 1896年,英国一工程师认为,煤矿爆炸的原因是一氧化碳聚集造成的。由于一氧化碳无色无味,如何快速发现一氧化碳泄露极为重要。 他考虑到鸟类比人类更敏感,采用下面的装置,装置的一侧是个通风窗,一旦金丝雀鸣叫不安,立即关闭通风窗,打开上面的氧气罐,供给金丝雀呼吸,并立即逃离煤矿。 软件工程中,采用了金丝雀思想,先小范围发布版本,一旦发现Bug,立即修复;

image

HAProxy Ingress

官方手册:http://github.com/jcmoraisjr/haproxy-ingress 官网:https://www.haproxy.org/ 实现:Go(HAProxy 是用 C 写的) 开源许可证:Apache 2.0

image

HAProxy (High Availability,高可用)是众所周知的代理服务器和负载均衡器。作为 Kubernetes 集群的一部分,它提供了“软”配置更新(无流量损失)、基于 DNS 的服务发现和通过 API 进行动态配置。 HAProxy 还支持完全自定义配置文件模板(通过替换 ConfigMap)以及在其中使用 Spring Boot 函数。

通常,工程师会把重点放在已消耗资源的高速、优化和效率上。而 HAProxy 的优点之一正是支持大量负载均衡算法。

Istio Ingress

链接:http://http://istio.io/docs/tasks/traffic-management/ingress 实现:Go 许可证:Apache 2.0

Istio 是 IBM、Google 和 Lyft 的联合开发项目,它是一个全面的服务网格解决方案——不仅可以管理所有传入的外部流量(作为 Ingress 控制器),还可以控制集群内部的所有流量

Istio 将 Envoy 用作每种服务的辅助代理。从本质上讲,它是一个可以执行几乎所有操作的大型处理器,其中心思想是最大程度的控制、可扩展性、安全性和透明性。

通过 Istio Ingress,你可以对流量路由、服务之间的访问授权、均衡、监控、金丝雀发布等进行优化。

其他

后面的控制器,作为了解即可。为了保证课程质量,不作过多讲解。

Kong Ingress

官方手册:http://github.com/Kong/kubernetes-ingress-controller 实现:Go 开源许可证:Apache 2.0

Kong Ingress 由 Kong Inc(Incorporated,股份有限制的) 开发,有两个版本:商业版和免费版。它基于 NGINX 构建,并增加了扩展其功能的 Lua 模块。

image

最初,Kong Ingress 主要用作 API 网关,用于 API 请求的处理和路由。现在,它已经成为成熟的 Ingress 控制器,主要优点是拥有大量易于安装和配置的附加模块、插件(包括第三方插件)。它开启了控制器具备大量附加功能的先河,其内置函数也提供了许多可能性。Kong Ingress 配置是用 CRD 执行的。

Kong Ingress 的一个重要特性是它只能在一个环境中运行(而不支持跨命名空间)。这是一个颇有争议的话题:有些人认为这是一个缺点,因为必须为每个环境生成实例;而另一些人认为这是一个特殊特性,因为它是更高级别的隔离,控制器故障的影响仅限于其所在的环境。

Voyager

官方手册:http://github.com/appscode/voyager 实现:Go 开源许可证:Apache 2.0

Voyager 基于 HAProxy,并作为一个通用的解决方案提供给大量供应商。它最具代表性的功能包括 L7 和 L4 上的流量负载均衡,其中,TCP L4 流量负载均衡称得上是该解决方案最关键的功能之一

Contour

链接:http://github.com/heptio/contour 实现:Go 许可证:Apache 2.0

Contour 和 Envoy 由同一个作者开发,它基于 Envoy。它最特别的功能是可以通过 CRD(IngressRoute)管理 Ingress 资源,对于多团队需要同时使用一个集群的组织来说,这有助于保护相邻环境中的流量,使它们免受 Ingress 资源更改的影响。

它还提供了一组扩展的负载均衡算法(镜像、自动重复、限制请求率等),以及详细的流量和故障监控。对某些工程师而言,它不支持粘滞会话可能是一个严重缺陷。

Ambassador

链接:http://github.com/datawire/ambassador 实现:Python 许可证:Apache 2.0

Ambassador(形象大使) 也是一个基于 Envoy 的解决方案,它有免费版和商业版两个版本。

Ambassador 被称为“Kubernetes 原生 API 微服务网关”,它与 K8s 原生紧密集成,拥有你所期望的从 Ingress controller 获得的功能包,它还可以与各种服务网格解决方案,如 Linkerd、Istio 等一起使用。

顺便提一下,Ambassador 博客日前发布了一份基准测试结果,比较了 Envoy、HAProxy 和 NGINX 的基础性能。

Gloo

链接:http://github.com/solo-io/gloo 实现:Go 许可证:Apache 2.0

Gloo 是在 Envoy 之上构建的新软件(于 2018 年 3 月发布),由于它的作者坚持认为“网关应该从功能而不是服务中构建 API”,它也被称为“功能网关”。其“功能级路由”的意思是它可以为后端实现是微服务、无服务器功能和遗留应用的混合应用路由流量。

由于拥有可插拔的体系结构,Gloo 提供了工程师期望的大部分功能,但是其中一些功能仅在其商业版本(Gloo Enterprise)中可用。

Skipper

链接:http://github.com/zalando/skipper 实现:Go 许可证:Apache 2.0

Skipper 是 HTTP 路由器和反向代理,因此不支持各种协议。从技术上讲,它使用 Endpoints API(而不是 Kubernetes Services)将流量路由到 Pod。它的优点在于其丰富的过滤器集所提供的高级 HTTP 路由功能,工程师可以借此创建、更新和删除所有 HTTP 数据。

Skipper 的路由规则可以在不停机的情况下更新。正如它的作者所述,Skipper 可以很好地与其他解决方案一起使用,比如 AWS ELB。

Kubernetes Ingress Controller

image

安装 Ingress Controller

项目地址:https://github.com/kubernetes/ingress-nginx

安装文档地址: https://github.com/kubernetes/ingress-nginx/blob/release-1.12/docs/deploy/index.md

查看ReadME文档

image

跳转到相应的帮助文档

image

找到Yaml创建方式

image
# 根据官方手册,下载 Yaml 文件
# 你也可以加上 -O ingress-nginx.yaml 的参数,相当于文件重命名
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/cloud/deploy.yaml -O ingress-nginx.yaml

# 查看文件
ll -rt

命令作用:

执行结果:

关键参数:

注意事项:

metadata: spec: selector: matchLabels: template: metadata: labels: spec: containers:

metadata: labels: spec: ports: selector:


**注意事项:**

注意事项:

image

引子

...... ......


openssl命令详解:genrsa用于生成秘钥,-out用于生成指定输出私钥名称,其中生成的密钥长度为2048


![](/assets/feishu-images/05df75705b3504ec39373406.png)

注意事项:


**注意事项:**



metadata:

注意事项:

metadata:


**注意事项:**

metadata:

rules: resources: verbs: resources: verbs: resources: verbs: resources: verbs: resources: verbs:

metadata:

roleRef: subjects:


**注意事项:**

metadata: labels:

spec: selector: matchLabels: template: metadata: labels: spec: containers: args: ports: securityContext: capabilities: drop: add:


**注意事项:**





metadata:
spec:

注意事项:


**命令拆解:**

| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `-f` | 【必看】 | 指定要读取或操作的 YAML 文件。 |
| `00-account.yml` | 【普通】 | 配置文件路径,命令会读取这个文件里的配置。 |
| `01-role-binding.yml` | 【普通】 | 配置文件路径,命令会读取这个文件里的配置。 |
| `02-traefik-deployment.yml` | 【普通】 | 配置文件路径,命令会读取这个文件里的配置。 |
| `03-traefik-ingressClass.yaml` | 【普通】 | 配置文件路径,命令会读取这个文件里的配置。 |

**注意事项:**



http://WORKER02:8080


![](/assets/feishu-images/a74c10c39713cc4e13cb3c6b.png)

metadata:

spec: selector: matchLabels: template: metadata: labels: spec: containers: ports: volumeMounts: volumes: configMap:

metadata: data: default.conf: |

} }

metadata:

spec: ports:

selector:


**注意事项:**





metadata:
spec:
  rules:
    http:
      paths:
        backend:
          service:
            port:

注意事项:


**命令拆解:**

| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `-f` | 【必看】 | 指定要读取或操作的 YAML 文件。 |
| `04-nginx-8089.yaml` | 【普通】 | 配置文件路径,命令会读取这个文件里的配置。 |
| `05-nginx-ingress.yaml` | 【普通】 | 配置文件路径,命令会读取这个文件里的配置。 |

**注意事项:**

命令拆解:

命令部分重要程度详细解释
-n普通指定 Kubernetes 命名空间 kube-traefik,命令只在该命名空间内查找或修改资源。

注意事项:





metadata:
  annotations:
spec:
  tls:
  rules:
    http:
      paths:
        backend:
          service:
            port:

注意事项: