Myluzh Blog

Kubernetes(k8s)-StatefulSet

发布时间: 2023-6-20 文章作者: myluzh 分类名称: Kubernetes 朗读文章


0x01 什么是 StatefulSet
StatefulSet 是用来管理有状态的应用,例如数据库。
前面我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。
而像数据库、Redis 这类有状态的,则不能随意扩充副本。
StatefulSet 会固定每个 Pod 的名字

0x02 部署 StatefulSet 类型的 Mongodb
1.创建mongo.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
应用yaml文件
kubectl apply -f mongo.yaml

0x03 StatefulSet 特性
Service 的 CLUSTER-IP 是空的,Pod 名字也是固定的。
Pod 创建和销毁是有序的,创建是顺序的,销毁是逆序的。
Pod 重建不会改变名字,除了IP,所以不要用IP直连
点击查看原图
Endpoints 会多一个 hostname
点击查看原图
访问时,如果直接使用 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

0x04 Web 应用连接 Mongodb

在集群内部,我们可以通过服务名字访问到不同的服务
指定连接第一个:mongodb-0.mongodb
点击查看原图
点击查看原图

标签: k8s kubernetes StatefulSet

发表评论