当前位置: 首页 > news >正文

K8S四层代理Service-02

Service的四种类型使用

  • ClusterIP
    • 使用示例
    • Pod里使用service的服务名访问应用
  • NodePort
    • 使用示例
  • ExternalName
    • 使用示例
  • LoadBalancer

K8S支持以下4种Service类型:ClusterIP、NodePort、ExternalName、LoadBalancer
以下是使用4种类型进行Service创建,应对不同场景

ClusterIP

默认类型,适用于仅在集群内部提供服务的应用。创建的Service仅可在集群内部访问,由K8S自动分配IP地址。

使用示例

1、创建pod

vim pod_test_1.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-test-1
spec:selector:matchLabels:test: cluster # 配置deployment的标签,必须与pod标签一致replicas: 2  # 配置deployment的pod数template:metadata:labels:test: cluster # 配置pod的标签spec:containers:- name: my-nginximage: docker.io/library/nginx:latest # 使用的镜像imagePullPolicy: IfNotPresent # 节点本地没找到镜像再去远程仓库拉取ports:- containerPort: 80  #pod中的容器需要暴露的端口startupProbe:  # 配置启动探测periodSeconds: 5initialDelaySeconds: 60timeoutSeconds: 10httpGet:   scheme: HTTPport: 80path: /livenessProbe: # 配置存活探测periodSeconds: 5initialDelaySeconds: 60timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /readinessProbe: # 配置就绪探测(只有探测就绪成功后才会记录到Service里的endpoint)periodSeconds: 5initialDelaySeconds: 60 # pod启动后首次检查就绪探测的时间,单位为秒。timeoutSeconds: 10httpGet:    # 探测方式是HTTP发起GET请求服务的80端口访问根路径scheme: HTTPport: 80path: /

更新启动资源

kubectl apply -f pod_test_1.yaml

在这里插入图片描述
查看刚才创建的Pod ip地址

kubectl get pods -owide -l test=cluster

在这里插入图片描述
查看 ReplicaSet信息

kubectl get replicaset -l test=cluster

在这里插入图片描述
请求pod的 IP地址,访问应用

curl 10.244.36.75:80

在这里插入图片描述

curl 10.244.169.133

在这里插入图片描述
在pod1中请求pod2的应用,可以访问

kubectl exec -it nginx-test-1-69ddb65d98-vq2r6 -- /bin/bash

在这里插入图片描述
“误”删除其中一个Pod,查看Pod集群变化

kubectl delete pods nginx-test-1-69ddb65d98-vq2r6
kubectl get pods -owide -l test=cluster

在这里插入图片描述

通过上面可以看到重新生成了一个pod:nginx-test-1-69ddb65d98-nkjnv,IP是110.244.36.76,在k8s中创建pod,如果pod被删除了,重新生成的pod的IP地址会发生变化,所以需要在pod前端加一个固定接入层。

2、创建service

vim service_test_1.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:name: nginx-test-1labels:test: cluster
spec:type: ClusterIPports:- port: 80   #service的端口,暴露给k8s集群内部服务访问protocol: TCPtargetPort: 80    #pod容器中定义的端口selector:test: cluster  #选择拥有test=cluster标签的pod

上述yaml文件将创建一个 Service,关联具有标签test=cluster的Pod,目标TCP端口80
(targetPort:容器接收流量的端口;port:抽象的 Service 端口,可以使任何其它 Pod访问该 Service的端口)。

更新启动Service

kubectl apply -f service_test_1.yaml

查看Service

kubectl get svc -l test=cluster

在这里插入图片描述
在k8s控制节点访问service的 IP:port 就可以把请求代理到后端pod

curl 10.111.10.207:80

在这里插入图片描述
通过上面可以看到请求Service IP:port 跟直接访问pod IP:port 看到的结果一样,这就说明Service可以把请求代理到它所关联的后端Pod
注意:上图的 “10.111.10.207:80” 地址只能是在k8s集群内部访问,在外部无法访问,想要通过浏览器是访问不通的

Pod里使用service的服务名访问应用

service只要创建完成,就可以直接解析它的服务名,每一个服务创建完成后都会在集群dns中动态添加一个资源记录,添加完成后就可以解析了,资源记录格式是:
SVC_NAME.NS_NAME.DOMAIN.LTD. 服务名.命名空间.域名后缀
集群默认的域名后缀是:svc.cluster.local
上面创建的nginx-test-1服务,完整名称解析是:nginx-test-1.default.svc.cluster.local

在Pod里通过Service的服务名访问应用

kubectl exec -it nginx-test-1-69ddb65d98-nkjnv -- /bin/bash
curl nginx-test-1.default.svc.cluster.local

在这里插入图片描述

NodePort

适用于需要从外部访问Service的应用。创建的Service在每个节点上公开一个静态端口,使得外部客户端可以通过公开的端口访问Service的应用。

使用示例

1、创建pod

