云原生之容器编排实践-以k8s的Service方式暴露SpringBoot服务

news/2024/5/22 6:41:20/文章来源:https://blog.csdn.net/u013810234/article/details/127189041

背景

上一篇文章云原生之容器编排实践-SpringBoot应用以Deployment方式部署到minikube以及弹性伸缩中,我们通过 Deployment 完成了将 SpringBoot 应用部署到 minikube 并测试了其弹性伸缩的丝滑体验。但是 Deployment 部署后我们还面临以下问题:

  • 访问时需要先进行端口转发
  • 每次只能访问一个Pod,不支持负载均衡将请求路由至不同的Pod
  • Pod重新创建后IP地址与名称均发生变化,显然这在实际生产环境下是无法容忍的

这次我们使用 KubernetesService 来解决上述问题, Service 为我们带来了以下特性:

  • Service通过Label标签选择器关联对应的Pod
  • Service生命周期不跟Pod绑定,不会因为Pod重新创建改变IP
  • 提供了负载均衡功能,自动转发流量到不同Pod
  • 集群内部可通过服务名字访问(ClusterIP)
  • 可对集群外部提供访问端口(NodePort)

今天我们体验下两种类型的 Service :分别为 ClusterIPNodePort

创建服务最简单的 方式是通过 kubectl expose 命令,结合标签选择器来创建服务资源,实现通过单个 IP 和端口来访问所有的 Pod 。与 Deployment 一样,我们同样可以通过 YAML 描述文件调用 Kubernetes API 服务来创建 Service

ClusterIP

ClusterIP 类型的 Service 只能在集群内部可以被访问。可以通过端口转发的方式可以在外面访问到集群里的服务。

2022-10-06-ClusterIP.jpg

YAML

重点关注类型 kind: Service ,以及选择器 selector.app: cloud-native

[root@k8s0 service]# vi cloud-native-service.yaml 
apiVersion: v1
kind: Service
metadata:name: cloud-native-svc
spec:# 用来查找关联的Pod,所有标签都匹配才行selector:app: cloud-native# 默认 ClusterIP 集群内可访问type: ClusterIPports:- port: 8080targetPort: 8080# 应用配置
[root@k8s0 service]# kubectl apply -f cloud-native-service.yaml 
service/cloud-native-svc created

获取服务

service 可以简写为 svc

Note: 关于简写,在 Kubernetes 中通常会用到以下简写。

namespaces ns
nodes no
pods po
services svc
deployments deploy
replicationcontrollers rc
replicasets rs
configmaps cm
endpoints ep
events ev
cronjobs cj
persistentvolumeclaims pvc
persistentvolumes pv
[root@k8s0 service]# kubectl get service
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
cloud-native-svc   ClusterIP   10.105.254.130   <none>        8080/TCP         9s
hello-minikube     NodePort    10.107.201.188   <none>        8080:31061/TCP   35d
kubernetes         ClusterIP   10.96.0.1        <none>        443/TCP          35d
[root@k8s0 service]# kubectl get svc
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
cloud-native-svc   ClusterIP   10.105.254.130   <none>        8080/TCP         43s
hello-minikube     NodePort    10.107.201.188   <none>        8080:31061/TCP   35d
kubernetes         ClusterIP   10.96.0.1        <none>        443/TCP          35d

Service 服务的默认类型是 ClusterIP ,只能在集群内部访问。

可以进入 Pod 内访问或者通过端口转发,并且可以通过服务名称或者IP来访问。我的镜像内部没有 curl 命令(那么问题来了,镜像里面没有curl命令,怎么破?),就不测试了。

转发端口

[root@k8s0 service]# kubectl port-forward service/cloud-native-svc 8000:8080
Forwarding from 127.0.0.1:8000 -> 8080
Forwarding from [::1]:8000 -> 8080
Handling connection for 8000

测试接口

完成端口测试后,新开一个 Tab ,使用 Curl 进行接口测试。

