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-statelabels:app: nginx
spec:replicas: 6selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentports:- 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-statefullabels:app: nginx-stateful
spec:type: NodePortports:- port: 80name: webtargetPort: 80nodePort: 30011selector:app: nginx-stateful
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web  #pod的名字从web-0开始
spec:selector:matchLabels:app: nginx-stateful # 必须匹配 .spec.template.metadata.labelsserviceName: "nginx-stateful"replicas: 6 # 默认值是 1template:metadata:labels:app: nginx-stateful # 必须匹配 .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10containers:- name: nginx-statefulimage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80name: 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-appports:- protocol: TCPport: 80targetPort: 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:/# 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

verilog 从入门到看得懂---verilog 的基本语法数据和运算

笔者之前主要是使用c语言和matab 进行编程&#xff0c;从2024年年初开始接触verilog&#xff0c;通过了一周的学习&#xff0c;基本上对verilog 的语法有了基本认知。总统来说&#xff0c;verilog 的语法还是很简单的&#xff0c;主要难点是verilog是并行运行&#xff0c;并且强…

2024/3/15 记录简版抖音部署遇到的问题

1、Centos连不上网 参考这一篇&#xff1a;虚拟机 CentOS 有线连接图标直接消失&#xff0c;网络连接不上&#xff0c;网络连接失败的解决方案&#xff08;亲测有效&#xff09;_centos网络图标不见了-CSDN博客 2、SQLyog连接不到docker中的mysql 原因是对密码有加密过程 &a…

面向对象编程第三式: 多态 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

浅谈C/C++的常量const、指针和引用问题

今天我们来探讨C/C中const、指针和引用的相关问题。这些概念是编程中的重要组成部分&#xff0c;它们的正确使用对于代码的可读性和可维护性至关重要。通过深入了解const的不可变性、指针的灵活性以及引用的简洁性&#xff0c;我们能够更好地掌握编程的精髓&#xff0c;并写出更…

顺序表操作

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;既然选择了远方&#xff0c;当不负青春…

Python语法糖

N u m P y NumPy NumPy的 n d i t e r nditer nditer nditer 是 NumPy 提供的一种多维迭代器&#xff0c;用于对多维数组进行迭代操作。它可以替代传统的嵌套循环&#xff0c;在处理多维数组时更加方便和高效。 迭代器可以按照不同的顺序遍历数组的元素&#xff0c;也可以控制…

(含链接)2024年NVIDIA GPU技术大会开发者合集(专为开发者挑选的合集)

2024年NVIDIA GPU技术大会开发者合集 我专门为开发者整理了NVIDIA GPU技术大会上专注技术的内容合集, 希望可以帮助开发者朋友们快速了解NVIDIA的最新技术. 注意:在电脑端打开更友好, 可以直接进入每一项的网页 文章目录 2024年NVIDIA GPU技术大会开发者合集如何登录和预约会…

【论文笔记合集】ARIMA 非平稳过程通过差分转化为平稳过程

本文作者&#xff1a; slience_me 文章目录 ARIMA 非平稳过程通过差分转化为平稳过程文章原文具体解释详解参照 ARIMA 非平稳过程通过差分转化为平稳过程 文章原文 Many time series forecasting methods start from the classic tools [38, 10]. ARIMA [7, 6] tackles the fo…

虚拟内存相关知识汇总(程序重定位)

前置知识&#xff1a; Windows的内存可以被分为两个层面&#xff1a;物理内存和虚拟内存。其中&#xff0c;物理内存非常复杂&#xff0c;需要进入到Windows内核级别ring0才能看到。通常在用户模式下&#xff0c;用调试器看到的内存地址都是虚拟地址。 1.虚拟内存的定义 虚拟…

Java实现知乎热点小时榜爬虫

1.效果演示 1.1 热点问题列表 启动程序后&#xff0c;自动展示热点问题&#xff0c;并等待终端输入 1.2 根据序号选择想看的热点问题 输入问题序号&#xff0c;展示回答内容 1.3 退出 输入q即可退出程序 2.源码 2.1 pom.xml <?xml version"1.0" enco…

腾讯云怎么申请免费服务器?2024免费云主机申请教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

2024年腾讯云免费服务器申请教程,个人和企业均可领取

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

大数据数据分析-scala、IDEA、jdk之间的搭配关系

Scala主要是一门面向对象编程语言和函数式编程语言。 一、大数据框架&#xff08;处理海量/流式数据&#xff09; - ---以HADOOP 2. x为系列的大数据生态系统处理框架 离线数据分析&#xff0c;分析的数据为N1天数据 -----MapReduce 并行计算框架&#xff0c;分而治之…

Java数据结构二叉树练习

1.检查两棵二叉树是否都是相同的练习 我要求时间复杂度为1&#xff0c;所以我们不用前序中序后序是否都一样来进行判断 如何判断二叉树是否都是相同的子问题方式 先判断根节点是否相同 再判断左子树和右子树是否都是相同的 先用代码判断不相同的情况&#xff0c;都相同的化…

多线程JUC 第2季 wait和notify唤醒机制

一 wait和notify的区别与相同 1.1 wait和notify的作用 1) 使用wait()、notify()和notifyAII()时需要先对调用对象加锁。否则直接调用的话会抛出 IllegalMonitorStateExceptiona。 2) 调用wait()方法后&#xff0c;线程状态。由RUNNING变为WAITING&#xff0c;并将当前线程放置…

pyinstaller打包不显示DOS窗口

1 使用pyinstaller 打包 会不显示DOS窗口 打包的时候把-w去掉就行了

微信小程序开发学习笔记——4.1小程序官方api文档showToast提示框

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;https://www.bilibili.com/video/BV19G4y1K74d?p26&vd_source9b149469177ab5fdc47515e14cf3cf74 一、showToast属性 https://developers.weixin.q…

Chapter 16 Techniques of Design-Oriented Analysis: Extra Element Theorems

Chapter 16 Techniques of Design-Oriented Analysis: Extra Element Theorems 这一章介绍Middlebrook’s Extra Element Theorem (EET), 这是一个强力的分析复杂电路传输函数的工具. 16.1 Extra Element Theorem 对于一个已知的传输函数, Extra Element Theorem可以帮助算出…

Java学习笔记(15)

JDK7前时间相关类 Date时间类 Simpledateformat Format 格式化 Parse 解析 默认格式 指定格式 EE&#xff1a;表示周几 Parse&#xff1a;把字符串时间转成date对象 注意&#xff1a;创建对象的格式要和字符串的格式一样 Calendar日历类 不能创建对象 Getinstance 获取当…

Qt for Mac阻止MacOS系统休眠

Qt开发的应用程序如果电脑休眠了会影响软件的使用&#xff0c;因此在软件的使用过程中需要防止电脑休眠&#xff0c;在Win上有专门的API进行处理&#xff0c;在Mac上也必需使用Mac平台自身的API&#xff0c;本篇介绍在Mac平台下使用Qt阻止Mac系统休眠。 要调用Mac系统的API&am…