11-k8s-service网络

文章目录

    • 一、网络相关资源介绍
    • 二、开启ipvs
    • 三、nginx网络示例
    • 四、pod之间的访问示例
    • 五、service反向代理示例

一、网络相关资源介绍

  1. Servcie介绍

    Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口。借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签来选取服务后端,一般配合Replication Controller或者Deployment来保证后端容器的正常运行。这些匹配标签的Pod IP和端口列表组成endpoints,由kubeproxy负责将服务IP负载均衡到这些endpoints上。即service不会直接到pod,service是直接到endpoint资源,就是地址加端口,再由endpoint再关联到pod。

  2. Endpoint介绍

    Endpoint主要记录了每个pod的IP地址信息,当Pod的IP发生变化时,endpoints会进行更新。当我们创建Service的时候,会自动生成一个Endpoint。

  3. Service的四种类型

    • ClusterIP:默认类型,自动分配一个仅cluster内部可以访问的虚拟IP

    • NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务,以便外部可以通过端口访问到该服务。

      如果不指定会随机指定端口,端口范围:30000~32767,端口范围配置在/usr/lib/systemd/system/kube-apiserver.service文件中

    • LoadBalancer:使用云提供商的负载均衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。

    • ExternalName:将服务通过DNS CNAME记录方式转发到指定的域名(通过 spec.externlName 设定) 。需要kube-dns版本在1.7以上。

  4. kube-proxy

    Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个Node节点上都运行着一个kube-proxy服务进程。当创建Service的时候会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种Service的变动,然后它会将最新的Service信息转换成对应的访问规则
    在这里插入图片描述

    kube-proxy目前支持三种工作模式:

    • userspace :userspace模式下,kube-proxy会为每一个Service创建一个监听端口,发向Cluster IP的请求被Iptables规则重定向到kube-proxy监听的端口上,kube-proxy根据LB算法选择一个提供服务的Pod并和其建立链接,以将请求转发到Pod上。 该模式下,kube-proxy充当了一个四层负责均衡器的角色。由于kube-proxy运行在userspace中,在进行转发处理时会增加内核和用户空间之间的数据拷贝,虽然比较稳定,但是效率比较低。
    • iptables:iptables模式下,kube-proxy为service后端的每个Pod创建对应的iptables规则,直接将发向Cluster IP的请求重定向到一个Pod IP。 该模式下kube-proxy不承担四层负责均衡器的角色,只负责创建iptables规则。该模式的优点是较userspace模式效率更高,但不能提供灵活的LB策略,当后端Pod不可用时也无法进行重试。
    • ipvs 模式(推荐):ipvs模式和iptables类似,kube-proxy监控Pod的变化并创建相应的ipvs规则。ipvs相对iptables转发效率更高。除此以外,ipvs支持更多的LB算法。

二、开启ipvs

ps:master节点操作

  1. 查看未开启状态:ipvsadm -Ln
    在这里插入图片描述

  2. 在Master节点修改,将mode: " "修改为mode: “ipvs”:kubectl edit -n kube-system cm kube-proxy

  3. 查看kube-system命名空间下的kube-proxy:kubectl get pod -n kube-system
    在这里插入图片描述

  4. 删除:kubectl get pod -n kube-system |grep kube-proxy |awk ‘{system(“kubectl delete pod “$1” -n kube-system”)}’

  5. 删除后,k8s会自动再次生成,新生成的kube-proxy会采用刚刚配置的ipvs模式,再次查看:kubectl get pod -n kube-system

  6. 查看启动方式

    kubectl get pod -n kube-system | grep kube-proxy
    kubectl logs -n kube-system kube-proxy-4c5xj
    

在这里插入图片描述

  1. 再次查看:ipvsadm -Ln
    在这里插入图片描述

三、nginx网络示例

