Ingress 优化 ,CNI 优化

This commit is contained in:
huanqing.shao
2019-09-10 23:20:13 +08:00
parent 251225f547
commit e3845547eb
10 changed files with 104 additions and 64 deletions

View File

@ -10,11 +10,12 @@
<div style="margin-top: 10px;">
<span style="font-size: 13px;">扫第一个二维码完成打赏扫第二个进微信群聊</span>
<p style="margin-top: 10px;">
<img src="/dz.png" style="width: 150px; margin-right: 150px;"></img>
<img src="/dz2.jpeg" style="width: 150px;"></img>
<img src="/images/dz.png" style="width: 150px; margin-right: 150px;"></img>
<img src="/images/dz2.jpeg" style="width: 150px;"></img>
</p>
</div>
<div style="margin-bottom: 10px;">不方便给打赏的话那就 <span style="color: red;">给一个 github star</span> </div>
<div style="margin-bottom: 10px;">github star 本窗口将不再弹出</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="waitAMoment">一会儿再说</el-button>

Binary file not shown.

View File

@ -3,7 +3,7 @@
<slot name="top"/>
<Content class="theme-default-content"/>
<div style="text-align: center; margin-bottom: 10px; margin-bottom: -80px;">
<div style="text-align: center; margin-bottom: 10px;">
<a href="https://github.com/eip-work/kuboard-press" target="_blank">如果您觉得这篇文档有帮到您点击此处给个 Github Star谢谢</a>
</div>
<!-- <Valine></Valine> -->

View File

