StatefulSet
StatefulSet
是 Kubernetes 中一种用于管理有状态应用的控制器。它确保应用的每个实例都有唯一的、持久化的身份,并提供稳定的网络身份和持久存储。主要特点包括:
- 稳定的标识符:每个
StatefulSet
实例有一个稳定的、唯一的标识符。实例名称由StatefulSet
名称加上一个序号组成(如web-0
,web-1
)。 - 稳定的存储:
StatefulSet
可以为每个实例提供持久化存储,通过PersistentVolumeClaim
进行持久化存储管理。 - 有序部署和缩放:
StatefulSet
保证按照顺序部署和缩放实例,先创建或删除低序号的实例。 - 有序终止:
StatefulSet
会按照序号顺序终止实例。 - 有序滚动更新:
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: 包含
name
、labels
和annotations
等信息,用于标识和管理DaemonSet
。 - spec: 定义DaemonSet的具体行为,包括:
- selector: 定义
DaemonSet
应该选择哪些 Pod。通常是一个标签选择器。 - template: Pod 的模板,用于创建 Pod 的定义。包括:
- metadata: Pod 的标签和其他 metadata。
- spec: Pod 的具体配置,包括容器、卷、资源请求等。
- updateStrategy: 定义如何更新
DaemonSet
,例如RollingUpdate
或OnDelete
。 - minReadySeconds: (可选) Pod 在标记为“准备好”之前需要等待的秒数。
- selector: 定义
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 强大的调度和管理机制之一,能够确保在所有节点上都运行必要的服务和进程,帮助提升集群的管理效率和一致性。