kubernetes-有状态和无状态服务

kubernetes-有状态和无状态服务

  • kubernetes-有状态和无状态服务
    • 1.有状态的应用
      • 1.1、理解
      • 1.2、特点
    • 2、无状态应用
      • 2.1、理解
      • 2.2、特点
    • 3、玩一下
      • 3.1、启动一个nginx无状态的业务
      • 3.2、启动一个nginx有状态的业务
    • 4、无头服务
      • 4.1、无头服务的特点:
      • 4.2、无头服务的用途:
      • 4.3、无头服务的YAML示例:
      • 4.4、只能通过域名去访问

kubernetes-有状态和无状态服务

1.有状态的应用

1.1、理解

有状态服务 可以说是 需要数据存储功能的服务、或者指多线程类型的服务,队列等。(mysql数据库、kafka、zookeeper等)

有状态的应用—>数据需要保存的应用—》数据库应用:MySQL,redis等

statefulSet 有状态控制器

1.2、特点

  • 状态依赖:应用需要保持状态信息,如用户会话、文件系统状态等。
  • 持久化存储:通常需要持久化存储来保存状态信息,如使用Persistent Volumes。
  • 顺序和唯一性:某些操作可能需要按照特定的顺序执行,或者需要保证操作的唯一性。
  • 扩容,缩减的时候是有顺序进行的,不是随机的

2、无状态应用

2.1、理解

数据都是一样的,无论怎么访问,没有什么不同

无状态的应用不需要保存数据–》web服务器

无状态应用是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。

2.2、特点

  • 独立性:每个请求都是独立的,不需要保存任何会话信息。
  • 可替换性:任何Pod实例都可以被另一个完全相同的实例替换,而不影响应用的整体功能。
  • 水平扩展:可以轻松地通过增加Pods的数量来扩展应用。
  • **顺序:**随机
  • 不需要保存数据

3、玩一下

3.1、启动一个nginx无状态的业务

[root@master stateful]# vim pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-state
  labels:
    app: nginx
spec:
  replicas: 6
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
[root@master stateful]# 

启动pod

[root@master stateful]# kubectl apply -f pod.yaml 
deployment.apps/nginx-deployment-state created
[root@master stateful]# kubectl get -f pod.yaml 
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment-state   6/6     6            6           15s
[root@master stateful]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
nginx-deployment-state-75b69bd684-cqh5b   1/1     Running   0          22s
nginx-deployment-state-75b69bd684-hw78n   1/1     Running   0          22s
nginx-deployment-state-75b69bd684-l2r5f   1/1     Running   0          22s
nginx-deployment-state-75b69bd684-ljbrs   1/1     Running   0          22s
nginx-deployment-state-75b69bd684-tk5zt   1/1     Running   0          22s
nginx-deployment-state-75b69bd684-v47cf   1/1     Running   0          22s
[root@master stateful]# 

cqh5b,hw78n这些编号都是随机产生的,没有按照顺序产生

nginx-deployment-state-75b69bd684-cqh5b

  • 部署控制器名字+副本控制器名字+pod编号

3.2、启动一个nginx有状态的业务

[root@master stateful]# vim pod-stateful.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-stateful
  labels:
    app: nginx-stateful
spec:
  type: NodePort
  ports:
  - port: 80
    name: web
    targetPort: 80
    nodePort: 30011
  selector:
    app: nginx-stateful
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web  #pod的名字从web-0开始
spec:
  selector:
    matchLabels:
      app: nginx-stateful # 必须匹配 .spec.template.metadata.labels
  serviceName: "nginx-stateful"
  replicas: 6 # 默认值是 1
  template:
    metadata:
      labels:
        app: nginx-stateful # 必须匹配 .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx-stateful
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web

这个pod-stateful.yaml文件包含了两个Kubernetes资源的定义:一个Service和一个StatefulSet。下面是对这两个资源的解释:

