云原生工程师-8.statefulset和daemonset

2023-05-16

七.Statefulset-有状态服务

个人博客

7.1-Statefulset相关概念

7.1.1-什么是Statefulset

StatefulSet 是有状态的集合,管理有状态的服务,它所管理的 Pod 的名称不能随意变化。数据 持久化的目录也是不一样,每一个 Pod 都有自己独有的数据持久化存储目录。比如 MySQL 主 从、redis 集群等。

RC、Deployment、DaemonSet 都是管理无状态的服务,它们所管理的 Pod 的 IP、名字,启 停顺序等都是随机的。个体对整体无影响,所有 pod 都是共用一个数据卷的,部署的 tomcat 就是无状态的服务,tomcat 被删除,在启动一个新的 tomcat,加入到集群即可,跟 tomcat 的名 字无关。

sts和deploy的区别:解析内部域名的时候,sts解析service的dns返回的是pod对应的,deploy则是service的

StatefulSet 由以下几个部分组成:

一:

Headless Service:用来定义 pod 网路标识,生成可解析的 DNS 记录

  1. Headless service 不分配 clusterIP,headless service 可以通过解析 service 的 DNS,返回所 有 Pod 的 dns 和 ip 地址 (statefulSet 部署的 Pod 才有 DNS),普通的 service,只能通过解析 service 的 DNS 返回 service 的 ClusterIP。

  2. 在使用 Deployment 时,创建的 Pod 名称是没有顺序的,是随机字符串,在用 statefulset 管理 pod 时要求 pod 名称必须是有序的 ,每一个 pod 不能被随意取代,pod 重建后 pod 名称还是 一样的。因为 pod IP 是变化的,所以要用 Pod 名称来识别。pod 名称是 pod 唯一性的标识符, 必须持久稳定有效。这时候要用到无头服务,它可以给每个 Pod 一个唯一的名称。

  3. 域名:.$.svc.cluster.local

  4. StatefulSet 会为关联的 Pod 保持一个不变的 Pod Name:

    statefulset 中 Pod 的名字格式为 ( S t a t e f u l S e t n a m e ) − (StatefulSet name)- (StatefulSetname)(pod 序号)

    StatefulSet 会为关联的 Pod 分配一个 dnsName:

    < P o d N a m e > . <Pod Name>. <PodName>..$.svc.cluster.local

二:

volumeClaimTemplates:存储卷申请模板,创建 pvc,指定 pvc 名称大小,自动创建 pvc,且 pvc 由存储类供应。

对于有状态应用都会用到持久化存储,比如 mysql 主从,由于主从数据库的数据是不能存放在一 个目录下的,每个 mysql 节点都需要有自己独立的存储空间。而在 deployment 中创建的存储卷 是一个共享的存储卷,多个 pod 使用同一个存储卷,它们数据是同步的,而 statefulset 定义中 的每一个 pod 都不能使用同一个存储卷,这就需要使用 volumeClainTemplate,当在使用 statefulset 创建 pod 时,volumeClainTemplate 会自动生成一个 PVC,从而请求绑定一个 PV,每一个 pod 都有自己专用的存储卷。Pod、PVC 和 PV 对应的关系图如下:

在这里插入图片描述

三:

StatefulSet:管理 pod 的

7.1.2-Statefulset资源清单

apiVersion: apps/v1
kind: StatefulSet
metada:
  name:
  labels:
    key: value
spec:
  replicas: #副本数
  revisionHistoryLimit: #保留的历史版本,默认是 10 
  selector <Object> -required- #标签选择器,选择它所关联的 pod
  serviceName <string> -required- #headless service 的名字
  updateStrategy <Object> #更新策略
  volumeClaimTemplates<[]Object> #存储卷申请模板
  template <Object> -required- #生成 pod 的模板  

7.2-Statefulset-应用案例

7.2.1-部署 web 站点

apiVersion: v1
kind: Service
metadata:
  name: nginx-1
  labels:
    app: nginx-1
spec:
  ports:
  - name: web
    port: 80
  clusterIP: None
  selector:
    app: nginx-1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-web-1
