本帖最后由 茎肛互撸娃 于 2023-7-20 04:46 编辑
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
clusterIP: None # HeadLess类型服务,也就不会分配集群ip了,只能通过服务名字访问
ports:
- port: 27018 # 服务端口
targetPort: 27017 # 容器端口
部署:kubectl apply -f mongo.yaml
StatefulSet 特性
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mongodb-0 1/1 Running 0 65s
mongodb-1 1/1 Running 0 33s
mongodb-2 1/1 Running 0 20s
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h14m
mongodb ClusterIP None <none> 27018/TCP 80s
test-k8s ClusterIP 10.96.154.148 <none> 5111/TCP 43m
- 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
|