[root@k8s0 ~]# curl http://localhost:8000/hi
Hi 127.0.0.1, I am 172.17.0.6

NodePort

使用 NodePort 类型的 Service ,可以做到直接将集群服务暴露出来。

2022-10-06-ServiceNodePort.jpg

YAML

重点关注类型 spec.type: NodePort ,以及节点端口 spec.ports.nodePort: 30000

[root@k8s0 service]# vi cloud-native-service.yaml 
apiVersion: v1
kind: Service
metadata:name: cloud-native-svc
spec:# 用来查找关联的Pod,所有标签都匹配才行selector:app: cloud-native# NodePort节点可访问type: NodePortports: - port: 8080 # 本Service端口targetPort: 8080 # 容器端口nodePort: 30000   # 节点端口,范围固定30000 ~ 32767# 应用配置
[root@k8s0 service]# kubectl apply -f cloud-native-service-nodeport.yaml 
service/cloud-native-svc configured

获取服务

cloud-native-svcNodePort 类型。当使用 kubectl describe service 命令时,我们可以观察到结果中的 Endpoints 有两个:172.17.0.5:8080, 172.17.0.6:8080,这便是我们的两个 Deployment 副本。

通过 kubectl get pods -o wide 我们可以再次验证:两个 Endpoints 正是我们的两个 Pod

[root@k8s0 service]# kubectl get svc
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
cloud-native-svc   NodePort    10.105.254.130   <none>        8080:30000/TCP   24m
hello-minikube     NodePort    10.107.201.188   <none>        8080:31061/TCP   35d
kubernetes         ClusterIP   10.96.0.1        <none>        443/TCP          35d# Endpoints有两个
[root@k8s0 service]# kubectl describe service cloud-native-svc
Name:                     cloud-native-svc
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=cloud-native
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.105.254.130
IPs:                      10.105.254.130
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30000/TCP
Endpoints:                172.17.0.5:8080,172.17.0.6:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none># 两个Endpoints正是我们的两个Pod
[root@k8s0 service]# kubectl get pods -o wide
NAME                              READY   STATUS    RESTARTS       AGE     IP           NODE       NOMINATED NODE   READINESS GATES
cloud-native                      1/1     Running   3 (117m ago)   4d12h   172.17.0.4   minikube   <none>           <none>
cloud-native-7bc75f4c94-47zg7     1/1     Running   2 (117m ago)   2d4h    172.17.0.6   minikube   <none>           <none>
cloud-native-7bc75f4c94-c2php     1/1     Running   2 (117m ago)   2d4h    172.17.0.5   minikube   <none>           <none>
hello-minikube-58647b77b8-srpbq   1/1     Running   9 (117m ago)   35d     172.17.0.8   minikube   <none>           <none>

同样,可以桶过 Dashboard 以可视化的方式观测我们运行的 KubernetesService 信息。

2022-10-06-ServiceDetail.jpg

进入节点

这里所谓的 节点 ,是指 Kubernetes 节点;显然,这时候我们只有一个 minikube 节点。

[root@k8s0 service]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED       STATUS       PORTS  NAMES
421832f7e7c9   kicbase/stable:v0.0.32   "/usr/local/bin/entr…"   5 weeks ago   Up 2 hours   127.0.0.1:49157->22/tcp, 127.0.0.1:49156->2376/tcp, 127.0.0.1:49155->5000/tcp, 127.0.0.1:49154->8443/tcp, 127.0.0.1:49153->32443/tcp   minikube# 进入节点内部
[root@k8s0 service]# docker exec -it 421832f7e7c9 /bin/bash

测试接口

Kubernetes 节点( minikube )内部测试接口,哇哦,我们体验到了 Service 提供的负载均衡效果。