spec:
  selector:
    matchLabels:
      app: nginx-1
  serviceName: "nginx"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx-1
    spec:
      containers:
      - name: nginx-1
        image: docker.io/library/nginx:latest
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: ["ReadWriteMany"]
      storageClassName: nfs
      resources:
        requests:
          storage: 1Gi
#查看pod的主机名
[root@master2 statefulset]# for i in 0 1; do kubectl exec nginx-web-1-$i -- sh -c 'hostname';done
nginx-web-1-0
nginx-web-1-1

7.2.2-动态扩缩容更新

和deployment一样,扩缩容修改replicaset和相应的镜像即可

八.DaemonSet(ds控制器)

8.1-DaemonSet相关概论

8.1.1-什么是DaemonSet

概述:

DaemonSet 控制器能够确保 k8s 集群所有的节点都运行一个相同的 pod 副本,当向 k8s 集群中增加 node 节点时,这个 node 节点也会自动创建一个 pod 副本,当 node 节点从 集群移除,这些 pod 也会自动删除;删除 Daemonset 也会删除它们创建的 pod,每个node最多一个

工作原理:

daemonset 的控制器会监听 kuberntes 的 daemonset 对象、pod 对象、node 对象,这 些被监听的对象之变动,就会触发 syncLoop 循环让 kubernetes 集群朝着 daemonset 对象 描述的状态进行演进。

案例:存储日志和监控

8.1.2-DaemonSet 资源清单编写

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    app: fluentd
spec:
  selector:
    matchLabels:
      app: fluentd
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        app: fluentd
        name: fluentd-elasticsearch
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: docker.io/ist0ne/fluentd-elasticsearch:latest
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varcontainerd
          mountPath: /var/lib/containerd/
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varcontainerd
        hostPath:
          path: /var/lib/containerd/
[root@master2 daemonset]# kubectl get pods -A -o wide |grep flu
kube-system            fluentd-elasticsearch-26xn6                 1/1     Running   0               106s    192.168.180.3    master2   <none>           <none>
kube-system            fluentd-elasticsearch-m9zvs                 1/1     Running   0               106s    192.168.137.90   master1   <none>           <none>

rollingUpdate 更新策略只支持 maxUnavailabe,先删除在更新;因为我 们不支持一个节点运行两个 pod,因此需要先删除一个,在更新一个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

云原生工程师-8.statefulset和daemonset 的相关文章

