StatefulSet官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/
StatefulSet控制器主要用来部署有状态应用,StatefulSet创建的每个Pod对象都具有唯一且固定的Pod名称,这些Pod对象的数据一般都会通过PVC保存在持久存储中。StatefulSet可以用来部署mysql、redis和kafka这类服务。
StatefulSet会按照顺序对Pod进行启停和伸缩操作。对于拥有N个副本的StatefulSet的资源来说,它会以{0…N-1}对各个Pod进行编号并按顺序创建,当前Pod就绪后才能创建下一个,删除的时候以相反的顺序进行,当前Pod删除完成后才能删除前一个。
一般来说StatefulSet还需要结合Headless Service使用,Headless Service就是没有ClusterIP的Service对象。Headle Service对象负责为每个Pod对象固定的名称标识符生成可解析的DNS记录,StatefulSet负责编排Pod对象,并且借助PVC模板为Pod提供专用且固定的存储资源。
StatefulSet 创建的Pod的名称格式为
StatefulSet的资源规范文件如下:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: ...
namespace: ...
spec:
replicas: > #期望Pod副本数,默认为1
selector:
StatefulSet示例:
apiVersion: v1
kind: Service
metadata:
name: statefulset-svc
spec:
selector:
app: statefulset-demo
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: statefulset-demo
spec:
serviceName: statefulset-svc
replicas: 3
selector:
matchLabels:
app: statefulset-demo
template:
metadata:
labels:
app: statefulset-demo
spec:
containers:
- name: nginx
image: nginx
ports:
- name: http
containerPort: 80
volumeClaimTemplates:
- metadata:
name: date
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
limits:
storage: 1Gi
storageClassName: managed-nfs-storage
查看StatefulSet创建的Pod,名称都是按顺序编号的,格式为
创建的pvc资源也一样按顺序编号
在测试pod中对statefulset-svc解析,会直接返回3个Pod的地址。也可以直接解析pod对应的域名,pod的域名格式是
DaemonSet官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/
DaemonSet控制器是一种特殊的控制器,它可以在集群中的每个节点上运行同一个Pod,当有新的节点加入集群时DaemonSet也会在新节点上创建相同的Pod;当从集群中移除节点时,节点上的Pod也会被自动删除。删除DaemonSet将会删除其创建的所有Pod。DaemonSet主要用来运行那些系统级守护进程,例如监控代理进程和日志收集进程等
DaemonSet的资源规范文件常用字段如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ...
namespace: ...
spec:
selector: > #标签选择器,用于筛选Pod
template: > #Pod模板
minReadySeconds: > #Pod就绪多少秒内无任一容器崩溃方可视为就绪
updateStrategy: #更新策略配置
type: > #更新方式,可用值有OnDelete和RollingUpdate
rollingUpdate: #用于滚动更新的配置
maxUnavailable: > #更新期间可比期望的Pod数量缺少的数量或百分比
DaemonSet示例,在每个节点部署prometheus node-expoter:
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: prometheus-node-expoter
namespace: monitoring
spec:
selector:
matchLabels:
app: prometheus-node-expoter
template:
metadata:
labels:
app: prometheus-node-expoter
spec:
containers:
- name: prometheus-node-expoter
image: prom/node-exporter:v1.3.1
args:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --path.rootfs=/host
ports:
- name: metrics
containerPort: 9100
protocol: TCP
hostPort: 9100
volumeMounts:
- name: proc
mountPath: /host/proc
readOnly: true
- name: sys
mountPath: /host/sys
readOnly: true
- name: rootfs
mountPath: /host
readOnly: true
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
- name: rootfs
hostPath:
path: /
hostNetwork: true
hostPID: true
查看Pod,DaemonSet会在每个节点都创建一个对应的Pod
访问任意节点的9100端口的/metrics路径测试,可以看到已经有和监控数据