@ -5,7 +5,7 @@ description: 在 Kubernetes 中,通过 Service 连接应用程序
# 如何选择网络插件
本文转载自: https://www.toutiao.com/a6708893686517727748/
本文转载自: [kubernetes网络插件对比分析flannel、calico、weave](https://www.toutiao.com/a6708893686517727748/)
原文作者:残花花败柳柳
@ -38,9 +38,9 @@ Docker还可以让用户通过其他驱动程序和插件来配置更高级
CNI的初衷是创建一个框架用于在配置或销毁容器时动态配置适当的网络配置和资源。下面链接中的CNI规范概括了用于配制网络的插件接口这个接口可以让容器运行时与插件进行协调
```
https://github.com/containernetworking/cni/blob/master/SPEC.md
```
[CND SPEC](https://github.com/containernetworking/cni/blob/master/SPEC.md)
插件负责为接口配置和管理IP地址并且通常提供与IP管理、每个容器的IP分配、以及多主机连接相关的功能。容器运行时会调用网络插件从而在容器启动时分配IP地址并配置网络并在删除容器时再次调用它以清理这些资源。
@ -68,13 +68,13 @@ https://github.com/containernetworking/cni/blob/master/SPEC.md
**Flannel**
![kubernetes网络插件对比分析flannel、calico、weave](cni.assets/04c2db500e1b4b5dae3be817bfe6d673.jpeg)
![kubernetes网络插件对比分析flannel、calico、weave](./cni.assets/04c2db500e1b4b5dae3be817bfe6d673.jpeg)
```
链接https://github.com/coreos/flannel
```
[flannel github 仓库](https://github.com/coreos/flannel)
由CoreOS开发的项目Flannel可能是最直接和最受欢迎的CNI插件。它是容器编排系统中最成熟的网络结构示例之一旨在实现更好的容器间和主机间网络。随着CNI概念的兴起Flannel CNI插件算是早期的入门。
@ -88,13 +88,12 @@ Flannel有几种不同类型的后端可用于封装和路由。默认和推荐
**Calico**
![kubernetes网络插件对比分析flannel、calico、weave](cni.assets/79fa00ed4bcb4d9b94aee1d02b3c5c8c.jpeg)
![kubernetes网络插件对比分析flannel、calico、weave](./cni.assets/79fa00ed4bcb4d9b94aee1d02b3c5c8c.jpeg)
```
链接https://github.com/projectcalico/cni-plugin
```
[Calico github 仓库](https://github.com/projectcalico/cni-plugin)
Calico是Kubernetes生态系统中另一种流行的网络选择。虽然Flannel被公认为是最简单的选择但Calico以其性能、灵活性而闻名。Calico的功能更为全面不仅提供主机和pod之间的网络连接还涉及网络安全和管理。Calico CNI插件在CNI框架内封装了Calico的功能。
@ -110,13 +109,12 @@ Calico是Kubernetes生态系统中另一种流行的网络选择。虽然Flannel
**Weave**
![kubernetes网络插件对比分析flannel、calico、weave](cni.assets/67b4097c58df478cb348ad50ea752f12.jpeg)
![kubernetes网络插件对比分析flannel、calico、weave](./cni.assets/67b4097c58df478cb348ad50ea752f12.jpeg)
```
链接https://www.weave.works/oss/net/
```
[weave 官网](https://www.weave.works/oss/net/)
Weave是由Weaveworks提供的一种Kubernetes CNI网络选项它提供的模式和我们目前为止讨论的所有网络方案都不同。Weave在集群中的每个节点之间创建网状Overlay网络参与者之间可以灵活路由。这一特性再结合其他一些独特的功能在某些可能导致问题的情况下Weave可以智能地路由。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 386 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

View File

@ -17,17 +17,18 @@ Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 通过
Ingress Controller (通常需要负载均衡器配合)负责实现 Ingress API 对象所声明的能力。如下图所示:
* Ingress Controller 监听所有 worker 节点上的 80/443 端口
* Ingress Controller 将所有对域名为 a.kuboard.cn 的 HTTP/HTTPS 请求路由到 Service B 的 9080 端口
* Service B 将请求进一步转发到其标签所选择的 Pod 容器组(通过 targetPort 指定容器组上的端口号)
1. Ingress Controller 监听所有 worker 节点上的 80/443 端口
2. Ingress Controller 将所有对域名为 a.kuboard.cn 的 HTTP/HTTPS 请求路由到 Service B 的 9080 端口
3. Service B 将请求进一步转发到其标签所选择的 Pod 容器组(通过 targetPort 指定容器组上的端口号)
在下图的 Ingress B 及 Service B 被正确配置的情况下,您将获得如下效果:
* 将 a.kuboard.cn 解析到任意一个 worker 节点的外网 IP 地址(也可以是内网 IP 地址,但此时您的客户端机器也必须在内网)
* 从客户端机器执行命令 `curl http://a.kuboard.cn` 您将获得如下容器组当中一个的返回结果: 10.10.10.2、10.10.10.4、10.10.10.3
<img src="./ingress.assets/image-20190827183054487.png" style="border: 1px solid #d7dae2; max-width: 720px;"></img>
该图中,**请求被转发的过程为:**
0. 假设您将 a.kuboard.cn 的 DNS 解析到了集群中的一个 worker 节点的 IP 地址 `192.168.2.69`。(如果您的 worker 节点有外网地址,请使用外网地址,这样可以使的您从外网访问您的服务)
1. 从客户端机器执行命令 `curl http://a.kuboard.cn/abc/`,该请求您将被转发到 `192.168.2.69` 这个地址的 80 端口,并被 Ingress Controller 接收
2. Ingress Controller 根据请求的域名 `a.kuboard.cn` 和路径 `abc` 匹配集群中所有的 Ingress 信息,并最终找到 `Ingress B` 中有这个配置,其对应的 Service 为 `Service B``9080` 端口
3. Ingress Controller 通过 kube-proxy 将请求转发到 `Service B` 对应的任意一个 Pod 上 与 `Service B``9080` 端口对应的容器端口上。(从 Ingress Controller 到 Pod 的负载均衡由 kube-proxy + Service 实现)
<img src="./ingress.assets/image-20190910222649193.png" style="border: 1px solid #d7dae2; max-width: 720px;"></img>
## Ingress Controller
@ -45,7 +46,6 @@ Ingress Controller 有多种实现可供选择,请参考 Kubernetes 官方文
> 如果您打算使用其他 Ingress Controller您可以 [卸载 Nginx Ingress Controller](/install/install-k8s.html#安装-ingress-controller);如果您尚未安装任何 Ingress Controller请参考 [安装 Nginx Ingress Controller](/install/install-k8s.html#安装-ingress-controller),以便可以完成本教程的后续内容。
``` yaml {2,23,26}
apiVersion: extensions/v1beta1
kind: DaemonSet
@ -125,6 +125,61 @@ spec:
::: tab 使用kubectl lazy
**创建文件 nginx-deployment.yaml**
``` sh
vim nginx-deployment.yaml
```
**文件内容如下**
``` yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
```
**创建文件 nginx-service.yaml**
``` sh
vim nginx-service.yaml
```
**文件内容如下**
``` yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
selector:
app: nginx
ports:
- name: nginx-port
protocol: TCP
port: 80
nodePort: 32600
targetPort: 80
type: NodePort
```
**创建文件 nginx-ingress.yaml**
``` sh
vim nginx-ingress.yaml
@ -132,9 +187,6 @@ vim nginx-ingress.yaml
**文件内容如下**
<CodeSwitcher :languages="{comment:'有注释',nocomment:'无注释'}" :isolated="true">
<template v-slot:comment>
``` yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
@ -150,31 +202,13 @@ spec:
serviceName: nginx-service # 指定后端的 Service 为之前创建的 nginx-service
servicePort: 80
```
</template>
<template v-slot:nocomment>
``` yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress-for-nginx
spec:
rules:
- host: a.demo.kuboard.cn
http:
paths:
- path: /
backend:
serviceName: nginx-service
servicePort: 80
```
</template>
</CodeSwitcher>
**执行命令**
``` sh
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
kubectl apply -f nginx-ingress.yaml
```
@ -196,23 +230,30 @@ curl a.demo.kuboard.cn
::: tab 使用Kuboard lazy
* 在 default 名称空间 点击 ***展现层 --> Nginx部署***
* 在 default 名称空间 点击 ***创建工作负载***
* 点击 ***编辑*** 按钮
填写表单如下:
* 填写表单如下:
* 开启 **互联网入口 Ingress**
* 填写一条记录:
| 字段名称 | 填写内容 | 备注 |
| ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 服务类型 | Deployment | |
| 服务分层 | 展现层 | |
| 服务名称 | web-nginx | |
| 服务描述 | nginx部署 | |
| 副本数量 | 1 | 可以填写其他正整数 |
| 工作容器 | 容器名称nginx<br />镜像nginx:1.7.9<br />抓取策略Always | |
| 访问方式 | NodePortVPC内访问<br />协议: TCP服务端口: 80节点端口: 32601容器端口: 80 | 访问方式对应 Kubernetes Service对象<br />工作负载编辑器为其使用与 Deployment 相同的名字 web-nginx |
| 互联网入口 | 域名: a.demo.kuboard.cn<br />映射URL /<br />服务端口80 | 互联网入口对应 Kubernetes Ingress对象<br />工作负载编辑器为其使用与 Deployment 相同的名字 web-nginx |
| 协议 | 服务端口 | 节点端口 |
| ----------------- | ----------------- | -------- |
| 域名 | a.demo.kuboard.cn | 32601 |
| 路由配置/映射URL | / | |
| 路由配置/服务端口 | 80 | |
**如下图所示:**
* **如下图所示:**
![image-20190827221314997](./ingress.assets/image-20190827221314997.png)
![image-20190910225225179](./ingress.assets/image-20190910225225179.png)
::: tip
Kuboard 工作负载编辑器将 kubernetes 中三个主要对象 Deployment/Service/Ingress 放在同一个编辑器界面中处理。
:::
* 点击 **保存**

View File

@ -57,7 +57,7 @@ ReplicaSet 副本集的主要几个字段有:
副本集将通过创建、删除 Pod 容器组来确保符合 selector 选择器的 Pod 数量等于 replicas 指定的数量。当符合 selector 选择器的 Pod 数量不够时,副本集通过使用 template 中的定义来创建 Pod。
在 Kubernetes 中,并不建议您直接使用 ReplicaSet推荐使用 Deployment由 Deployment 创建和管理 ReplicaSet。
在 Kubernetes 中,并不建议您直接使用 ReplicaSet推荐使用 Deployment由 Deployment 创建和管理 ReplicaSet。 关于副本集的更多信息,请参考 Kubernetes 官网文档 [ReplicaSet](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/)
## Deployment 概述