root@minikube:/# curl http://localhost:30000/hi
Hi 172.17.0.1, I am 172.17.0.5root@minikube:/# curl http://localhost:30000/hi
Hi 172.17.0.1, I am 172.17.0.6root@minikube:/# curl http://localhost:30000/hi
Hi 172.17.0.1, I am 172.17.0.5root@minikube:/# curl http://localhost:30000/hi
Hi 172.17.0.1, I am 172.17.0.6root@minikube:/# curl http://localhost:30000/hi
Hi 172.17.0.1, I am 172.17.0.5root@minikube:/# curl http://localhost:30000/hi
Hi 172.17.0.1, I am 172.17.0.6root@minikube:/# curl http://localhost:30000/hi
Hi 172.17.0.1, I am 172.17.0.5root@minikube:/# 

小总结

Kubemetes 服务是一种为一组功能相同的 Pod 提供单一不变的接入点的资源。当服务存在时,它的IP地址和端口不会改变。客户端通过IP地址和端口号建立连接,这些连接会被路由到提供该服务的任意一个 Pod 上。通过这种方式,客户端不需要知道每个单独的提供服务的 Pod 的地址,这样这些 Pod 就可以在集群中随时被创建或移除。


If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!

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

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

相关文章

Day761.Redis集群方案:Codis -Redis 核心技术与实战

Redis集群方案&#xff1a;Codis Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Redis集群方案&#xff1a;Codis Redis 的切片集群使用多个实例保存数据&#xff0c;能够很好地应对大数据量的场景。哨兵集群&#xff0c; Redis 官方提供的切片集群方案 Redis Clus…

SPI总线通信——基于STM32MP157A

SPI总线概念 SPI总线是Motorola首先提出的全双工三线/四线同步串行总线&#xff0c;采用主从模式&#xff08;Master Slave&#xff09;架构&#xff1b;支持多从机&#xff08;slave&#xff09;模式应用&#xff0c;一般仅支持单主机&#xff0c;多从机。 时钟由主机控制&…

java培训技术处理模型数据之 ModelAndView

处理模型数据之 ModelAndView 1 ModelAndView介绍 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息&#xff0c;也包含模型 数据信息。 2&#xff09;添加模型数据: MoelAndView addObject(String attributeName, Object attributeValue) ModelAndView…

C#-设计模式学习笔记

目录前言&#xff1a;最近得到师傅指点&#xff0c;建议我多学习下设计模式&#xff0c;简单记录下学习过程中的一些知识点1.设计模式&#xff08;创建型&#xff09;1.单例模式&#xff1a;1. 单例模式的主要作用2.单例模式能解决的问题3.单例模式的使用场景4.怎么实现单例模式…

Charles安装和抓包原理

进行APP服务器开发&#xff0c;接口测试、bug定位&#xff0c;抓取移动端请求数据包在所难免&#xff0c;公司使用的Charles&#xff0c;后面有机会使用了其它软件再做对比。Charles并不是安装即可用&#xff0c;涉及一些参数配置&#xff0c;特此记录分享。 1 安装、破解Char…

C51之温湿度检测系统(自动开关风扇)

目录 DHT11 温湿度传感器 产品概述 特点 检测模块是否存在 温湿度数据管理系统 uart.c文件 uart.h文件 lcd1602.c文件 lcd1602.H文件 dht11.c文件 dht11.h文件 delay.c文件 delay.h文件 config.h文件 main.c文件 DHT11 温湿度传感器 产品概述 DHT11数字温湿度传感…

2022/10/6——基于stm32mp157a的SPI实验

SPI总线是Motorola首先提出的全双工三线/四线同步串行总线 采用主从模式架构&#xff0c;支持多从机模式应用&#xff0c;但一般仅支持单主机&#xff0c;多从机 时钟由主机控制&#xff0c;在时钟移位脉 冲下&#xff0c;数据按位传输&#xff0c;高位在前&#xff0c;低位在…

网课查题系统-题库量全网最多

网课查题系统-题库量全网最多 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#x…

React源码分析4-深度理解diff算法