Service: nginx-stateful

  • apiVersion: v1: 指定了Kubernetes的API版本为v1。
  • kind: Service: 指定了资源类型为Service。
  • metadata: 包含了Service的元数据。
    • name: nginx-stateful: Service的名称。
    • labels: 定义了标签,这里用于标识这个Service属于nginx-stateful应用。
  • spec: 定义了Service的具体规格。
    • type: NodePort: Service类型为NodePort,这意味着Service将在集群的所有节点上公开端口,并且可以通过nodePort指定的端口从外部访问。
    • ports: 定义了端口映射。
      • port: 80: Service在所有节点上的端口号。
      • targetPort: 80: Pod内部的目标端口号,Service将流量转发到这个端口。
      • name: web: 端口的名称,用于内部引用。
    • selector: 定义了如何选择Pods,这里选择标签为app: nginx-stateful的Pods。

StatefulSet: web

  • apiVersion: apps/v1: 指定了Kubernetes的API版本为apps/v1。
  • kind: StatefulSet: 指定了资源类型为StatefulSet。
  • metadata: 包含了StatefulSet的元数据。
    • name: web: StatefulSet的名称。
  • spec: 定义了StatefulSet的具体规格。
    • selector: 定义了如何通过标签选择Pods,这里选择标签为app: nginx-stateful的Pods。
    • serviceName: 指定了Service的名称,Pods将通过这个Service名进行DNS解析。
    • replicas: 指定了StatefulSet中Pod副本的数量,这里设置为6。
    • template: 定义了Pod模板。
      • metadata: 定义了Pod的元数据。
        • labels: 定义了Pod的标签,这里用于与StatefulSet的selector匹配。
      • spec: 定义了Pod的规格。
        • terminationGracePeriodSeconds: 指定了Pod在停止前等待的时间,用于处理关闭钩子或者优雅地关闭应用。
        • containers: 定义了容器的列表。
          • name: nginx-stateful: 容器的名称。
          • image: nginx: 指定了容器使用的镜像。
          • imagePullPolicy: IfNotPresent: 指定了拉取镜像的策略,如果本地没有镜像则拉取。
          • ports: 定义了容器的端口。
            • containerPort: 80: 容器内部监听的端口号。
              • name: web: 端口的名称,用于内部引用。

总结来说,这个YAML文件定义了一个NodePort类型的Service,它将外部的HTTP请求转发到后端的Nginx Pod上。同时,它还定义了一个StatefulSet,用于管理6个Nginx Pod的生命周期和部署。每个Pod都将被分配一个唯一的名称,并且它们都将监听端口80。

启动

[root@master stateful]# kubectl apply -f pod-stateful.yaml 
service/nginx-stateful created
statefulset.apps/web created
[root@master stateful]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
nginx-deployment-state-75b69bd684-cqh5b   1/1     Running   0          13m
nginx-deployment-state-75b69bd684-hw78n   1/1     Running   0          13m
nginx-deployment-state-75b69bd684-l2r5f   1/1     Running   0          13m
nginx-deployment-state-75b69bd684-ljbrs   1/1     Running   0          13m
nginx-deployment-state-75b69bd684-tk5zt   1/1     Running   0          13m
nginx-deployment-state-75b69bd684-v47cf   1/1     Running   0          13m
web-0                                     1/1     Running   0          6s
web-1                                     1/1     Running   0          4s
web-2                                     1/1     Running   0          3s
web-3                                     1/1     Running   0          2s
web-4                                     0/1     Pending   0          1s
[root@master stateful]# 

能看到pod的名字是有顺序的

image-20240317165010687

4、无头服务

Headless Service(无头服务) 发布pod的时候,不给pod分配ip地址

  • 无头服务的特点是服务发布的时候,负载均衡器没有ip地址
  • 只能通过域名去访问后端的发布的pod
  • 通过k8s内部的coredns进行域名解析–》也可以找到pod
  • 就是相当于中间的负载均衡器没有ip,就相当于跳过负载均衡器 直接访问pod

无头服务(Headless Service)是Kubernetes中的一种特殊服务类型,它不提供负载均衡和单一的访问入口,而是直接将流量路由到后端的Pods。这与普通的Service不同,普通Service会提供一个稳定的虚拟IP(ClusterIP),所有进入该IP的流量都会被均匀地分发到后端的Pods上。

