Kubernetes -Kubernetes中的Network组件

Network是Kubernetes体系中的重头戏,相比于其它组件来说也比较难,因为Kubernetes中所有的Pod或者服务之间一定是需要进行网络通信的,如果不能解决网络通信的问题,那可以说整个Kubernetes体系中的Pod是没有灵魂的。

所以必须要把Network这个组件搞清楚,那Network这个组件该从哪里开始入手呢?

首先,为了更好的了解Kubernetes中的Network组件,我们先回想下,在Docker中我们的网络是如何做的?
在Docker中,无非是划分成单机和多机,单机中Docker的网络可以由下图所示:
在这里插入图片描述

两个容器在同一个Centos中,为什么彼此能够ping通?是因为有docker0这样的网卡,我们都通过veth这样的一个pair对去匹配,这是最简单的一种场景,是容器之间的通信。

如果一个容器搬到了一个机器中,一个容器搬到了另外一个容器中,我们该如何解决呢?这就涉及到了Docker Swarm多机集群中的通信,可以使用overlay的网络实现,如下图所示:
在这里插入图片描述
如果没有overlay网络,两个container之间是不能进行通信的,那怎么样让两个container进行通信呢?
我们将整个container的信息,通过veth0这样一个跟互联网能够交互的网卡,把整个数据包通过overlay这样的网络发送给我们另外一端,另外一端接收到信息之后再去进行解包, 这样就能进行通信了。这是overlay网络帮我们做的实现,保证了两个容器在多机之间可以进行通信。

但是现在的问题是,我们讨论的并不是container,而讨论的是Pod,因为Pod是Kubernetes中最小的操作单元,所以Kubernetes的网络组件一定是从Pod开始入手。

在这里插入图片描述
我们可以先思考一个问题,在同一个pod中的两个container之间可以通信吗?答案是肯定的,因为同一个Pod中的container肯定会在同一个node上,可以参考单机Docker中container之间的通信。在Docker体系中,container之间通过docker0网卡进行通信;在Kubernetes中,当我们创建一个pod的时候,pod中一定会创建一个名字为pause container的容器,pod中所有的container都会连接到整个container中,这样就可以实现pod中container之间的通信
在这里插入图片描述

了解了同一个pod中container之间的通信之后,我们要思考的问题是同一个集群中pod之间如何通信。Pod之间的通信又可以划分为两个维度:

  1. 同一个Node中Pod之间的通信
  2. 不同Node中Pod之间的通信

我们通过一个例子展示:准备一个nginx-pod,一个busybox-pod

nginx-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx
    ports:
    - containerPort: 80

busybox-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']

将两个pod运行起来,并且查看运行情况

在这里插入图片描述
发现:nginx-pod的ip为192.168.14.11,运行在work01节点;busybox-pod的ip为192.168.221.74,运行在worker02节点。

上面两个ip和我们虚拟机的IP是没有任何关系的,那这个IP是谁帮忙生成的呢?答案是网络插件帮忙生成的,比如calico等。
在这里插入图片描述
经测试发现,我们可以在任意Node上去访问Pod。

在worker02节点访问运行在01节点中的nginx
在这里插入图片描述

在worker01节点上ping busybox pod的ip
在这里插入图片描述

结论:通过网络插件(calico),集群中任意Node中的Pod之间可以彼此通信。
官网:https://kubernetes.io/docs/concepts/cluster-administration/networking/#the-kubernetes-network-model

另外,Pod其实是很不稳定的,因为deployment随时会对Pod进行扩缩容,随时会有Pod被删除和创建(IP也会变化),也就意味着我们不能通过IP稳定的访问Pod内的服务,那要如何解决呢?能不能有一个固定的IP能够让我们去访问特定的Pod呢?答案是肯定的,我们可以通过service组件来控制,也就是在Pod的外面再添加一层service,我们只要访问service的IP,然后service帮忙去负载均衡到servic对应的Pod,如下图所示:
在这里插入图片描述
案例

  1. 创建whoami-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami-deployment
  labels:
    app: whoami
spec:
  replicas: 3
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - name: whoami
        image: jwilder/whoami
        ports:
        - containerPort: 8000
  1. 创建Pod
    在这里插入图片描述
    在这里插入图片描述
  2. 在任意一台机器都可以通过ip和port访问成功
    在这里插入图片描述
  3. 添加service
    先查看默认namespace下有哪些service
    在这里插入图片描述
    通过下面命令给whoami-deployment这个deployment创建service
kubectl expose deployment whoami-deployment

在这里插入图片描述
可以看到我们为whoami-deployment创建了一个ip为10.100.145.244的service。在任意节点通过这个ip去访问whoami,发现都可以访问成功,并且可以做负载均衡。
在这里插入图片描述
注意:这个IP只能在集群内访问,集群外访问不了。

