StatefulSet
# StatefulSet
StatefulSet 是用来管理有状态的应用,例如数据库。 前面我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。 而像数据库、Redis 这类有状态的,则不能随意扩充副本。 StatefulSet 会固定每个 Pod 的名字
# 部署 StatefulSet 类型的 Mongodb
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
部署配置
kubectl apply -f mongo.yaml
1
查看 pod 状态
kubectl get pod
1
发现后缀是有序 而不是之前随机生成的

扩容
kubectl scale sts mongodb --replicas=5
1
# StatefulSet 特性
- Service 的
CLUSTER-IP是空的,Pod 名字也是固定的。 - Pod 创建和销毁是有序的,创建是顺序的,销毁是逆序的。
- Pod 重建不会改变名字,除了 IP,所以不要用 IP 直连
我们通过 kubectl get endpoints mongodb -o yaml 查看 k8s 导出的 yaml 配置
kubectl get endpoints mongodb -o yaml
1
Endpoints 会多一个 hostname

访问时,如果直接使用 Service 名字连接,会随机转发请求
要连接指定 Pod,可以这样 pod-name.service-name
先获取 pod 的名称
kubectl get pod
1
运行一个临时 Pod 连接数据测试下
kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bash
1
使用 MongoDB 客户端测试
mongo --host mongodb-0.mongodb
1
编辑 (opens new window)
上次更新: 2023/12/06, 01:31:48