ASP.NET Core on K8S深入学习(11)K8S网络知多少


Photo :Kubernetes

文 | Edison Zhou

本文已加入《.NET Core on K8S 学习与实践系列文章索引目录》,点击查看容器化相关文章,希望对你有所帮助!

Kubernetes网络模型

       我们都知道Kubernetes作为容器编排引擎,它有一个强大又复杂的网络模型,也牵引出了Pod网络、Service网络、ClusterIP、NodePort、Ingress等多个概念。这里我们采用杨波老师(架构师杨波)模仿TCP/IP协议栈总结的一个K8S网络模型图来看看K8S的四个抽象层次,从而了解一下K8S的网络。本小节的文字主要引用自杨波老师关于K8S网络模型的文章及CloudMan的《每天5分钟玩转Kubernetes》一书。

  

K8S网络层次模型图 (From 波波老师)

  根据上图模型中展示的四个层次,从0到3,除了第0层,每一层都是构建于前一层之上。

  (1)第0层:节点主机互通互联

  主要保证K8S节点(物理或虚拟机)之间能够正常IP寻址和互通的网络,这个一般由底层(公有云或数据中心)网络基础设施支持,这里我们无需过多关心。

  (2)第1层:Pod虚拟机互联

   在一个Pod中可以运行一个或多个容器,且Pod中所有容器使用同一个网络namespace,即相同的IP和端口空间,可以直接用localhost通信,而且还可以共享存储(本质是通过将Volume挂载到Pod中的每个容器)。

 Pod网络模型图 (From 波波老师)

  (3)第2层:服务发现和负载均衡

   在K8S集群中,Pod的IP并不是固定的,可能会频繁地销毁和创建实例,为了解决此问题,Service提供了访问Pod的抽象层。即无论后端Pod如何变化,Service都作为稳定的前端对外提供服务。此外,Service还提供了高可用和负载均衡的功能,它负责将请求转发给正确的Pod。

  

  Service网络模型图 (From 波波老师)

  (4)第3层:外部流量接入

   K8s的Service网络只是一个集群内部网络,集群外部是无法直接访问的。为此,想要将应用暴露出去让公网能够访问,K8S提供了两种方式:

  ① NodePort:使Service通过Cluster节点的静态端口对外提供服务,外部可以通过 NodeIP:NodePort 来访问Service。

  Node Port方式示意图 (From 波波老师)

  ② LoadBalancer:使Service利用Cloud Provider提供的Load Balancer对外提供服务,Cloud Provider负责将Load Balancer的流量导向Service。目前支持的Cloud Provider包括AWS、Azure、阿里云、腾讯云等。

 Load Balancer方式示意图 (From 波波老师)

More:关于K8S网络的更多基本原理与讲解,强力推荐阅读波波老师的以下文章:

  • Kubernetes网络三部曲-Pod网络(From 杨波老师)

  • Kubernetes网络三部曲-Service网络(From 杨波老师)

  • Kubernetes网络三部曲-外部接入网络(From 杨波老师)

传说中的CNI规范

        为了保证网络方案的标准化、扩展性和灵活性,K8S采用了CNIContainer Networking Interface)规范。CNI是一个Pod网络集成标准,简化了K8S和不同Pod网络实现技术的集成。CNI最大的优点就是支持多种容器runtime,而不仅仅是Docker。目前已经有多种支持K8S的网络方案,包括 Flannel、Calico、Canal等,它们都实现了CNI规范,因此无论我们选择哪种具体方案,它们的网络模型都是一致的。

 CNI模型图

More:关于CNI的更多基本原理与讲解,推荐阅读陈Sir的文章《K8S网络详解:CNI与CNI网络模型》

Network Policy

关于Network Policy

  Network Policy是K8S的一种资源,它使K8S可以通过Label选择Pod,并指定其他Pod或外界如何与这些Pod通信。换句话说,当Pod被定义了Network Policy时,只有Policy允许的流量才能访问Pod(默认情况下,任何来源的流量都可以访问Pod,是没有限制的)即帮助K8S实现更为精细的流量控制,实现租户隔离机制。

  But,并不是所有K8S网络方案都支持Network Policy,比如Flannel就不支持,而Calico是支持的。

        下面我们就来实践一下Network Policy,只要三步!

