🥙 StatefulSet

## 什么是 StatefulSet StatefulSet 是用来管理有状态的应用,例如数据库。 前面我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。 而像数据库、Redis 这类有状态的,则不能随意扩充副本。 StatefulSet 会固定每个 Pod 的名字 >s 本文档课件需配套 [视频](https://www.bilibili.com/video/BV1Tg411P7EB?p=5) 一起学习 ## 部署 StatefulSet 类型的 Mongodb ```yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: mongodb spec: serviceName: mongodb replicas: 3 selector: matchLabels: app: mongodb template: metadata: labels: app: mongodb spec: containers: - name: mongo image: mongo:4.4 # IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错 imagePullPolicy: IfNotPresent --- apiVersion: v1 kind: Service metadata: name: mongodb spec: selector: app: mongodb type: ClusterIP # HeadLess clusterIP: None ports: - port: 27017 targetPort: 27017 ``` `kubectl apply -f mongo.yaml` ## StatefulSet 特性 - Service 的 `CLUSTER-IP` 是空的,Pod 名字也是固定的。 - Pod 创建和销毁是有序的,创建是顺序的,销毁是逆序的。 - Pod 重建不会改变名字,除了IP,所以不要用IP直连 ![statefulset.png](https://cos.easydoc.net/46901064/files/kwrhzaku.png) Endpoints 会多一个 hostname ![endpoints](https://cos.easydoc.net/46901064/files/kwri1g2g.png) 访问时,如果直接使用 Service 名字连接,会随机转发请求 要连接指定 Pod,可以这样`pod-name.service-name` 运行一个临时 Pod 连接数据测试下 `kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bash` ## Web 应用连接 Mongodb 在集群内部,我们可以通过服务名字访问到不同的服务 指定连接第一个:`mongodb-0.mongodb` ![mongodbweb.png](https://cos.easydoc.net/46901064/files/kwriial2) ![image.png](https://cos.easydoc.net/46901064/files/kwripe9o.png) ## 问题 **pod 重建后,数据库的内容丢失了** 下节,我们讲解如何解决这个问题。 >d 觉得老师讲得不错的话,记得点赞、关注、分享鼓励下老师 你们的鼓励会让老师更加有动力继续创造更多更好的内容 你可以到 [Github issue](https://github.com/gzyunke/test-k8s/issues) 给我提问