ps:master节点操作

  1. 部署:kubectl create deployment nginx --image=nginx

  2. 查看状态:watch -n 3 kubectl get pods -A
    在这里插入图片描述

  3. 本机访问

    1)查看默认生成的ClusterIP:kubectl get pod -o wide
    在这里插入图片描述
    2)访问:curl 192.169.189.110
    在这里插入图片描述

    3)查看路由:route -n
    在这里插入图片描述

    4)查看192.168.248.12服务器的路由
    在这里插入图片描述

    5)每个节点都会记录相应的CIN生成的IP,并且也会记录对应的源IP作为互联网关口。如上所见,我们在worker2(192.168.248.12)部署了pod,当我们访问189.*的时候,会跳转到worker2(192.168.248.12)网关。所以当我们访问 192.169.189.110时,实际上访问的是192.168.248.12上的nginx。

  4. 创建供外部访问的ip和端口(NodePort):kubectl expose deployment nginx --port=80 --type=NodePort

    ps:在最新的 Kubernetes 版本中,kubectl expose 不再支持 --node-port 参数来指定 NodePort 端口。如果需要指定端口,则需要编写yaml文件生成。

  5. 查看端口:kubectl get pods,svc
    在这里插入图片描述

  6. 访问nginx页面:http://192.168.248.11:30579
    在这里插入图片描述

四、pod之间的访问示例

  1. pod之间的网络访问推荐通过service name进行访问

  2. 创建busybox的pod并且进入: kubectl run -it --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh

    ps:busybox是一个聚成了一百多个最常用linux命令和工具的软件工具箱,它在单一的可执行文件中提供了精简的Unix工具集,便于测试。

  3. 访问nginx:wget http://nginx
    在这里插入图片描述

  4. 跨空间访问其他的service(加上".空间名"): wget http://nginx.default

五、service反向代理示例

  1. 反向代理外部ip:创建service并且自定义endpoints

    1)编写service.yaml:vi /opt/edsvc.yaml

    ps:不指定空间的默认default空间

    apiVersion: v1
    kind: Service 
    metadata:name: nginx-svc-external labels:app: nginx
    spec:ports: - port: 80 targetPort: 80name: web type: ClusterIP  
    

    解释

    apiVersion: v1
    kind: Service #资源类型为Service
    metadata:name: nginx-svc-external # Service 名字labels:app: nginx # Service 自己本身的标签
    spec:ports: #端口映射- port: 80 #service自己的端口,在使用内网ip访间时使用targetPort: 80 #目标pod的端口name: nginx-web #为端口起个名字type: ClusterIP  #主随机启动一个瑞口(3080-32767》,映射到ports 中的踏口,该端口是直接掷定在node 上的,且集群中的每一个node都会绑定这个端口#也可以用于将服务暴露给外部访问,但是这种方式实际生产环境不推荐,效率较低,而且 Service 是四层负载
    

    2)编写endpoints.yaml:vi /opt/endpoints.yaml

    apiVersion: v1
    kind: Endpoints
    metadata:labels:app: nginx name: nginx-svc-external namespace: default 
    subsets:
    - addresses:- ip: 120.78.159.117 ports:  - name: nginx-webport: 80protocol: TCP
    

    解释

    apiVersion: v1
    kind: Endpoints
    metadata:labels:app: nginx # 与service一致name: nginx-svc-external #与service一致namespace: default #与service一致
    subsets:
    - addresses:- ip: 120.78.159.117 #目标ip 地址ports: #与service一致- name: webport: 80protocol: TCP
    

    3)创建资源

    kubectl apply -f  /opt/edsvc.yaml
    kubectl apply -f  /opt/endpoints.yaml
    

    4)查看代理地址:kubectl get ep
    在这里插入图片描述

    4)测试访问:kubectl run -it --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh --> wget http://nginx-svc-external

    ps:可以看到,路径转发到外网ip去了
    在这里插入图片描述

  2. 反向代理外部域名

    1)创建资源:vi /opt/baidusvc.yaml

    apiVersion: v1
    kind: Service
    metadata:labels:app: wolfcode-external-domainname: wolfcode-external-domain
    spec:type: ExternalName externalName: www.wolfcode.cn
    

    2)创建资源:kubectl apply -f /opt/baidusvc.yaml

    3)查看svc:kubectl get svc
    在这里插入图片描述

    4)测试访问:kubectl run -it --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh --> wget wolfcode-external-domain
    在这里插入图片描述

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

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

