k8s对象类型(二)及pod生命周期

1、StatefulSets
StatefulSet 是用来管理有状态应用的工作负载 API 对象。
StatefulSet 用来管理某 Pod 集合的部署和扩缩, 并为这些 Pod 提供持久存储和持久标识符。
和 Deployment 类似, StatefulSet 管理基于相同容器规约的一组 Pod。但和 Deployment 不同的是, StatefulSet 为它们的每个 Pod 维护了一个有粘性的 ID。这些 Pod 是基于相同的规约来创建的, 但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。
如果希望使用存储卷为工作负载提供持久存储,可以使用 StatefulSet 作为解决方案的一部分。 尽管 StatefulSet 中的单个 Pod 仍可能出现故障, 但持久的 Pod 标识符使得将现有卷与替换已失败 Pod 的新 Pod 相匹配变得更加容易。
1)使用场景
稳定的、唯一的网络标识符。
稳定的、持久的存储。
有序的、优雅的部署和缩放。
有序的、自动的滚动更新。
2)使用限制
给定 Pod 的存储必须由 PersistentVolume 驱动 基于所请求的 storage class 来提供,或者由管理员预先提供。
删除或者收缩 StatefulSet 并不会删除它关联的存储卷。 这样做是为了保证数据安全,它通常比自动清除 StatefulSet 所有相关的资源更有价值。
StatefulSet 当前需要无头服务 来负责 Pod 的网络标识。你需要负责创建此服务。
Statefulset按照顺序对pod进行启停、伸缩和回收,回收从后向前,创建从前向后(前面的pod不会操作)。当删除 StatefulSets 时,StatefulSet 不提供任何终止 Pod 的保证。 为了实现 StatefulSet 中的 Pod 可以有序地且体面地终止,可以在删除之前将 StatefulSet 缩放为 0。
在默认 Pod 管理策略(OrderedReady) 时使用 滚动更新,可能进入需要人工干预 才能修复的损坏状态。

---
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: StatefulSet 
metadata:
  name: myserver-myapp
  namespace: myserver
spec:
  replicas: 3
  serviceName: "myserver-myapp-service"
  selector:
    matchLabels:
      app: myserver-myapp-frontend
  template:
    metadata:
      labels:
        app: myserver-myapp-frontend
    spec:
      containers:
      - name: myserver-myapp-frontend
        image: nginx:1.20.2-alpine 
        ports:
          - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: myserver-myapp-service
  namespace: myserver
spec:
  clusterIP: None
  ports:
  - name: http
    port: 80
  selector:
    app: myserver-myapp-frontend

测试

kubectl get pod -n myserver  -o wide 
NAME               READY   STATUS    RESTARTS   AGE   IP               NODE             NOMINATED NODE   READINESS GATES
myserver-myapp-0   1/1     Running   0          5s    10.200.169.157   192.168.74.148   <none>           <none>
myserver-myapp-1   1/1     Running   0          4s    10.200.100.81    192.168.74.149   <none>           <none>
myserver-myapp-2   1/1     Running   0          2s    10.200.135.156   192.168.74.147   <none>           <none>

