一、StatefulSet YAML
简写
sts
有状态服务。需要数据持久化的服务,如: mysql
- 特点
StatefulSet
创建的 pod 是有序的
StatefulSet
创建资源时,必须有一个Service
服务
StatefulSet
删除 pod 自动重新创建的 pod 名字不变
StatefulSet
有volumeClaimTemplates
卷申请模板模板,使用的是StorageClass
资源。使用volumeClaimTemplates
创建的卷在 pod 中是独享的。如:mysql 主从
StatefulSet
创建的 pod,的域名 组成:pod-name.svc-name.svc-namespace.svc.cluster.local
Headless service
定义 pod 网络标识,生成 DNS 解析,Headless service
不分配clusterIP
,headless service
可以通过解析Service
的 DNS ,返回所有 Pod 的 dns 和 ip 地址 (StatefulSet
部署的 Pod 才有 DNS ),普通的Service
,只能通过解析Service
的 DNS 返回Service
的ClusterIP
。
-
StatefulSet 的
statefulset.spec
字段
kubectl explain statefulset.spec
字段 | 值类型 | 说明 |
---|---|---|
minReadySeconds |
integer |
|
persistentVolumeClaimRetentionPolicy |
Object |
pvc 回收策略 |
podManagementPolicy |
string |
pod 管理策略 |
replicas |
integer |
副本数 |
revisionHistoryLimit |
integer |
保留的历史版本数量,默认 10
|
* selector |
Object |
标签选择器 匹配方式: matchExpressions :表达式方式匹配 pod,参考上面示例有很多matchLabels :标签 pod 匹配 map[string]string 这个类型 |
* serviceName |
string |
service 服务名 |
* template |
Object |
创建资源时使用的模板replicaset.spec.template.metadata 内容和 pod.metadata 相同。replicaset.spec.template.spec 内容和 pod.spce 相同 |
updateStrategy |
Object |
更新策略rollingUpdate : Object 滚动更新策略maxUnavailable : 最多有几个不可用,也可以说必须存活的副本数partition : 只更新大于等于 partition 序号的 podtype : OnDelete : pod 不会自动更新,更新需要手动删除 pod 然后 StatefulSet 自动创建删除的 podRollingUpdate : 滚动更新,默认策略,需要定义 rollingUpdate
|
volumeClaimTemplates |
[]Object |
卷申请模板,在存储类自动生成 pv 和 pvc |
-
StatefulSet 的
statefulset.spec.volumeClaimTemplates
字段,卷申请模板
因为这个
volumeClaimTemplates
是在statefulset
资源里面的所以apiVersion
和kind
字段可以不写。
metadata
和其他资源的一样
kubectl explain statefulset.spec.volumeClaimTemplates
字段 | 值类型 | 说明 |
---|---|---|
accessModes |
[]string |
访问模式ReadWriteOnce : 卷可以被同一个节点上资源以读写方式挂载。(list 中简称 RWX )ReadOnlyMany : 卷可以被多个节点以只读方式挂载。(list 中简称 ROX )ReadWriteMany : 卷可以被多个节点以读写方式挂载。(list 中简称 RWX )ReadWriteOncePod : 卷可以被单个 Pod 以读写方式挂载。这只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本。(list 中简称 RWOP ) |
dataSource |
Object |
|
dataSourceRef |
Object |
|
resources |
Object |
资源限制limits : 限制最大可用资源requests : 最小的资源需求,节点资源不足这个限制,不会调度到该节点 limits 和 requests 限制的资源 storage 、cpu 、memory 。示例看下面的 |
selector |
Object |
标签选择器。 匹配方式: matchExpressions :表达式方式匹配 pod,参考上面示例有很多matchLabels :标签 pod 匹配 map[string]string 这个类型 |
storageClassName |
string |
存储类的名字,关于存储类 |
volumeMode |
string |
|
volumeName |
string |
示例:
如何创建 nfs 服务
如何创建 StorageClass
apiVersion: v1
kind: Service
metadata:
name: ngins-service
labels:
server: nginx
spec:
selector: # 标签选择器,选择资源的 container
app: nginx
ports: # 定义端口信息
- port: 80 # service 自己的端口号
name: web # 关联的容器名
targetPort: 80 # 目标容器的端口号
clusterIP: None # 不需要 ip
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
labels:
app: sfs
spec:
replicas: 3 # 副本数 3
selector: # 标签选择器
matchLabels:
app: nginx # 选择要使用的 template
serviceName: ngins-service # service 服务的名字
template: # 定义容器模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: web
volumeMounts: # 挂载镜像
- name: web # 下面 volumeClaimTemplates 卷申请的名字
mountPath: /usr/share/nginx/html # 挂载到容器指定位置
volumeClaimTemplates: # 申请卷,要在动态分配 pv 服务里面申请的 pv 和 pvc 的相关配置;根据副本数生成,相互之间独立
- metadata:
name: web
spec:
accessModes: ["ReadWriteOnce"] # 存储模式
storageClassName: nfs # 存储类 StorageClass 的名字,这是在 StorageClass 资源中创建的 nfs 动态分配 pv
resources: # 存储资源限制
requests: # 限制最小可用资源
storage: 100Mi # 存储资源定义为100Mi
查看结果
kubectl get sts
kubectl get svc
kubectl get pods
kubectl get pv
kubectl get pvc
二、DaemonSet YAML
DaemonSet
(简写 ds)确保 k8s 集群所有节点能运行一个相同的 pod,当集群新增节点时DaemonSet
会自动在这个节点上运行 pod,集群删除节点时也会删除 pod。
比如:所有节点运行 ceph。或者所有节点采集日志 logstatsh、fluentd。或者监控。
字段 | 值类型 | 说明 |
---|---|---|
minReadySeconds |
integer |
过多长时间进行后续操作,默认 0 |
revisionHistoryLimit |
integer |
保留的历史版本数量,默认 10 |
* selector |
Object |
标签选择器。 匹配方式: matchExpressions :表达式方式匹配 pod,参考上面示例有很多matchLabels :标签 pod 匹配 map[string]string 这个类型 |
* template |
Object |
创建资源时使用的模板replicaset.spec.template.metadata 内容和 pod.metadata 相同。replicaset.spec.template.spec 内容和 pod.spce 相同 |
updateStrategy |
Object |
更新策略rollingUpdate : Object 滚动更新策略maxUnavailable : 最多有几个不可用,也可以说必须存活的副本数type : OnDelete : pod 不会自动更新,更新需要手动删除 pod 然后 StatefulSet 自动创建删除的 podRollingUpdate : 滚动更新,默认策略,需要定义 rollingUpdate
|
示例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
k8s-app: fluentd-logging
namespace: kube-system # 指定命名空间
spec:
selector: # 标签选择器,选择要使用的 template
matchLabels:
app: fluentd
template: # 定义 template
metadata:
labels:
app: fluentd
spec:
tolerations: # 定义容忍度,因为要所有节点都创建,所以 master 的容忍度需要定义
- key: node-role.kubernetes.io/master # node 节点污点的 key;kubectl describe node nodexx 里面的 Taints 字段
effect: NoSchedule # 污点类型
containers:
- name: fluentd
image: fluentd:v2.5.1
imagePullPolicy: IfNotPresent
resources: # 资源限制
limits: # 容器最多使用的资源
cpu: 200m
memory: 300Mi
requests: # 容器最少使用的资源,也可以说节点最少提供的资源
cpu: 100m
memory: 200Mi
volumeMounts: # 挂载镜像
- name: varlog
mountPath: /var/fluentd-logging # 挂载容器指定位置
readOnly: true # 开启只读
volumes: # 定义挂载卷
- name: varlog
hostPath: # 在本地宿主机挂载卷
path: /var/log
网友评论