相关文章

如何在电脑上设置新的蓝牙耳机

本文介绍如何将蓝牙耳机连接到Windows或Mac电脑。 如何在Windows上设置新的蓝牙耳机 蓝牙耳机的设置过程因平台而异,但以下是Windows 11的步骤: 1、选择“开始”,然后在搜索框中输入蓝牙,以显示蓝牙和其他设备。 2、选择添加设…

【马蹄集】—— 概率论专题:第二类斯特林数

概率论专题:第二类斯特林数 目录 MT2224 矩阵乘法MT2231 越狱MT2232 找朋友MT2233 盒子与球MT2234 点餐 MT2224 矩阵乘法 难度:黄金    时间限制:5秒    占用内存:128M 题目描述 输入两个矩阵,第一个矩阵尺寸为 l…

2024年仁爱学院专升本招生专业对应范围专业目录更新的通知

天津仁爱学院2024年高职升本科招生专业对应范围专业目录 为了更好的进行天津仁爱学院专升本工作,动画专业不分文理进行录取。为了进一步提升录取专业的培养需要,请同学们复习专业课时加强专业课学习,请同学们在报考时关注天津仁爱学院招生章…

Unreal Engine 4 + miniconda + Python2.7 + Pycharm

1.​首先启用UE4插件里的Python Scripting插件 ​ 2. 在UE4项目设置中 开启Python开发者模式 生成unreal.py文件,用于在Pychram中引入Unreal PythonAPI 生成的unreal.py 在: "项目路径\Intermediate\PythonStub\unreal.py"3. 安装Miniconda…

关于opencv的contourArea计算方法

cv::contourArea计算的轮廓面积并不等于轮廓点计数,原因是cv::contourArea是基于Green公式计算 老外的讨论 github 举一个直观的例子,图中有7个像素,橙色为轮廓点连线,按照contourArea的定义,轮廓的面积为橙色所包围…

Visual Studio Code官网下载、vscode下载很慢、vscode下载不了 解决方案

前言 开发界的小伙伴们对于Visual Studio Code开发环境来可以说非常熟悉了,但由于在Visual Studio Code官网的下载速度非常的慢,即便开了代理也是一样的很慢、甚至下载被中断,几乎不能下载。 解决方案 1、在Web浏览器上打开vscode官网&#…

Pytorch搭建DTLN降噪算法

前面介绍了几种轻量级网路结构的降噪做法,本文介绍DTLN—一种时频双核心网络降噪做法。 AI-GruNet降噪算法 AI-CGNet降噪算法 AI-FGNet降噪算法 Pytorch搭建实虚部重建AI-GruNet降噪算法 一、模型结构 DTLN来自[2005.07551] Dual-Signal Transformation LSTM N…

macos使用搭建算法竞赛c/c++的g++/gcc编译环境(homebrew,含万能头,改环境变量,vscode/clion可用)

文章目录 1、homebrew安装2、安装g3、改环境变量 1、homebrew安装 我没改镜像,直接网上脚本一键安装的,具体命令忘了,可能是这个 反正装这个的方法很多,网上一搜都有。 成功装上homebrew就行。 /bin/bash -c "$(curl -fsSL…

微信小程序6

一、什么是后台交互? 在小程序中,与后台交互指的是小程序前端与后台服务器之间的数据通信和请求处理过程。通过与后台交互,小程序能够获取服务器端的数据、上传用户数据、发送请求等。 与后台交互可以通过以下方式实现: 发起网络请…

redis的cluster