vim pod_test_2.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-test-2
spec:selector:matchLabels:test: nodeportreplicas: 2template:metadata:labels:test: nodeportspec:containers:- name: my-nginximage: docker.io/library/nginx:latestimagePullPolicy: IfNotPresentports:- containerPort: 80  #pod中的容器需要暴露的端口startupProbe:periodSeconds: 5initialDelaySeconds: 60timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /livenessProbe:periodSeconds: 5initialDelaySeconds: 60timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /readinessProbe:periodSeconds: 5initialDelaySeconds: 60timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /

更新启动资源

kubectl apply -f pod_test_2.yaml

在这里插入图片描述
查看pod是否创建成功

kubectl get pods -owide -l test=nodeport

在这里插入图片描述
2、创建service,代理pod

vim service_test_2.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:name: nginx-test-2labels:test: nodeport
spec:type: NodePortports:- port: 80protocol: TCPtargetPort: 80nodePort: 30380selector:test: nodeport

更新启动Service

kubectl apply -f service_test_2.yaml

查看Service

kubectl get svc -l test=nodeport

在这里插入图片描述

kubectl describe svc nginx-test-2

在这里插入图片描述

访问Service

curl 10.102.33.103

在这里插入图片描述

注意:10.102.33.103是k8s集群内部的Service的IP地址,只能在k8s集群内部访问,在集群外无法访问。

在集群外访问Service(K8S的node节点IP:nodePort)
PS. 我本地搭建是一个控制节点+2个工作节点

  • 192.168.40.182:30380(控制节点)
  • 192.168.40.183:30380(工作节点1)
  • 192.168.40.184:30380(工作节点2)

以上3个地址都能访问到应用
在这里插入图片描述
数据转发流程

ipvsadm -Ln

在这里插入图片描述

ip addr

在这里插入图片描述

客户端请求(任何一个节点IP+端口)http://192.168.40.182:30380->docker0
虚拟网卡:172.17.0.1:30380->10.244.36.80:80,10.244.169.137:80

ExternalName

适用于跨名称空间访问。例如:命名空间为“default”下的client 服务,想要访问命名空间为“nginx-ns”下的nginx-svc服务。可通过DNS解析直接访问该服务,不需要其他负载均衡器。

使用示例

1、新建一个命名空间

kubectl create ns nginx-ns

2、搭建nginx-svc服务
2.1 创建pod

vim nginx_deployment.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: nginx-ns
spec: replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresent

更新启动资源

kubectl apply -f nginx_deployment.yaml

查看pod是否创建成功

kubectl get pods -n nginx-ns

在这里插入图片描述

2.2 创建service

vim nginx_svc.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:name: nginx-svcnamespace: nginx-ns
spec:selector:app: nginxports:- name: httpprotocol: TCPport: 80targetPort: 80

更新启动Service

kubectl apply -f nginx_svc.yaml

查看Service信息

kubectl get svc -n nginx-nskubectl describe svc  nginx-svc -n nginx-ns

在这里插入图片描述

3、搭建client 服务
3.1 创建pod

vim client.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:name: client
spec: replicas: 1selector:matchLabels:app: busyboxtemplate:metadata:labels:app: busyboxspec:containers:- name: busyboximage: busyboximagePullPolicy: IfNotPresentcommand: ["/bin/sh","-c","sleep 36000"]

更新启动资源

kubectl apply -f client.yaml

该文件中指定了到 nginx-svc 的软链,让使用者感觉就好像调用自己命名空间的服务一样
查看pod是否正常运行

kubectl get pods -l app=busybox

在这里插入图片描述

3.2 创建service

vim client_svc.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:name: client-svc
spec:type: ExternalNameexternalName: nginx-svc.nginx-ns.svc.cluster.localports:- name: httpport: 80targetPort: 80

更新启动Service

kubectl apply -f client_svc.yaml

登录到client pod

kubectl exec -it  client-568955849b-mt47t -- /bin/sh
wget -q -O - client-svc.default.svc.cluster.local
wget -q -O - nginx-svc.nginx-ns.svc.cluster.local

在这里插入图片描述
在这里插入图片描述

上面两个请求的结果一样

LoadBalancer

