七.Statefulset-有状态服务
个人博客
7.1-Statefulset相关概念
7.1.1-什么是Statefulset
StatefulSet 是有状态的集合,管理有状态的服务,它所管理的 Pod 的名称不能随意变化。数据 持久化的目录也是不一样,每一个 Pod 都有自己独有的数据持久化存储目录。比如 MySQL 主 从、redis 集群等。
RC、Deployment、DaemonSet 都是管理无状态的服务,它们所管理的 Pod 的 IP、名字,启 停顺序等都是随机的。个体对整体无影响,所有 pod 都是共用一个数据卷的,部署的 tomcat 就是无状态的服务,tomcat 被删除,在启动一个新的 tomcat,加入到集群即可,跟 tomcat 的名 字无关。
sts和deploy的区别:解析内部域名的时候,sts解析service的dns返回的是pod对应的,deploy则是service的
StatefulSet 由以下几个部分组成:
一:
Headless Service:用来定义 pod 网路标识,生成可解析的 DNS 记录
-
Headless service 不分配 clusterIP,headless service 可以通过解析 service 的 DNS,返回所 有 Pod 的 dns 和 ip 地址 (statefulSet 部署的 Pod 才有 DNS),普通的 service,只能通过解析 service 的 DNS 返回 service 的 ClusterIP。
-
在使用 Deployment 时,创建的 Pod 名称是没有顺序的,是随机字符串,在用 statefulset 管理 pod 时要求 pod 名称必须是有序的 ,每一个 pod 不能被随意取代,pod 重建后 pod 名称还是 一样的。因为 pod IP 是变化的,所以要用 Pod 名称来识别。pod 名称是 pod 唯一性的标识符, 必须持久稳定有效。这时候要用到无头服务,它可以给每个 Pod 一个唯一的名称。
-
域名:.$.svc.cluster.local
-
StatefulSet 会为关联的 Pod 保持一个不变的 Pod Name:
statefulset 中 Pod 的名字格式为
(
S
t
a
t
e
f
u
l
S
e
t
n
a
m
e
)
−
(StatefulSet name)-
(StatefulSetname)−(pod 序号)
StatefulSet 会为关联的 Pod 分配一个 dnsName:
<
P
o
d
N
a
m
e
>
.
<Pod Name>.
<PodName>..$.svc.cluster.local
二:
volumeClaimTemplates:存储卷申请模板,创建 pvc,指定 pvc 名称大小,自动创建 pvc,且 pvc 由存储类供应。
对于有状态应用都会用到持久化存储,比如 mysql 主从,由于主从数据库的数据是不能存放在一 个目录下的,每个 mysql 节点都需要有自己独立的存储空间。而在 deployment 中创建的存储卷 是一个共享的存储卷,多个 pod 使用同一个存储卷,它们数据是同步的,而 statefulset 定义中 的每一个 pod 都不能使用同一个存储卷,这就需要使用 volumeClainTemplate,当在使用 statefulset 创建 pod 时,volumeClainTemplate 会自动生成一个 PVC,从而请求绑定一个 PV,每一个 pod 都有自己专用的存储卷。Pod、PVC 和 PV 对应的关系图如下:
三:
StatefulSet:管理 pod 的
7.1.2-Statefulset资源清单
apiVersion: apps/v1
kind: StatefulSet
metada:
name:
labels:
key: value
spec:
replicas:
revisionHistoryLimit:
selector <Object> -required-
serviceName <string> -required-
updateStrategy <Object>
volumeClaimTemplates<[]Object>
template <Object> -required-
7.2-Statefulset-应用案例
7.2.1-部署 web 站点
apiVersion: v1
kind: Service
metadata:
name: nginx-1
labels:
app: nginx-1
spec:
ports:
- name: web
port: 80
clusterIP: None
selector:
app: nginx-1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-web-1
spec:
selector:
matchLabels:
app: nginx-1
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
app: nginx-1
spec:
containers:
- name: nginx-1
image: docker.io/library/nginx:latest
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: ["ReadWriteMany"]
storageClassName: nfs
resources:
requests:
storage: 1Gi
[root@master2 statefulset]
nginx-web-1-0
nginx-web-1-1
7.2.2-动态扩缩容更新
和deployment一样,扩缩容修改replicaset和相应的镜像即可
八.DaemonSet(ds控制器)
8.1-DaemonSet相关概论
8.1.1-什么是DaemonSet
概述:
DaemonSet 控制器能够确保 k8s 集群所有的节点都运行一个相同的 pod 副本,当向 k8s 集群中增加 node 节点时,这个 node 节点也会自动创建一个 pod 副本,当 node 节点从 集群移除,这些 pod 也会自动删除;删除 Daemonset 也会删除它们创建的 pod,每个node最多一个
工作原理:
daemonset 的控制器会监听 kuberntes 的 daemonset 对象、pod 对象、node 对象,这 些被监听的对象之变动,就会触发 syncLoop 循环让 kubernetes 集群朝着 daemonset 对象 描述的状态进行演进。
案例:存储日志和监控
8.1.2-DaemonSet 资源清单编写
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
app: fluentd
spec:
selector:
matchLabels:
app: fluentd
name: fluentd-elasticsearch
template:
metadata:
labels:
app: fluentd
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: docker.io/ist0ne/fluentd-elasticsearch:latest
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varcontainerd
mountPath: /var/lib/containerd/
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varcontainerd
hostPath:
path: /var/lib/containerd/
[root@master2 daemonset]
kube-system fluentd-elasticsearch-26xn6 1/1 Running 0 106s 192.168.180.3 master2 <none> <none>
kube-system fluentd-elasticsearch-m9zvs 1/1 Running 0 106s 192.168.137.90 master1 <none> <none>
rollingUpdate 更新策略只支持 maxUnavailabe,先删除在更新;因为我 们不支持一个节点运行两个 pod,因此需要先删除一个,在更新一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)