1.我们的哨兵模式中,当主节点挂掉以后,此时哨兵会重新进行选举,选举出新的主节点去对外提供写服务 在选举的过程中,他redis整个集群是不提供写服务的 (因为此时我们哨兵对外提供写服务的只有Master) 2.我们单节点的red…

ESP32集成开发环境Espressif-IDE安装 – Windows

陈拓 2023/10/15-2023/10/16 1. 概述 Espressif IDE是一个基于Eclipse CDT的集成开发环境(IDE),用于使用ESP-IDF框架开发物联网应用程序。这是一个专门为ESP-IDF构建的独立定制IDE。Espressif IDE附带了IDF Eclipse插件、重要的Eclipse CDT插…

【数据结构】线性表(八)队列:顺序队列及其基本操作(初始化、判空、判满、入队、出队、存取队首元素)

文章目录 一、队列1. 定义2. 基本操作 二、顺序队列0. 顺序表1. 头文件和常量2. 队列结构体3. 队列的初始化4. 判断队列是否为空5. 判断队列是否已满6. 入队7. 出队8. 存取队首元素9. 主函数10. 代码整合 堆栈Stack 和 队列Queue是两种非常重要的数据结构,两者都是特…

美格智能出席无锡智能网联汽车生态大会,共话数字座舱新势力

10月20日,2023世界物联网博览会期间,以“智 行天下 启未来”为主题的2023无锡智能网联汽车生态大会暨域控制器及智能座舱论坛在无锡举行。大会邀请行业权威专家,多家知名企业重磅嘉宾出席,融汇智能网联汽车思想智慧、创新技术、产…

微信小程序连接数据库与WXS的使用

微信小程序连接数据库与WXS的使用 1.搭建数据库连接,使用后端获取数据1.请求方式的封装2.化一下代码,这样写太繁琐了3.前端代码 四、WXS的使用1..解决数据显示数字问题2. 解决统计人数问题3.解决时间进制问题 ) 1.搭建数据库连接,使用后端获取数据 为了后期方便维护…

李m圆申论

听话出活 3小时 /处理7500字 /一共5题 /写出2200字 字写得好看点,符号也算字数,占一个格 基本思路:考什么范围答什么 。。。落后;资源闲置、缺乏 申论: 作文题:举例子 处理材料 摘抄: 有人出…

基础MySQL的语法练习

基础MySQL的语法练习 create table DEPT(DEPTNO int(2) not null,DNAME VARCHAR(14),LOC VARCHAR(13) );alter table DEPTadd constraint PK_DEPT primary key (DEPTNO);create table EMP (EMPNO int(4) primary key,ENAME VARCHAR(10),JOB VARCHAR(9),MGR …

【机器学习】集成模型/集成学习:多个模型相结合实现更好的预测

1. 概述 1.1 什么是集成模型/集成学习 "模型集成"和"集成学习"是相同的概念。它们都指的是将多个机器学习模型组合在一起,以提高预测的准确性和稳定性的技术。通过结合多个模型的预测结果,集成学习可以减少单个模型的偏差和方差&am…

13.3测试用例进阶

一.测试对象划分 1.界面测试(参考软件规格说明书和UI视觉稿) a.什么是界面 1)WEB站(浏览器) 2)app 3)小程序 4)公众号 b.测试内容 1)界面内容显示的一致性,完整性,准确性,友好性.比如界面内容对屏幕大小的自适应,换行,内容是否全部清晰展示. 2)验证整个界面布局和排版…

RunnerGo 支持UI自动化的测试平台

RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块,覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建,内嵌高度可复用的测试脚本,测试团队无需复杂的代码编写即可开展低代码的自动化…

Leetcode——字符

520. 检测大写字母 class Solution { public:bool detectCapitalUse(string word) {int big 0, small 0, len word.length();for (int i 0; i < len; i) {if (word[i] > 65 && word[i] < 90) {big;}else {small;}}if (big len || small len) {return tr…