service组件是如何实现这个功能的呢?可以通过下面命令查看service的详细信息

kubectl describe svc whoami-deployment

在这里插入图片描述
可以看到所有Pod的IP信息都在service得到endpoints中。
结论: Cluster IP类型的service的IP可以供集群内访问,并且对很多deployment进行负载均衡。

上面了解了集群内各个Node中Pod之间的通信,那么集群内和集群外面是如何通信的呢?
集群外面访问集群内Pod

方案一:NodePort类型的service

  1. 根据whoami-deployment.yaml创建Pod
    在这里插入图片描述
    此时,我们只能在集群内通过IP去访问。
  2. 创建NodePort类型的service
kubectl expose deployment whoami-deployment --type=NodePort

在这里插入图片描述
可以看到,创建了一个IP为10.104.253.245,类型为NodePort的service,并且把8000端口映射到宿主机上的30448端口。现在我们在集群外面访问30448端口:
在这里插入图片描述
这种类型的service会有一个潜在的问题,那就是端口可能会被占用,随着我们的service越来越多,宿主机的端口可能不够用,所以这种方式不建议在生产环境中使用。

方案二:Loadbalance 类型的service
这种service需要结合第三方供应商帮忙提供域名,并且有一定的约束性,所以也不常用。

方案三:Ingress 类型的网络
官网:https://kubernetes.io/docs/concepts/services-networking/ingress/
通过官网可以发现,Ingress就是帮助我们访问集群内的服务的。不过在看Ingress之前,我们还是先以一个案例出发。很简单,在K8S集群中部署tomcat
浏览器想要访问这个tomcat,也就是外部要访问该tomcat,用之前的Service-NodePort的方式是可以的,比如暴露一个32008端口,只需要访问192.168.0.61:32008即可。显然,Service-NodePort的方式生产环境不推荐使用,那接下来就基于上述需求,使用Ingress实现访问tomcat的需求。

官网Ingress:https://kubernetes.io/docs/concepts/services-networking/ingress/

GitHub Ingress Nginx:https://github.com/kubernetes/ingress-nginx

Nginx Ingress Controller:<https://kubernetes.github.io/ingress-nginx/

  1. 创建tomcat-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  labels:
    app: tomcat
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
spec:
  ports:
  - port: 80   
    protocol: TCP
    targetPort: 8080
  selector:
    app: tomcat
  1. 通过yaml创建pod
    在这里插入图片描述
  2. 该Pod为Ingress Nginx Controller,要想让外界访问,可以通过Service的NodePort或者HostPort方式,这里选择HostPort,比如指定worker01运行
#确保nginx-controller运行到w1节点上
kubectl label node w1 name=ingress   

#mandatory.yaml下载地址
https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/mandatory.yaml
修改mandatory.yaml
    spec:
      # wait up to five minutes for the drain of connections
      terminationGracePeriodSeconds: 300
      serviceAccountName: nginx-ingress-serviceaccount
      hostNetwork: true
      nodeSelector:
        name: ingress
        kubernetes.io/os: linux
      containers:

#使用HostPort方式运行,需要增加配置
hostNetwork: true

#搜索nodeSelector,并且要确保w1节点上的80和443端口没有被占用,镜像拉取需要较长的时间,这块注意一下哦
kubectl apply -f mandatory.yaml  
kubectl get all -n ingress-nginx
  1. 创建Ingress以及定义转发规则nginx-ingress.yaml
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - host: tomcat.demo.com
    http:
      paths:
      - path: /
        backend:
          serviceName: tomcat-service
          servicePort: 80

kubectl apply -f nginx-ingress.yaml
kubectl get ingress
kubectl describe ingress nginx-ingress

在这里插入图片描述
5. 修改win的hosts文件,添加dns解析

192.168.0.61   tomcat.demo.com
  1. 打开浏览器,访问tomcat.demo.com

总结:如果以后想要使用Ingress网络,其实只要定义ingress,service和pod即可,前提是要保证nginx ingress controller已经配置好了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

dlib是什么?

dlib C Libraryhttp://dlib.net/ dlib是什么&#xff1f; Dlib is a modern C toolkit containing machine learning algorithms and tools for creating complex software in C to solve real world problems. It is used in both industry and academia in a wide range of…

面试官:性能测试瓶颈调优你是真的会吗?

引言&#xff1a;性能瓶颈调优 在实际的性能测试中&#xff0c;会遇到各种各样的问题&#xff0c;比如 TPS 压不上去等&#xff0c;导致这种现象的原因有很多&#xff0c;测试人员应配合开发人员进行分析&#xff0c;尽快找出瓶颈所在。 理想的性能测试指标结果可能不是很高&…

小目标检测模型设计的一点思考

