网络模型

This commit is contained in:
huanqing.shao
2019-11-26 21:36:59 +08:00
parent 72702d0d3a
commit 95b41e369b
13 changed files with 244 additions and 10 deletions

View File

@ -249,6 +249,7 @@ module.exports = {
'k8s-intermediate/service/np-example',
]
},
'k8s-intermediate/service/network'
]
},
{

View File

@ -95,6 +95,7 @@ meta:
* [Ingress 通过互联网访问您的应用](/learning/k8s-intermediate/service/ingress.html)
* [数据卷 Volume](/learning/k8s-intermediate/persistent/volume.html)
* [使用port-forward访问集群中的应用程序](/learning/k8s-practice/access/port-forward.html)
* [Kubernetes网络模型](/learning/k8s-intermediate/service/network.html)
* 下一步,可按教程章节顺序对 Kubernetes 各种概念进行深入理解
:::

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

View File

@ -1,14 +1,14 @@
---
vssueId: 167
layout: LearningLayout
sharingTitle: 深度长文 - 深入理解 Kubernetes 的网络模型
description: Kubernetes中_网络策略定义了一组Pod是否允许相互通信_或者与网络中的其他端点endpoint通信_本文描述了K8S集群中默认的网络策略
sharingTitle: 深度长文 - 深入理解 Kubernetes 的网络模型 - 这次我终于弄明白了
description: Kubernetes用来在集群上运行分布式系统_分布式系统的本质使得网络组件在Kubernetes中是至关重要也不可或缺的_理解 Kubernetes的网络模型可以帮助你更好的在Kubernetes上运行_监控_诊断你的应用程序
meta:
- name: keywords
content: Kubernetes教程,K8S教程,Kubernetes Network Model, K8S 网络模型
---
# Network Model
# Kubernetes网络模型
<AdSenseTitle>
@ -303,8 +303,44 @@ CoreDNS 的工作方式与 `kubedns` 类似,但是通过插件化的架构构
3. 在 VM2 节点上kube-proxy 在节点上安装的 iptables 规则会将该数据包的目标地址判定到对应的 Pod 上(集群内负载均衡将生效)
4. iptables 完成 NAT 映射,并将数据包转发到目标 Pod
<p style="max-width: 600px">
<p style="max-width: 480px">
<img src="./network.assets/internet-to-service.gif" alt="K8S教程_Kubernetes网络模型_数据包的传递_internet-to-service"/>
</p>
### Layer 7Ingress控制器
#### Layer 7Ingress控制器
::: tip 译者注
本章节讲述的 Ingress 控制器实现方式是特定于 AWS 的,与 [nginx ingress controller](/learning/k8s-intermediate/service/ingress.html) 的具体做法有所不同
:::
Layer 7 网络入方向访问在网络堆栈的 HTTP/HTTPS 协议层面工作,并且依赖于 KUbernetes Service。要实现 Layer 7 网络入方向访问,首先需要将 Service 指定为 `NodtePort` 类型,此时 Kubernetes master 将会为该 Service 分配一个 [节点端口](/learning/k8s-intermediate/service/service-types.html#nodeport),每一个节点上的 iptables 都会将此端口上的请求转发到 Service 的后端 Pod 上。此时Service-to-Pod 的路由与 [数据包的传递Service-to-Pod](#数据包的传递service-to-pod) 的描述相同。
接下来,创建一个 Kubernetes [Ingress](/learning/k8s-intermediate/service/ingress.html) 对象可以将该 Service 发布到互联网。Ingress 是一个高度抽象的 HTTP 负载均衡器,可以将 HTTP 请求映射到 Kubernetes Service。在不同的 Kubernetes 集群中Ingress 的具体实现可能是不一样的。与 Layer 4 的网络负载均衡器相似HTTP 负载均衡器只理解节点的 IP 地址(而不是 Pod 的 IP 地址),因此,也同样利用了集群内部通过 iptables 实现的负载均衡特性。
在 AWS 中ALB Ingress 控制器使用 Amazon 的 Layer 7 Application Load Balancer实现了 Kubernetes Ingress 的功能。下图展示了 AWS 上 Ingress 控制器的细节,也展示了网络请求是如何从 ALB 路由到 Kubernetes 集群的。
![K8S教程_Kubernetes网络模型_Ingress_Controller_Design](./network.assets/ingress-controller-design.png)
1. ALB Ingress Controller 创建后,将监听 Kubernetes API 上关于 Ingress 的事件。当发现匹配的 Ingress 对象时Ingress Controller 开始创建 AWS 资源
2. AWS 使用 Application Load BalancerALB来满足 Ingress 对象的要求,并使用 Target Group 将请求路由到目标节点
3. ALB Ingress Controller 为 Kubernetes Ingress 对象中用到的每一个 Kubernetes Service 创建一个 AWS Target Group
4. Listener 是一个 ALB 进程,由 ALB Ingress Controller 根据 Ingress 的注解annotations创建监听 ALB 上指定的协议和端口,并接收外部的请求
5. ALB Ingress Controller 还根据 Kubernetes Ingress 中的路径定义,创建了 Target Group Rule确保指定路径上的请求被路由到合适的 Kubernetes Service
#### 数据包的传递Ingress-to-Service
Ingress-to-Service 的数据包传递与 LoadBalancer-to-Service 的数据包传递非常相似。核心差别是:
* Ingress 能够解析 URL 路径(可基于路径进行路由)
* Ingress 连接到 Service 的 NodePort
下图展示了 Ingress-to-Service 的数据包传递过程。
1. 创建 Ingress 之后cloud controller 将会为其创建一个新的 Ingress Load Balancer
2. 由于 Load Balancer 并不知道 Pod 的 IP 地址,当路由到达 Ingress Load Balancer 之后会被转发到集群中的节点上Service的节点端口
3. 节点上的 iptables 规则将数据包转发到合适的 Pod
4. Pod 接收到数据包
从 Pod 返回的响应数据包将包含 Pod 的 IP 地址,但是请求客户端需要的是 Ingress Load Balancer 的 IP 地址。iptables 和 `conntrack` 被用来重写返回路径上的 IP 地址。
<p style="max-width: 600px">
<img src="./network.assets/ingress-to-service.gif" alt="K8S教程_Kubernetes网络模型_数据包的传递_Ingress-to-Service"/>
</p>

View File

@ -1,12 +1,14 @@
Kuboard v1.0.x 的更新说明
**优化**
**BUG 修复**
* 为什么 ping service-name 会失败?
* EndPoint
* 导入工作负载时,如果存储类没有 annotations不应该报错
* 表单校验:数据卷名不能带小数点

View File

@ -48,4 +48,6 @@ CKA证书的含金量如何考不考这个证完全取决于个人因为
[CKA每日一题 - Day 4](./daily/004.html)
[CKA每日一题 - Day 5](./daily/005.html)
<JoinCKACommunity/>

View File

@ -46,10 +46,6 @@ spec:
### 解析
## 昨日解析
**官网中调度器地址:**
https://kubernetes.io/docs/concepts/scheduling/kube-scheduler/

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

196
t/cka/daily/005.md Normal file
View File

@ -0,0 +1,196 @@
---
vssueId: 170
# layout: StepLayout
sharingTitle: CKA备考打卡 - 每日一题 - Day 5
description: CKA备考打卡 - 每日一题 - Day 5
meta:
- name: keywords
content: Kubernetes,K8S,CKA,Certified Kubernetes Administrator
---
# CKA每日一题 --- Day 5
<AdSenseTitle/>
::: tip 考题
通过命令行创建两个deployment。
- 需要集群中有2个节点
- 第1个deployment名称为cka-1122-01使用nginx镜像有2个pod并配置该deployment自身的pod之间在节点级别反亲和
- 第2个deployment名称为cka-1122-02使用nginx镜像有2个pod并配置该deployment的pod与第1个deployment的pod在节点级别亲和
**最好提交最精简的deployment yaml如果评论被限制请提交反亲和性配置块yaml也可多次评论提交**
:::
<b-button v-b-toggle.collapse-join-error variant="danger" size="sm" style="margin-top: 1rem;" v-on:click="$sendGaEvent('cka-daily', 'cka-daily', 'CKA每日一题003')">答案及解析</b-button>
<b-collapse id="collapse-join-error" class="mt-2">
<b-card style="background-color: rgb(254, 240, 240); border: solid 1px #F56C6C;">
### 答案
第一个deploymentcka-1122-01
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cka-1122-01
name: cka-1122-01
spec:
replicas: 2
selector:
matchLabels:
app: cka-1122-01
template:
metadata:
labels:
app: cka-1122-01
spec:
containers:
- image: nginx
name: cka-1122-01
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- cka-1122-01
topologyKey: "kubernetes.io/hostname"
```
## 第二个deploymentcka-1122-02
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cka-1122-02
name: cka-1122-02
spec:
replicas: 2
selector:
matchLabels:
app: cka-1122-02
template:
metadata:
labels:
app: cka-1122-02
spec:
containers:
- image: nginx
name: cka-1122-02
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- cka-1122-01
topologyKey: "kubernetes.io/hostname"
```
最终调度结果:
``` sh
NAME READY STATUS RESTARTS AGE IP NODE
cka-1122-01-5df9bdf8c9-qwd2v 1/1 Running 0 8m 10.192.4.2 node-1
cka-1122-01-5df9bdf8c9-r4rhs 1/1 Running 0 8m 10.192.4.3 node-2
cka-1122-02-749cd4b846-bjhzq 1/1 Running 0 10m 10.192.4.4 node-1
cka-1122-02-749cd4b846-rkgpo 1/1 Running 0 10m 10.192.4.5 node-2
```
### 解析
**考点k8s中的高级调度及用法。**
亲和性和反亲和性调度官方文档:
[https://kubernetes.io/docs/concepts/configuration/assign-pod-node/](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/)
中文文档: [https://kuboard.cn/learning/k8s-intermediate/config/assign-pod-node.html](https://kuboard.cn/learning/k8s-intermediate/config/assign-pod-node.html)
#### 将 Pod 调度到特定的 Node 上nodeSelector
nodeSelector是节点选择约束的最简单推荐形式。nodeSelector是PodSpec下的一个字段。它指定键值对的映射。为了使Pod可以在节点上运行该节点必须具有每个指定的键值对作为label。
![CKA每日一题_Day5](./005.assets/640-20191126201848208.png)
> 语法格式map[string]string
>
> 作用:
> 匹配node.labels
> 排除不包含nodeSelector中指定label的所有node
> 匹配机制 —— 完全匹配
#### nodeSelector 升级版nodeAffinity
节点亲和性在概念上类似于nodeSelector它可以根据节点上的标签来限制Pod可以被调度在哪些节点上。
![CKA每日一题_Day5](./005.assets/640-20191126201848278.png)
**红色框为硬性过滤:**排除不具备指定label的node在预选阶段起作用
**绿色框为软性评分:**不具备指定label的node打低分 降低node被选中的几率在优选阶段起作用
#### 与nodeSelector关键差异
> 引入运算符InNotIn labelselector语法 支持枚举label可能的取值如 zone in [az1, az2, az3...] 支持硬性过滤和软性评分
>
> 硬性过滤规则支持指定多条件之间的逻辑或运算 软性评分规则支持 设置条件权重值
#### 让某些 Pod 分布在同一组 Node 上podAffinity
Pod亲和性和反亲和性可以基于已经在节点上运行的Pod上的标签而不是基于节点上的标签来限制Pod调度的节点。
**规则的格式为:**
如果该X已经在运行一个或多个满足规则Y的Pod则该Pod应该或者在反亲和性的情况下不应该在X中运行。
Y表示为LabelSelector。X是一个拓扑域例如节点机架云提供者区域云提供者区域等。
![CKA每日一题_Day5](./005.assets/640-20191126201848354.png)
红框硬性过滤排除不具备指定pod的node组在预选阶段起作用绿框软性评分不具备指定pod的node组打低分 降低该组node被选中的几率在优选阶段起作用
#### 与nodeAffinity的关键差异
> 定义在PodSpec中亲和与反亲和规则具有对称性 labelSelector的匹配对象为Pod 对node分组依据label-key=topologyKey每个labelvalue取值为一组
>
> 硬性过滤规则,条件间只有逻辑与运算
#### 避免某些 Pod 分布在同一组 Node 上podAntiAffinity
![CKA每日一题_Day5](./005.assets/640-20191126201848352.png)
#### 与podAffinity的差异
> 匹配过程相同
>
> 最终处理调度结果时取反
>
> podAffinity中可调度节点在podAntiAffinity中为不可调度
> podAffinity中高分节点在podAntiAffinity中为低分
</b-card>
</b-collapse>
> CKA 考试每日一题系列,全部内容由 [我的小碗汤](https://mp.weixin.qq.com/s/5tYgb_eSzHz_TMsi0U32gw) 创作,本站仅做转载
<JoinCKACommunity/>