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

七.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,因此需要先删除一个,在更新一个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永恒布gg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值