阶段八:容器编排技术之K8s的Ingress工具
Ingress 控制器
概念介绍
官方手册:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/

Ingress Controller可以为外网用户访问K8S集群内部pod提供代理服务。
- 提供全局访问代理
- 访问流程
- 用户-->ingress controller-->service-->pod



具体分类
Ingress控制器有很多种:
Kubernetes Ingress Controller
官方手册:http://github.com/kubernetes/ingress-nginx 实现:Go/Lua(nginx 是用 C 写的) 开源许可证:Apache 2.0
Kubernetes 的“官方”控制器(之所以称为官方,是想把它区别于 NGINX 公司的控制器)。
这是社区开发的控制器,它基于 nginx Web 服务器,并补充了一组用于实现额外功能的 Lua 插件。
由于 NGINX 十分流行,再加上把它用作控制器时所需的修改较少,它对于 K8s 普通工程师来说,可能是最简单和最直接的选择。

NGINX Ingress Controller
官方手册:http://github.com/nginxinc/kubernetes-ingress 实现:Go 开源许可证:Apache 2.0
这是 NGINX 公司开发的官方产品,它也有一个基于 NGINX Plus 的商业版。NGINX 的控制器具有很高的稳定性、持续的向后兼容性,且没有任何第三方模块。
由于消除了 Lua 代码,和官方控制器相比,它保证了较高的速度,但也因此受到较大限制。相较之下,它的付费版本有更广泛的附加功能,如实时指标、JWT 验证、主动健康检查等。
NGINX Ingress 重要的优势是对 TCP/UDP 流量的全面支持,最主要缺点是缺乏流量分配功能。

Traefik
官方手册:http://github.com/containous/traefik 实现:Go 开源许可证:MIT
【流量 Traffic】
最初,这个代理是为微服务请求及其动态环境的路由而创建的,因此具有许多有用的功能:
- 连续更新配置(不重新启动)
- 支持多种负载均衡算法
- Web UI
- 指标导出
- 对各种服务的支持协议
- REST API
- Canary (金丝雀)版本
在 2019 年 9 月发布的 Traefik v2.0 中,虽然它增加许多不错的新功能,如带有 SNI 的 TCP/SSL、金丝雀部署、流量镜像/shadowing 和经过改进的 Web UI,但一些功能(如 WAF 支持)还在策划讨论中。
与新版本同期推出的还有一个名叫 Maesh 的服务网格,它建在 Traefik 之上。
金丝雀(Canary)版本的来历 20世纪初,英国矿工在下矿时,会携带金丝雀,由于金丝雀对一氧化碳浓度更为敏感,一旦金丝雀鸣叫不安,就会立即避险,减少伤亡。 1896年,英国一工程师认为,煤矿爆炸的原因是一氧化碳聚集造成的。由于一氧化碳无色无味,如何快速发现一氧化碳泄露极为重要。 他考虑到鸟类比人类更敏感,采用下面的装置,装置的一侧是个通风窗,一旦金丝雀鸣叫不安,立即关闭通风窗,打开上面的氧气罐,供给金丝雀呼吸,并立即逃离煤矿。 软件工程中,采用了金丝雀思想,先小范围发布版本,一旦发现Bug,立即修复;

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

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 模块。

最初,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

安装 Ingress Controller
项目地址:https://github.com/kubernetes/ingress-nginx
安装文档地址: https://github.com/kubernetes/ingress-nginx/blob/release-1.12/docs/deploy/index.md
查看ReadME文档

跳转到相应的帮助文档

找到Yaml创建方式

# 根据官方手册,下载 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命令作用:
- 访问
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/cloud/deploy.yaml;curl默认把响应写到终端,wget默认下载到文件。可据 HTTP 状态、响应内容或下载结果判断服务是否可访问。
执行结果:
- 成功后目标文件会下载到当前目录或
-O指定的位置。
关键参数:
注意事项:
metadata: spec: selector: matchLabels: template: metadata: labels: spec: containers:
--- metadata: labels: spec: ports: selector:
**注意事项:**注意事项:

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

注意事项:
**注意事项:**
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

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:注意事项:
本文由飞书云文档同步生成。涉及命令、SQL、配置示例时,请以飞书源文档和实际环境执行结果为准。