上一章中 react 的 render 阶段&#xff0c;其中 begin 时会调用 reconcileChildren 函数&#xff0c; reconcileChildren 中做的事情就是 react 知名的 diff 过程&#xff0c;本章会对 diff 算法进行讲解。 diff 算法介绍 react 的每次更新&#xff0c;都会将新的 ReactElem…

Learning With Error(LWE)问题学习

概念 又称误差还原&#xff0c;容错学习问题&#xff0c;即已知一个矩阵AAA以及一个向量&#xff0c;求解 b^Axe\hat{b}A xe b^Axe 这里eee是一个固定数值范围内随机采集的一个随机噪音向量&#xff0c;所以这个问题就转化为通过AAA和b^\hat{b}b^来还原最初的未知向量xxx 可以…

android studio2021.3.1 最新xposed模块编写指南

前言 最新的xposed框架已经从xposed到Edxposed再到Lsposed&#xff0c;虽然xposed的api依然是通用的82版本&#xff0c;但现在网上大多数的在android studio上配置xposed的教程已经有点落后了&#xff0c;因此写下这篇来记录自己安装的流程。lsposed如何安装可以看我之前的小米…

CPU 和 CPU Core 有啥区别?多核 CPU?多个 CPU?单核 CPU 为何也支持多线程呢?

由于现在大多计算机都是多核CPU&#xff0c;多线程往往会比单线程更快&#xff0c;更能够提高并发&#xff0c;但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、上下文非常频繁&#xff0c;你的程序反而不能支持更高的TPS。 CPU 组成 CPU 全…

JavaSE --- 学Java你应该知道的历史

目录 一. Java的历史 1. Java的发明人詹姆斯高斯林 2. Java的logo 3. java的发展 二. Java 语言的特性 &#x1f416;&#x1f416;&#x1f416;&#x1f416;如果喜欢&#xff01;&#xff01;&#x1f402;&#x1f402;&#x1f402;&#x1f402; &#x1f416;&#x1f4…

创建PyQt项目需要配置三个的External Tools

1. Qt Designer&#xff1a;Qt设计器 Qt Designer D:\PyQtLearning\venv\Lib\site-packages\QtDesigner\designer.exe $ProjectFileDir$ 2. PyUIC&#xff1a;将.ui文件转换为.py文件 PyUIC D:\PyQtLearning\venv\Scripts\pyuic5.exe -o $FileNameWithoutExtension$.py $Fi…

Apache HBase API及备份与还原

一、Apache HBase API Apache HBase也适用于多个外部API。有关更多信息&#xff0c;请参阅Apache HBase外部API&#xff08;将在下一节的内容中介绍&#xff09;。 有关使用本机HBase API的信息&#xff0c;请参阅User API Reference和HBase API章节。 示例&#xff1a; 使…

JVM-2.垃圾回收

目录 一、如何判断对象可以回收 1.1 引用计数法 1.2 可达性分析算法 二、五种引用 2.1 强引用 2.2 软引用&#xff08;SoftReference&#xff09; 2.3 弱引用&#xff08;WeakReference&#xff09; 2.4 虚引用&#xff08;PhantomReference&#xff09; 2.5 终结器引…

07 hook学习01

hook学习01Hooks理解useStateuseEffect自定义hook函数Hooks理解 react组件分为类组件和函数组件 函数组件是一个更加匹配react的设计理念UI f(data)&#xff0c;利于逻辑拆分与重用的组件表达形式&#xff0c;而之前的函数组件是不可以有自己的状态的&#xff0c;为了能让函…

第二章:微服务架构构建

第二章&#xff1a;微服务架构构建 2.1&#xff1a;IDEA新建project工作空间 父工程步骤 New Project 聚合总父工程名字 Maven版本选择 字符编码 注解生效激活 Java编译版本选择8 父工程pom文件 <?xml version"1.0" encoding"UTF-8"?&g…

谷粒商城 nacos

下载nacos&#xff1a;https://github.com/alibaba/nacos/releases启动 startup.cmd -m standalone依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></depende…

(附源码)计算机毕业设计ssm大学生健康系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…