/ # ping myserver-myapp-0.myserver-myapp-service.myserver.svc.kubedocker.local
PING myserver-myapp-0.myserver-myapp-service.myserver.svc.kubedocker.local (10.200.169.157): 56 data bytes
64 bytes from 10.200.169.157: seq=0 ttl=62 time=0.644 ms
64 bytes from 10.200.169.157: seq=1 ttl=62 time=0.263 ms
64 bytes from 10.200.169.157: seq=2 ttl=62 time=0.336 ms
^C
--- myserver-myapp-0.myserver-myapp-service.myserver.svc.kubedocker.local ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.263/0.414/0.644 ms
/ # ping myserver-myapp-service
PING myserver-myapp-service (10.200.135.156): 56 data bytes
64 bytes from 10.200.135.156: seq=0 ttl=64 time=0.040 ms
64 bytes from 10.200.135.156: seq=1 ttl=64 time=0.050 ms
64 bytes from 10.200.135.156: seq=2 ttl=64 time=0.046 ms
^C
--- myserver-myapp-service ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.040/0.045/0.050 ms
/ # ping myserver-myapp-service
PING myserver-myapp-service (10.200.135.156): 56 data bytes
64 bytes from 10.200.135.156: seq=0 ttl=64 time=0.032 ms
64 bytes from 10.200.135.156: seq=1 ttl=64 time=0.050 ms
^C
--- myserver-myapp-service ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.032/0.041/0.050 ms
/ # ping myserver-myapp-service
PING myserver-myapp-service (10.200.100.81): 56 data bytes
64 bytes from 10.200.100.81: seq=0 ttl=62 time=0.709 ms
64 bytes from 10.200.100.81: seq=1 ttl=62 time=0.320 ms
^C
--- myserver-myapp-service ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.320/0.514/0.709 ms
/ # ping myserver-myapp-service
PING myserver-myapp-service (10.200.169.157): 56 data bytes
64 bytes from 10.200.169.157: seq=0 ttl=62 time=0.281 ms
64 bytes from 10.200.169.157: seq=1 ttl=62 time=0.388 ms
^C
--- myserver-myapp-service ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.281/0.334/0.388 ms


2、DaemonSet
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

使用场景:
在每个节点上运行集群守护进程
在每个节点上运行日志收集守护进程
在每个节点上运行监控守护进程

#基于DaemonSet部署prometheus

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring 
  labels:
    k8s-app: node-exporter
spec:
  selector:
    matchLabels:
        k8s-app: node-exporter
  template:
    metadata:
      labels:
        k8s-app: node-exporter
    spec:
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
      containers:
      - image: prom/node-exporter:v1.3.1 
        imagePullPolicy: IfNotPresent
        name: prometheus-node-exporter
        ports:
        - containerPort: 9100
          hostPort: 9100
          protocol: TCP
          name: metrics
        volumeMounts:
        - mountPath: /host/proc
          name: proc
        - mountPath: /host/sys
          name: sys
        - mountPath: /host
          name: rootfs
        args:
        - --path.procfs=/host/proc
        - --path.sysfs=/host/sys
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes(简称为k8s)中的Pod是最小的可部署单元,用于运行容器化应用程序。Pod生命周期可以分为以下几个阶段: 1. Pending(等待):Pod被创建后,处于Pending状态表示Kubernetes正在为Pod分配资源(如CPU、内存等)。在这个阶段,Pod可能会处于排队等待状态。 2. Running(运行中):一旦Pod获得了所需的资源,它将进入Running状态。在这个阶段,容器正在运行,并且可以被其他组件访问。 3. Succeeded(成功):如果Pod中的所有容器成功完成了它们的任务,那么Pod将进入Succeeded状态。通常情况下,这意味着所有容器都已经退出,并且不会再重新启动。 4. Failed(失败):如果Pod中的任何一个容器退出并返回错误代码,那么Pod将进入Failed状态。通常情况下,这意味着容器无法完成其任务。 5. Unknown(未知):如果无法获取关于Pod当前状态的信息,那么Pod将进入Unknown状态。这可能是由于与集群通信故障或其他未知错误导致的。 除了上述状态之外,Pod还可以通过以下方式进行调整: 1. 创建(Create):通过创建Pod规范文件或使用Kubernetes API来创建Pod。 2. 更新(Update):可以通过更新Pod规范文件或使用Kubernetes API来更新Pod的配置(如镜像版本、资源请求等),这将触发Pod的重新调度。 3. 删除(Delete):可以通过删除Pod规范文件或使用Kubernetes API来删除Pod。一旦Pod被删除,它将不再存在于集群中。 需要注意的是,Kubernetes会根据集群的状态和配置自动处理Pod生命周期,例如自动重新调度失败的Pod或替换不健康的Pod

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值