4.1、无头服务的特点:

  1. 没有ClusterIP:无头服务不会分配ClusterIP。这意味着你不能通过Service的IP地址来访问后端的Pods,而是直接通过Pods的IP地址进行通信。

  2. 直接访问Pods:由于没有ClusterIP,客户端可以直接通过Pods的IP地址访问服务。这在某些需要直接与Pod通信的场景中非常有用,例如数据库集群的节点发现。

  3. DNS解析:在无头服务中,服务名可以通过DNS解析为后端Pods的IP地址列表。当执行DNS查询时,你会得到所有匹配标签选择器的Pods的IP地址。

  4. 轮询:虽然无头服务不提供内置的负载均衡,但是客户端可以实现自己的轮询逻辑,或者使用客户端库来实现负载均衡。

4.2、无头服务的用途:

  • 服务发现:在某些分布式系统中,例如数据库集群或消息队列,节点需要知道彼此的位置。无头服务可以通过DNS服务发现来帮助这些节点相互发现。

  • 客户端负载均衡:在需要客户端进行负载均衡的场景中,无头服务提供了一种方式,让客户端直接与后端Pods通信,而不是通过Service的ClusterIP。

  • 有状态应用:对于有状态的应用(如数据库),每个实例可能需要有独立的、稳定的网络标识。无头服务允许直接通过Pod的IP地址访问,这对于保持会话状态和持久化连接非常有用。

4.3、无头服务的YAML示例:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  clusterIP: None  # 设置为None来创建无头服务
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

在这个示例中,clusterIP: None是创建无头服务的关键。这样定义后,Kubernetes不会为这个Service分配ClusterIP,而是允许直接通过Pod的IP地址访问服务。

4.4、只能通过域名去访问

域名的组成: pod name + service name + namespace name +.svc.cluster.local
pod名字 服务的名字 命名空间的名字
web-2.nginx.default.svc.cluster.local

[root@master stateful]# kubectl exec -it web-0 -- bash
root@web-0:/# curl  web-0.nginx-stateful.default.svc.cluster.local

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>


<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>


<p><em>Thank you for using nginx.</em></p>

</body>
</html>
root@web-0:/# 

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

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

相关文章

力扣每日一题 最小高度树 BFS 双向

Problem: 310. 最小高度树 思路 &#x1f468;‍&#x1f3eb; 参考地址 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue;publ…

企业数据流动安全管理软件(深度解析文章)

企业数据重要性不言而喻&#xff0c;而同时数据的流动和共享也带来了安全风险&#xff0c;如何确保企业数据在流动过程中的安全性&#xff0c;也成为了企业需要面临的重要问题。 企业数据流动安全管理软件的主要功能是监控和管理企业数据的流动过程。 它能够对企业内部的数据…

Ps:直接选择工具

直接选择工具 Direct Selection Tool可用于选择和调整路径或形状中的锚点和路径线段。 快捷键&#xff1a;A 直接选择工具的指针形状为白箭头。当需要调整锚点、方向调杆、路径线段以及对选中的多个锚点子路径进行移动、变换&#xff08;缩放、旋转、扭曲、斜切、变形等&#x…

蓝桥杯刷题(十)

1.翻转 代码 输入数据&#xff0c;每组数据进行比较&#xff0c;j的范围掐头去尾&#xff0c;若a[j]b[j]&#xff0c;继续&#xff0c;若出现010,101子串则改成000,111&#xff0c;遍历完后比较a是否等于b&#xff0c;相同则输出次数&#xff0c;不同则输出-1。 for _ in ran…

智慧城市新篇章:数字孪生的力量与未来

随着信息技术的迅猛发展和数字化浪潮的推进&#xff0c;智慧城市作为现代城市发展的新模式&#xff0c;正在逐步改变我们的生活方式和社会结构。在智慧城市的构建中&#xff0c;数字孪生技术以其独特的优势&#xff0c;为城市的规划、管理、服务等方面带来了革命性的变革。本文…

目标检测---IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、WIOU)

常见IoU解读与代码实现 一、✒️IoU&#xff08;Intersection over Union&#xff09;1.1 &#x1f525;IoU原理☀️ 优点⚡️缺点 1.2 &#x1f525;IoU计算1.3 &#x1f4cc;IoU代码实现 二、✒️GIoU&#xff08;Generalized IoU&#xff09;2.1 GIoU原理☀️优点⚡️缺点 2…

【Spark编程基础】RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作&#xff1b; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

百科源码生活资讯百科门户类网站百科知识,生活常识