部署Canal

  想要部署Canal,需要切换网络方案,这里我们使用最简单粗暴的方式:重建当前K8S集群

kubeadm reset # 在每个节点上执行一次

  然后,重新对Master节点进行初始化:

kubeadm init \
--apiserver-advertise-address=192.168.2.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.13.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

  在两个Node节点上执行以下命令重新加入集群:(注意这里的token请填写你的Master节点初始化后的输出结果)

kubeadm join 192.168.2.100:6443 --token ekqxk2.iiu5wx5bbnbdtxsw \
--discovery-token-ca-cert-hash \
sha256:c50bb83d04f64f4a714b745f04682b27768c1298f331e697419451f3550f2d05

  最后,通过以下命令部署Canal:(参考自K8S官方文档)

kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/canal.yaml

  此时,再次令验证的集群结果如下:

  (1)集群节点状态

  

   (2)Pod状态

   

部署测试应用

        这里通过一个httpd应用来演示Network Policy,该应用的yaml定义如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: httpd
spec:replicas: 3selector:matchLabels:name: networkpolicy-demotemplate:metadata:labels:name: networkpolicy-demospec:containers:- name: httpdimage: httpd:latestports:- containerPort: 80imagePullPolicy: IfNotPresent---kind: Service
apiVersion: v1
metadata:name: httpd-svc
spec:type: NodePortports:- protocol: TCPnodePort: 31000port: 8080targetPort: 80selector:name: networkpolicy-demo

  通过kubectl将其部署到K8S集群:

kubectl apply -f httpd-demo.yaml

  这时候三个httpd Pod已经成功Running:

  

  由于定义的是NodePort方式暴露服务,这里我们在集群外部访问Service看看:

  

  由于当前并没有创建任何Network Policy,这里我们可以通过创建一个Pod应用(我们熟悉的busybox)来验证一下是否可以在K8S集群内部随意访问该httpd应用:

kubectl run busybox --rm -it --image=busybox /bin/sh

  

  

   从上图可以知道,它可以正常访问到Service,也可以正常ping到Pod节点。

部署Network Policy有效性

  现在我们创建一个Network Policy,其配置文件yaml如下:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: access-httpd
spec:podSelector:matchLabels:name: networkpolicy-demoingress:- from:- podSelector:matchLabels:access: "true"ports:- protocol: TCPport: 80

  该Network Policy定义了如下规则:

  (1)应用于所有 label 为 name : networkpolicy-demo 的Pod,这里即刚刚创建的三个httpd pod。

  (2)ingress中定义了只有 label 为 access : "true" 的Pod才能访问应用。

  (3)即使通过Policy也只能访问80端口

  通过kubectl将其应用到K8S集群中:

kubectl apply -f networkpolicy.yaml

  下面再次在busybox pod中验证Network Policy的有效性:

  

  

  从上图中可以看到,已经无法再成功访问Service,也无法再ping通三个Pod节点。

  这个时候,集群外也无法再通过NodePort访问到Service:

  

  如果想要让测试Pod(busybox)能访问到应用了Network Policy的httpd应用,我们可以对busybox pod加一个label("access=true")就可以:

kubectl run busybox --rm -it --image=busybox \
--labels="access=true" /bin/sh

  运行后的验证结果如下,可以访问到Service,但Ping却被禁止:

  

   但是,此时集群节点(k8s-master与两个node)与集群仍然无法访问到应用了Network Policy的httpd应用,如果想要让它们也访问到,则需要修改Network Policy做一个类似于开防火墙白名单的操作(注意下面的ipBlock配置):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: access-httpd
spec:podSelector:matchLabels:name: networkpolicy-demoingress:- from:- podSelector:matchLabels:access: "true"- ipBlock:cidr: 192.168.2.0/24ports:- protocol: TCPport: 80

  再次应用到K8S集群后,再来通过集群外部的访问者浏览器试试:

  

   可以看到,已经可以正常访问啦!

小结

       本文简单介绍了Kubernetes的4层网络模型、CNI 容器网络接口规范 和 Network Policy,并通过改造K8S集群的网络配置从Flannel到Canal来验证Network Policy的有效性。对于Kubernetes的网络模型的原理与介绍,强烈推荐阅读杨波老师的《Kubernetes网络三部曲》,它的传送门位于下方的参考资料列表中。

        最后,码字不易,也希望各位看官看完觉得还行就在本文右下方顺手点个“在看”,就是对我最大的鼓励!

