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-myappnamespace: myserver
spec:replicas: 3serviceName: "myserver-myapp-service"selector:matchLabels:app: myserver-myapp-frontendtemplate:metadata:labels:app: myserver-myapp-frontendspec:containers:- name: myserver-myapp-frontendimage: nginx:1.20.2-alpine ports:- containerPort: 80---
apiVersion: v1
kind: Service
metadata:name: myserver-myapp-servicenamespace: myserver
spec:clusterIP: Noneports:- name: httpport: 80selector: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-exporternamespace: monitoring labels:k8s-app: node-exporter
spec:selector:matchLabels:k8s-app: node-exportertemplate:metadata:labels:k8s-app: node-exporterspec:tolerations:- effect: NoSchedulekey: node-role.kubernetes.io/mastercontainers:- image: prom/node-exporter:v1.3.1 imagePullPolicy: IfNotPresentname: prometheus-node-exporterports:- containerPort: 9100hostPort: 9100protocol: TCPname: metricsvolumeMounts:- mountPath: /host/procname: proc- mountPath: /host/sysname: sys- mountPath: /hostname: rootfsargs:- --path.procfs=/host/proc- --path.sysfs=/host/sys
发布评论