百科源码生活资讯百科门户类网站百科知识,生活常识 百科源码安装环境 支持php5.6&#xff0c;数据库mysql即可&#xff0c;需要有子目录权限&#xff0c;没有权限的话无法安装 百科源码可以创建百科内容&#xff0c;创建活动内容。 包含用户注册&#xff0c;词条创建&#xff…

VScode(8)之阅读大型CC++工程

VScode(8)之阅读大型CC工程(Linux内核)代码 Author&#xff1a;Once Day Date&#xff1a;2023年4月25日/2024年3月17日 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: VScode开发_Once-Day的博客-CSDN博客 参考文档: 1. 历史包袱 由于上世纪70-80年代的…

综合知识篇08-数据库系统考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

Ubuntu 16.04 设置 root 密码

Ubuntu 16.04 设置 root 密码 1. sudo2. parserReferences 1. sudo sudo (/ˈsuːduː/ or /ˈsuːdoʊ/) is a program for Unix-like computer operating systems that allows users to run programs with the security privileges of another user, by default the superus…

【系统性】 循序渐进学C++

循序渐进学C 第一阶段&#xff1a;基础 一、环境配置 1.1.第一个程序&#xff08;基本格式&#xff09; ​ #include <iosteam> using namespace std;int main(){cout<<"hello world"<<endl;system("pause"); }​ 模板 #include &…

论文阅读——RSGPT

RSGPT: A Remote Sensing Vision Language Model and Benchmark 贡献&#xff1a;构建了一个高质量的遥感图像描述数据集&#xff08;RSICap&#xff09;和一个名为RSIEval的基准评估数据集&#xff0c;并在新创建的RSICap数据集上开发了基于微调InstructBLIP的遥感生成预训练…

ElasticSearch架构设计

一、基础概念 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单&#xff0c;它不仅包括了全文搜索功能&#xff0c;还可以进行以下工作: 一个分布式的实时文档…

AI基础知识(2)--决策树,神经网络

1.什么是决策树&#xff1f; 决策树是一类常见的机器学习方法&#xff0c;决策树是基于树的结构来进行决策。决策过程中提出的每一个问题都是对于属性的“测试”&#xff0c;决策的最终结论对应了我们希望的判定结果。一个决策树包含一个根节点&#xff0c;若干个内部节点和若…

MyBatisPlus——Wrapper

Wrapper体系 QueryWrapper 使用字符串表示列名&#xff0c;通过字符串拼接的方式构建查询条件 再将 wrapper 作为条件参数&#xff0c;写入BaseMapper提供的查找方法中&#xff08;或其他数据库方法&#xff09; QueryWrapper<QueryEntity> wrapper new QueryWrapper&l…

Python笔记|字符串合并、切片、索引

一、合并 字符串可以用 合并&#xff08;粘到一起&#xff09;&#xff0c;也可以用 * 重复&#xff1a; >>> 3 * un ium unununium 相邻的两个或多个字符串字面值&#xff08;引号标注的字符&#xff09;会自动合并&#xff1a; >>> Py thon Python …

【鸿蒙HarmonyOS开发笔记】自定义组件详解

自定义组件 除去系统预置的组件外&#xff0c;ArkTS 还支持自定义组件。使用自定义组件&#xff0c;可使代码的结构更加清晰&#xff0c;并且能提高代码的复用性。 我们开发的每个页面其实都可以视为自定义组件内置组件的结合 语法说明 自定义组件的语法如下图所示 各部分…

STM32的简单介绍

STM32是一种基于ARM Cortex-M内核的32位微控制器&#xff0c;由意法半导体公司开发和生产。STM32具有丰富的外设和功能&#xff0c;适用于各种应用场合&#xff0c;如工业控制、消费电子、物联网、人机交互等。STM32的优势包括低功耗、高性能、高可靠性、易于开发等。STM32的系…

R语言深度学习-6-模型优化与调试

本教程参考《RDeepLearningEssential》 这是本专栏的最后一篇文章&#xff0c;一路走来&#xff0c;大家应该都可以独立的建立一个自己的神经网络进行特征学习和预测了吧&#xff01; 6.1 缺失值处理 在我们使用大量数据进行建模的时候&#xff0c;缺失值对模型表现的影响非常…