参考资料:

(1)CloudMan,《每天5分钟玩转Kubernetes》 

(2)李振良,《一天入门Kubernets教程》 

(3)马哥(马永亮),《Kubernetes快速入门》 

(4)Liang,《K8S CNI网络最强对比》 

(5)杨波,《K8S网络三部曲》 

(6)陈Sir,《K8S网络详解:CNI与CNI网络模型》

往期精彩回顾

.NET Core on K8S学习与实践系列文章索引目录

熊逸《唐诗必修50讲》学习笔记系列文章索引目录

【重磅】2019 .NET China Conf 资料下载

2019 .NET Conf China - 路一直都在,社区会更好

阿里云MVP第十期全球发布—让天下没有难做的技术

基于Jenkins的开发测试全流程持续集成实践

基于Jenkins Pipeline的ASP.NET Core持续集成实践

恰童鞋骚年,风华也许不再正茂,但却仍想挥斥方遒

本公众号会长期关注和分享.NET Core,Microservice,Cloud Native,DevOps等技术内容文章,还会与你分享个人生活成长的点滴及各类好书的读书笔记,希望能对你有所帮助,一起成长!

长按订阅更多精彩▼


点个【在看】和更多人一起分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode动态规划 不同路径

A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below). The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the…

Amazon、Linux基金会开发边缘网络交换器操作系统

Amazon、Linux基金会和5家网络业者上周宣布边缘网络交换器操作系统项目DENT,可能冲击开发专属操作系统的网络晶片及设备业者。DENT希望集结网络设备制造商,系统整合商及晶片厂商,为分散式厂区、远端办公室、分公司及零售业开发解构式网络交换…

fit、transform与fit_transform

fit(x) 是对x进行训练 transform(y) 是将模型直接应用于y fit_transform(x) 是对x进行训练后再将模型应用于x x_test加fit,pca x_test不加fit -4 1 0.8855240762093011 0.6501925545571245 0.7678583153832128 -4 3 0.8855236186606635 0.6508344030808729 0.76817…

多库操作:多个数据库的动态切换(一)

▼更多精彩推荐,上午11点到达▼在平时的开发中,受到传统模式的影响,我们都是习惯了单一的数据库表操作,把数据都建到一个库里边,然后进行增删改查,这个是很经典的开发模式。但是随着项目开发,总…

SMOTE/SMOTEEN 处理不平衡数据集

imblearn包 from imblearn.over_sampling import SMOTE from imblearn.combine import SMOTEENN代码 smo SMOTE(random_state42) x_train, y_train smo.fit_sample(x_train, y_train)smo SMOTEENN(random_state42) x_train, y_train smo.fit_sample(x_train, y_train)

超燃| 2019 中国.NET 开发者峰会视频发布

