Sateful和Operator
Sateful 和 Operator
Pod: k8s最小的逻辑单元
service:提供注册服务和服务发现功能(通过CoreDNS实现)
Pod Controller: Deployment(维持不定数量) DaemonSet
CronJob:定时任务执行控制器
satefulSet:只为我们固定了每个Pod的名字和底下的Pod,对应的存储卷,无法扩容 (stateful有状态应用)
CoreOS: operator控制器
operator: 是针对所有有状态应用,实现扩缩容。里面封装的成熟的扩缩容命令。通过它对有状态应用进行扩缩容。operator本身运行Pod
Operator SDK:为了帮助企业快速开发自己有状态应用,提供的接口
githup搜索awesore-operators
operator是把satefulSet中的代码,结合特定的应用程序做二次封装
SatefulSet
- 固定唯一的网络标识
- 固定有序的存储
- 有序优雅的部署和扩展
- 有序优雅的删除或停止
- 有序的滚动和更新
要求
各Pod用到的存储卷必须使用StroageClass 动态供给或事先创建好PV
删除StatefulSet或缩减其规模导致Pod被删除时,不应该自动删除存储卷,以确保数据安全。
删除Pod或者SatefulSet,存储卷会不会自动删除,取决于PV的回收策略
statefulSet控制器依赖于一个事先存在的Headless Service对象实现Pod对象的持久化,唯一标识符的配置。此Headless service需要用户手动配置
image.png
必须有两个模板,一个为Pod模板,一个为PVC模板。来实现volume和pod一一对应
Pod标识
Pod 由 sateful 控制器创建,如何保证Pod的标识是固定的
- Ordinal Index 有序索引如第一个Pod为web-0,第二个Pod 为web-1,依次类推如果web-0挂了,则会创建web-0 Pod
Pod的策略管理
-
OrderedReady Pod Management
一个Pod创建完毕,再创建另一个Pod串行 -
Palraller Pod Management
可以同时创建Pod,但Pod标识依然是有序的
Pod 的更新策略
On Delete:由用户手动删除现有的Pod对象,从而触发其更新的策略
Rolling Updates: 默认策略,它通过自动更新机制完成更新的过程,启动更新过程时,它会自动删除每个Pod对象并以新的配置进行重建,更新顺序同时删除statefulSet时的逆向操作机制,一次删除并更新一个Pod
金丝雀发布: 定义partition,例partition=3。把Pod序列大于等于3的全部更新。测试完毕后,将partition设置为0,更新全部
手动创建statefulset
- 先创建PV
- 创建 headless service
- 定义statefulset 控制器里面的Pod模板和PVC模板
cat stateful-daemon.yaml //在8章拿到
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
labels:
app: myapp-svc
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
spec:
serviceName: myapp-svc
replicas: 2
selector:
matchLabels:
app: myapp-pod
template:
metadata:
labels:
app: myapp-pod
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v5
ports:
- containerPort: 80
name: web
volumeMounts:
- name: myappdata
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: myappdata
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "gluster-dynamic"
resources:
requests:
storage: 2G
kubectl explain sts.spec.updateStrategy.rollingUpdate
当stateful 缩容时,pvc会保留下来,当statefulSet再次扩容时,还会使用相同的pv,因为Pod标识是一样的