StatefulSet和DaemonSet

StatefulSet

StatefulSet 是 Kubernetes 中一种用于管理有状态应用的控制器。它确保应用的每个实例都有唯一的、持久化的身份,并提供稳定的网络身份和持久存储。主要特点包括:

  1. 稳定的标识符:每个 StatefulSet 实例有一个稳定的、唯一的标识符。实例名称由 StatefulSet 名称加上一个序号组成(如 web-0, web-1)。
  2. 稳定的存储StatefulSet 可以为每个实例提供持久化存储,通过 PersistentVolumeClaim 进行持久化存储管理。
  3. 有序部署和缩放StatefulSet 保证按照顺序部署和缩放实例,先创建或删除低序号的实例。
  4. 有序终止StatefulSet 会按照序号顺序终止实例。
  5. 有序滚动更新StatefulSet 在更新过程中会按照顺序滚动更新实例,以确保服务稳定性。

StatefulSet 的典型用例包括数据库、分布式缓存和其他需要稳定身份和持久存储的有状态应用。

vim  /etc/exports
/data/disk *(rw,sync,no_root_squash,no_subtree_check)
exportfs -arv
systemctl start nfs-utils-service
systemctl enable nfs-server.service
systemctl status nfs-utils-service
#手动存储
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
      app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.21.5
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        nfs:
          server: 192.168.240.11
          path: /data/disk
#动态存储
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-provisioner
spec:
  selector:
    matchLabels:
      app: nfs-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccountName: nfs-provisioner
      containers:
        - name: nfs-provisioner
          image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: example.com/nfs
            - name: NFS_SERVER
              value: 192.168.240.11
            - name: NFS_PATH
              value: /data/disk
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.240.11
            path: /data/disk
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
      app: nginx
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-web
provisioner: example.com/nfs
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.21.5
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "nfs-web"
      resources:
        requests:
          storage: 1Gi

DaemonSet

DaemonSet 是 Kubernetes 中用于在集群的每个节点上部署一个或多个 Pod 的资源对象。它通常用于需要在所有节点上运行的后台服务或守护进程。以下是有关 DaemonSet 的详细介绍:

1. DaemonSet 的作用

DaemonSet 确保在集群中的每个节点上运行一个指定的 Pod 实例。它通常用于以下情况:

  • 需要在每个节点上运行的系统级别服务(如日志收集、监控代理、网络插件等)。
  • 服务需要在每个节点上有相同的配置和状态。

2. 关键字段

以下是 DaemonSet 配置的主要字段:

  • apiVersion: apps/v1
  • kind: DaemonSet
  • metadata: 包含 namelabelsannotations 等信息,用于标识和管理 DaemonSet
  • spec: 定义DaemonSet的具体行为,包括:
    • selector: 定义 DaemonSet 应该选择哪些 Pod。通常是一个标签选择器。
    • template: Pod 的模板,用于创建 Pod 的定义。包括:
      • metadata: Pod 的标签和其他 metadata。
      • spec: Pod 的具体配置,包括容器、卷、资源请求等。
    • updateStrategy: 定义如何更新 DaemonSet,例如 RollingUpdateOnDelete
    • minReadySeconds: (可选) Pod 在标记为“准备好”之前需要等待的秒数。

3. 常见用途

  • 日志收集:如 Fluentd、Logstash。
  • 监控:如 Prometheus Node Exporter。
  • 网络插件:如 Flannel、Calico。

4. 示例

以下是一个简单的 DaemonSet 示例,它在每个节点上运行一个 容器:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: "200Mi"
          requests:
            cpu: "100m"
            memory: "200Mi"
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

5. 更新和滚动更新

DaemonSet 的 Pod 模板被更新时,Kubernetes 可以自动进行滚动更新以确保新版本的 Pod 部署到所有节点。更新策略可以通过 updateStrategy 字段进行配置。RollingUpdate 是默认的更新策略,它逐步替换旧的 Pod 以避免服务中断。

6. Node Affinity 和 Taints/Tolerations

DaemonSet 支持使用节点亲和性 (Node Affinity) 和容忍 (Taints/Tolerations) 来控制 Pod 的调度。例如,你可以设置一个 DaemonSet 只在特定标签的节点上运行。

7. 管理和监控

你可以使用 kubectl 命令来管理和监控 DaemonSet

  • 查看 DaemonSet: kubectl get daemonsets
  • 描述 DaemonSet: kubectl describe daemonset <daemonset-name>
  • 删除 DaemonSet: kubectl delete daemonset <daemonset-name>

8. 资源管理

DaemonSet 会在集群中的所有节点上创建 Pod,因此需要注意资源的使用和调度,特别是在大规模集群中。合理配置资源请求和限制可以避免资源争用和性能瓶颈。

9. 注意事项

  • 节点的数量和 Pod 的数量DaemonSet 会在每个节点上运行一个 Pod,因此节点的数量会影响 Pod 的数量。如果节点数量变化,DaemonSet 会自动调整 Pod 的数量。
  • 删除操作:删除 DaemonSet 只会删除它管理的 Pod,而不会删除节点上的 Pod。

DaemonSet 是 Kubernetes 强大的调度和管理机制之一,能够确保在所有节点上都运行必要的服务和进程,帮助提升集群的管理效率和一致性。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值