LoadBalancer类型适用于需要提供公共服务并且需要高可用性和高伸缩性的场景。与其他类型的Service相比实现更复杂,需要绑定到云平台的负载均衡器服务上,因此通常适用于云平台环境。
(ps. 设备有限,没有做这块的实验。
特放官网的链接:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#loadbalancer)

相关文章:

K8S四层代理Service-02

Service的四种类型使用 ClusterIP使用示例Pod里使用service的服务名访问应用 NodePort使用示例 ExternalName使用示例 LoadBalancer K8S支持以下4种Service类型:ClusterIP、NodePort、ExternalName、LoadBalancer 以下是使用4种类型进行Service创建,应对…...

3、非数值型的分类变量

非数值型的分类变量 有很多非数字的数据,这里介绍如何使用它来进行机器学习。 在本教程中,您将了解什么是分类变量,以及处理此类数据的三种方法。 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 文章目录 1、简介2、三种方法的使用1…...

国内免费chartGPT网站汇总

https://s.suolj.com - (支持文心、科大讯飞、智谱等国内大语言模型,Midjourney绘画、语音对讲、聊天插件)国内可以直连,响应速度很快 很稳定 https://seboai.github.io - 国内可以直连,响应速度很快 很稳定 http://gp…...

【Alibaba工具型技术系列】「EasyExcel技术专题」实战研究一下 EasyExcel 如何从指定文件位置进行读取数据

实战研究一下 EasyExcel 如何从指定文件位置进行读取数据 EasyExcel的使用背景EasyExcel的时候痛点EasyExcel对比其他框架 EasyExcel的编程模式EasyExcel读取的指定位置导入数据的流程表头校验invokeHeadMap()方法 数据处理invoke()方法 执行中断hasNextdoAfterAllAnalysed()方…...

java.security.InvalidKeyException: Illegal key size错误

出现的问题 最近在对接第三方,涉及获取token鉴权。在本地调试能获取到token,但是在Linux环境上调用就报错:java.security.InvalidKeyException: Illegal key size 与三方沟通 ,排除了是传参和网络的原因;搜索资料发现…...

python脚本,实现监控系统的各项资源

今天的文章涉及到docker的操作和一个python脚本,实现监控网络的流量、CPU使用率、内存使用率和磁盘使用情况。一起先看看效果吧: 这是在控制台中出现的数据,可以很简单的看到我们想要的监控指标。如果实现定时任务和数据的存储、数据的展示&a…...

Flink处理函数(2)—— 按键分区处理函数

按键分区处理函数(KeyedProcessFunction):先进行分区,然后定义处理操作 1.定时器(Timer)和定时服务(TimerService) 定时器(timers)是处理函数中进行时间相关…...

服务器数据恢复—服务器进水导致阵列中磁盘同时掉线的数据恢复案例

服务器数据恢复环境: 数台服务器数台存储阵列柜,共上百块硬盘,划分了数十组lun。 服务器故障&检测: 外部因素导致服务器进水,进水服务器中一组阵列内的所有硬盘同时掉线。 北亚数据恢复工程师到达现场后发现机房内…...

npm或者pnpm或者yarn安装依赖报错ENOTFOUND解决办法

如果报错说安装依赖报错,大概率是因为npm源没有设置对,比如我这里安装protobufjs的时候报错:ENOTFOUND npm ERR! code ENOTFOUND npm ERR! syscall getaddrinfo npm ERR! errno ENOTFOUND npm ERR! network request to https://registry.cnpm…...

学会使用ubuntu——ubuntu22.04使用Google、git的魔法操作

ubuntu22.04使用Google、git的魔法操作 转战知乎写作 https://zhuanlan.zhihu.com/p/679332988...

【机组】计算机组成原理实验指导书.

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《机组 | 模块单元实验》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 第一章 性能特点 1.1 系…...

解决Sublime Text V3.2.2中文乱码问题

目录 中文乱码出现情形通过安装插件来解决乱码问题 中文乱码出现情形 打开一个中文txt文件,显示乱码,在File->Reopen With Encoding里面找不到支持简体中文正常显示的编码选项。 通过安装插件来解决乱码问题 安装Package Control插件 打开Tool->…...

Oracle 12CR2 RAC部署翻车,bug避坑经历

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…...

情绪共享机器:潜力与挑战

在设想的未来科技世界中,有一种神奇的机器,它能够让我们戴上后即刻感知并体验他人当下的情绪。这种情绪共享机器无疑将深刻地改变我们对人际关系、社会交互乃至人性本质的理解。然而,这一科技创新所带来的影响并非全然积极,也伴随…...

docker 安装python3.8环境镜像并导入局域网

一、安装docker yum -y install docker docker version #显示 Docker 版本信息 可以看到已经下载下来了 拉取镜像python3镜像 二、安装docker 中python3环境 运行本地镜像,并进入镜像环境 docker run -itd python-38 /bin/bash docker run -itd pyth…...

修复“电脑引用的账户当前已锁定”问题的几个方法,看下有没有能帮助到你的

面对“电脑引用的账户当前已锁定,且可能无法登录”可能会让你感到焦虑。这是重复输入错误密码后出现的登录错误。当帐户锁定阈值策略配置为限制未经授权的访问时,就会发生这种情况。 但是,如果你在等待半小时后输入正确的密码,你可以重新访问你的帐户。同样,如果你有一个…...

vp9协议笔记

vp9协议笔记📒 本文主要是对vp9协议的梳理,协议的细节参考官方文档:VP9协议链接(需要加速器) vp9协议笔记 vp9协议笔记📒1. 视频编码概述2. 超级帧superframe(sz):2. fr…...

信息检索与数据挖掘 | (九)Link Analysis(链接分析)

文章目录 📚链接分析📚随机矩阵📚random walk📚Google formulation 📚链接分析 将链接看做投票,从重要的网站来的链接其权重更高,所以是递归定义的。 如果网页j权重为rj,有n个出边&…...

yarn的安装及使用教程

Yarn 是一个快速、可靠、安全的包管理工具,用于管理 JavaScript 项目的依赖项。下面是关于 Yarn 的安装和基本使用的详细教程: 安装 Yarn 访问 Yarn 官网 并按照指示下载适合你操作系统的安装程序。安装程序会自动安装 Yarn,并将其添加到系…...

最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...