1. 小目标的特性 目标之间的交叠概率比较低&#xff0c;即使有交叠&#xff0c;其IoU多数情况下也是比较小的 AI-TOD Tiny Person Dateset 小目标自身的纹理显著度有强弱区别&#xff0c;但是总体来说纹理特征都较弱&#xff0c;很多时候需要借助一定的图像上下文来帮助确认 …

SpringBoot 官方脚手架不再支持Java8和Java11

Spring 官方脚手架不再支持初始化 Java8 和 Java 11 项目&#xff0c;目前仅支持初始化Java17 和 Java21 项目。 阿里巴巴Spring脚手架支持初始化Java8、Java11、Java17、Java19 的项目&#xff0c;不支持初始化Java21的项目。

一文搞懂Lombok Plugins使用与原理

目录 一文搞懂Lombok使用与原理 1.前言2.什么是Lombok3. IntelliJ安装Lombok3.1通过IntelliJ的插件中心安装3.2在项目中使用Lombok Plugins 4.Lombok 注解大全说明4.1POJO类常用注解4.2其他注解 5.Lombok常见问题6.总结7.参考 文章所属专区 超链接 1.前言 2.什么是Lombok Lo…

WPS宏批量修改图片尺寸

致谢 感谢网络各位大佬的分享&#xff0c;可以让我快速的学习这块内容。 JS宏代码

上班必备——项目部署环境

大家都知道&#xff0c;互联网行业有很多的岗位&#xff0c;前端&#xff0c;后端&#xff0c;产品&#xff0c;测试&#xff0c;ui等。 ui&#xff0c;产品和测试的同事在前端开发的过程中&#xff0c;都会时刻关注着进度&#xff0c;是要看页面效果的&#xff0c;这个时候怎…

MIT线性代数笔记-第28讲-正定矩阵,最小值

目录 28.正定矩阵&#xff0c;最小值打赏 28.正定矩阵&#xff0c;最小值 首先正定矩阵是一个实对称矩阵 由第 26 26 26讲的末尾可知正定矩阵有以下四种判定条件&#xff1a; 所有特征值都为正左上角所有 k k k阶子矩阵行列式都为正&#xff08; 1 ≤ k ≤ n 1 \le k \le n …

SpringBoot默认使用CGLIB的原因

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

基于ssm农产品仓库管理系统系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本农产品仓库管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…

springboot084基于springboot的论坛网站

springboot084基于springboot的论坛网站 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

回味童年经典游戏的项目

目录 1.超级玛丽2.坦克大战3.吃豆人游戏4.贪吃蛇游戏 1.超级玛丽 项目地址&#xff1a;超级马里奥游戏源码 在线试玩网址在资源描述中 在线试玩&#xff1a;http://martindrapeau.github.io/backbone-game-engine/super-mario-bros/index.html 主要语言&#xff1a;JavaScript…

列表标签的介绍与使用

列表的作用&#xff1a; 整齐、整洁、有序&#xff0c;它作为布局会更加自由和方便。 根据使用情景不同&#xff0c;列表可以分为三大类&#xff1a;无序列表、有序列表和自定义列表 无序列表 <ul> 标签表示 HTML 页面中项目的无序列表&#xff0c;一般会以项目符号呈…

C++设计模式——Adapter(适配器)模式

一、Adapter模式是个啥&#xff1f; 适配器模式在软件开发的江湖里&#xff0c;可以说用途是非常广的。下面几个经典的场景来说明适配器模式的使用。 场景一 场景二 假如你正在开发一款股票市场监测程序&#xff0c; 它会从不同来源下载 XML 格式的股票数据&#xff0c; 然后…

力扣每日一题day33[111. 二叉树的最小深度]

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2示例 2&#xff1a; 输入…

传感器(一) :IMU / 陀螺仪模块

IMU / 陀螺仪模块 一、概述二、注意参数2.1 陀螺仪芯片标准&#xff08;MPU6050)2.2 参数说明 三、IMU模式使用注意事项3.1 IMU模块安装注意事项3.2 为什么IMU要安装在机器中心位置 四、常见陀螺仪芯片品牌 一、概述 IMU全称为惯性测量单元&#xff0c;可以通过测量物体在三维空…

SpringSecurity6 | 登陆后的跳转

SpringSecurity6 | 自定义认证规则 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Ja…

HTML5+CSS3小实例:3D翻转Tab选项卡切换特效

实例:3D翻转Tab选项卡切换特效 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=…

JavaScript基础知识整理(最全知识点, 精简版,0基础版)

文章目录 一、输入和输出内容 1.1 输出 1.1.1 在浏览器的控制台输出打印 1.1.2 直接在浏览器的页面上输出内容 1.1.3 页面弹出警告对话框 1.2 输入 二、变量 2.1 变量是什么 2.2 变量的声明和赋值 2.3 变量的命名规范和规范 三、变量扩展&#xff08;数组&#xff09; 3.1 数组…

MyBatis 四大核心组件之 ParameterHandler 源码解析

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…