随机推荐

  • Linux学习--安装软件时提示有未能满足的依赖关系

    这种现象出现的原因是 xff1a xff08 1 xff09 软件需要依赖旧的版本的其他软件 xff0c 但是目前这些都是新的 xff08 2 xff09 要装A xff0c 但是依赖新版本的B xff0c 同时C也依赖了B xff0c 但
  • 解决centos9安装mongodb数据库错误:mongod: error while loading shared libraries: libcrypto.so.1.1: cannot open

    今天进行mongodb数据库在linux进行环境搭建搭建到了一半就开始出现错误 mongod error while loading shared libraries libcrypto so 1 1 cannot open shared
  • [模板] 线性筛素数 (欧拉筛)

    模板 素数筛 P3383 模板 线性筛素数 洛谷 计算机科学教育新生态 题目背景 本题已更新 xff0c 从判断素数改为了查询第 k 小的素数 提示 xff1a 如果你使用 cin 来读入 xff0c 建议使用 std ios sync w
  • WSL+Systemd+Gnome+VcXsrv+CUDAToolkit 安装

    我的版本信息 wsl xff1a PS C Users kirk gt wsl update 正在检查更新 无更新使用 内核版本 xff1a 5 10 102 1 Ubuntu xff1a kirk 64 KirkComputer lsb
  • java上位机

    可以做 xff0c 我有做好的底层通讯程序 xff0c 无需了解通讯协议 xff0c 只要正确配置就可以读出相应的寄存器的值 xff0c 数据类型支持short xff0c int xff0c float等 xff0c 我也有做好的界面 x
  • java上位机的界面

  • Lanelet2高精地图3——LineString(线串)介绍

    LineString线串是两个或者多个点生成的有序数组 xff0c 用来描述地图元素的形状 线串可以通过高度离散化实现 xff0c 来描述任何一维形式 xff0c 并应用于地图上的任何可物理观察到的部分 与样条曲线相比 xff0c 线串可以
  • 香橙派的使用入门无屏幕安装系统

    首先我购买的是香橙派pipc这款开发板价格在105块 xff0c 需要购买散热片以及风扇 电源需要一个5v3安的电源 xff0c 系统有时候会运行不正常 一开始没有屏幕就需要一根usb转ttl的串口线 xff0c 注意不是usb转232 软
  • 香橙派进入系统后设置ip

    Debian 可以配置静态IP 动态IP使Debian连上互联网 用户使用nano编辑器编辑interface网卡配置文件 xff0c 为Debian系统指定本网络中的唯一IP地址 xff0c 使其能上网 方法 步骤 将用户当前目录切换到网
  • 香橙派更改中文界面以及安装输入法

    第一步更新语言包 sudo apt get install locales 第二部选择 sudo dpkg reconfigure locales 找到语言包空格键选中变 最后安装 scim 输入法相关 xff1a apt get inst
  • 香橙派添加启动脚本

    sudo nano etc rc local 后台启动 nohup root frp frpc c root frp frpc ini amp 查询日志 cat nohup out java jar root aaa jar
  • app远程访问plc实现方法

    工业上越来越多的人需要将局域网内的plc数据或者单片机的数据上传到手机app上 xff0c 实现远程的操作监控 实现的方法是借助plc支持modbus协议 xff0c 通过dtu模块实现串口透传到云服务器 xff0c 之后开发手机app实现
  • java访问西门子300plc以及仿真的测试方法

    安装step7软件 支持win7 64位系统 安装仿真软件plc sim 之后以管理员身份运行Nettoplcsim 下bin下的NetToPLCsim
  • Shell 批量拉取docker镜像(当前目录和指定目录)

    批量拉取docker容器镜像 拉取当前文件夹内的容器镜像 xff1a span class token shebang important bin sh span span class token comment 当前路径 span spa
  • docker-compose部署Jenkins+Gitlab CICD

    docker compose 搭建CICD jenkins 43 gitlab 1 修改yum源 xff08 1 xff09 备份原来的yum源 mv etc yum repos d CentOS Base repo etc yum rep
  • kubernetes Pod高级用法-探针

    POD 2高级用法 容器探测详解 所谓容器探测就是我们在里面设置了一些探针 xff0c 或者传感器来获取相应的数据用来判断容器存活与否或者就绪与否的标准 xff1b 目前k8s支持的存活性探测方式和就绪性探测方式都是一样的 xff0c 探针
  • 云原生工程师-1.容器相关

    个人博客地址 一 docker容器相关 1 服务器虚拟机容器的区别基础知识 k8s1 24之前 xff1a docker 1 24之后containerd docker主要制作镜像 xff1a docker build xff0c dock
  • nginx配置后转发没有生效的一个坑个人总结

    一 概述 nginx配置规则还是有点复杂的 xff0c 在此只总结下本人遇到的一个坑与解决方法 xff0c 具体原因还不清楚 二 配置后没有生效的坑 1 首先 xff0c 要访问的url样例是 xff1a http 10 123 123 1
  • 云原生工程师-6.k8s四层负载均衡-Service

    五 k8s四层负载均衡 Service 个人博客 5 1 什么是Service 5 1 1 Service作用 在 kubernetes 中 xff0c Pod 是有生命周期的 xff0c 如果 Pod 重启它的 IP 很有可能会发生变化
  • 云原生工程师-8.statefulset和daemonset

    七 Statefulset 有状态服务 个人博客 7 1 Statefulset相关概念 7 1 1 什么是Statefulset StatefulSet 是有状态的集合 xff0c 管理有状态的服务 xff0c 它所管理的 Pod 的名称