首届 .NET Conf China 2019 年,注定会是 .NET Core 社区发展的关键一年,诸多重大事件在这一年发生!正如大家所期待的那样,刷新中国 .NET 社区的年度盛会——2019 中国 .NET 开发者峰会(.NET Conf China 2019&#xff0…

Lingo优化模型概述

注意事项 lingo中变量默认是非负的示例 model: max 2*x1 3*x2; 2*x1 x2 < 8; 4*x1 3*x2 < 15; end数组型变量 集合段、数据段、目标与约束段、计算段、初始段和子模型段 model: sets: s/1..10/:x; endsetsdata: x 1 2 3 4 5 6 7 8 9 10; enddatamin sum(s(i):x…

刷新.NET

.NET Core 发布的那一天起&#xff0c;它在完成自我刷新的过程&#xff0c;一切为了适应未来&#xff0c;云原生。不仅仅跨平台那么简单。.NET Core 未来发展路线我们发现跳过了.NET Core 4.X 避免了和目前.NET Framework4.X命名上的混乱&#xff0c;明年直接命名为了.NET 5 &a…

XGBClassifier()特征选择

clf XGBClassifier() clf.fit(x_train, y_train) importances clf.feature_importances_ # print(importances) indices np.argsort(importances)[::-1] # print(indices)

如何备份和还原您的Kubernetes集群资源和持久卷?

众所周知&#xff0c;Kubernetes可以协调连接在一起&#xff0c;作为一个工作单元&#xff0c;形成高可用性的计算机集群。Kubernetes包含许多抽象概念&#xff0c;这些抽象概念允许将容器化的应用程序部署到集群中&#xff0c;而无需将它们附加到单独的机器上。简而言之&#…

sklearn评价指标

机器学习中&#xff0c;常见的评价指标如下&#xff1a; 准确率&#xff08;Accuracy&#xff09; 精确率&#xff08;Precision&#xff09; 灵敏度&#xff08;Sensitivity&#xff09;&#xff0c;即召回率&#xff08;Recall&#xff09; 特异度&#xff08;Specificity&am…

C# WPF抽屉效果实现

时间如流水&#xff0c;只能流去不流回&#xff01;点赞再看&#xff0c;养成习惯&#xff0c;这是您给我创作的动力&#xff01;本文 Dotnet9 https://dotnet9.com 已收录&#xff0c;站长乐于分享dotnet相关技术&#xff0c;比如Winform、WPF、ASP.NET Core等&#xff0c;亦有…

seaborn.heatmap概述

点击这里查看官网文档 如果是单纯看数据分布情况&#xff0c;则直接调用包即可。 如果是想看特征两两之间的相似图&#xff0c;则需先求一个相关系数矩阵。 参考样例 import numpy as np import seaborn as sns import matplotlib.pyplot as pltnp.random.seed(10) sns.set_t…

视频来了!Visual Studio Online 东半球首秀 @ .NET Conf 2019 中国峰会

2019 年 11 月 9 日&#xff0c; .NET Conf 2019 中国峰会于上海中谷小南国花园酒店举行&#xff0c;全国的 .NET 大咖相聚上海。这次我演讲的主题是《Visual Studio Code —— .NET 开发利器》。除了聊了聊韩老师开发的 .NET Core Test Explorer&#xff0c;还重点聊了聊 Visu…

PAT-A Sign In and Sign Out

这题挺水的&#xff0c;就是要注意char数组长度至少设置为16&#xff0c;设成15由于存在结尾结束符&#xff0c;会导致长度为15的ID无法存入数组中。 #include<bits/stdc.h> using namespace std;int main() {int n;scanf("%d", &n);char be[16], ed[16];…

开源性能监控工具APM之Skywalking和Pinpoint的实测对比

作者&#xff1a;zollty&#xff0c;资深程序员和架构师&#xff0c;私底下是个爱折腾的技术极客&#xff0c;架构师社区合伙人&#xff01;零&#xff0c;什么是APM&#xff1f;APM&#xff08;ApplicationPerformance Management&#xff09;是一种应用性能监控工具&#xff…

PAT-A Maximum Subsequence Sum

是道常规的动态规划题&#xff0c;不过我有被卡住&#xff08;丢脸 需要考虑当序列整体求和为0的情况。 #include<bits/stdc.h> using namespace std;int main() {int k;vector<int> v;scanf("%d", &k);int temp;bool all_negative true;for(int i…

.Net Core 3.1,这匹黑马,2020年值得所有程序员重视!

强人掌舵 重回巅峰2014年萨蒂亚纳德拉接棒史蒂芬鲍尔默成为微软掌门人&#xff0c;五年的时间&#xff0c;纳德拉将夕阳西下、停滞不前的微软重新带回巅峰状态。2019年&#xff0c;微软今年挤下苹果&#xff0c;成为2019年全球市值最高企业&#xff0c;终止苹果过去7年来的龙头…

GridSearchCV和RandomizedSearchCV(以SVM为例)

GridSearchCV参考代码 CC []gammas []for i in range(-5, 16, 2):CC.append(2 ** i)for i in range(3, -16, -2):gammas.append(2 ** i)param_grid {"C": CC, "gamma": gammas}gs GridSearchCV(SVC(probabilityTrue), param_grid, cv10)gs.fit(x, y)pr…

为什么你没有选择xamarin?

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约900字&#xff0c;预计阅读时间11分钟注&#xff1a;本篇文章只是关于xamarin的一个分享&#xff0c;没有xamarin技术深入的地方2019 年&#xff0c;注定会是 …