@很多朋友反馈,博文排版不易读,从这篇文章开始慢慢学习一下markdown语法吧,啊哈哈。
1、前面说过了deployment,它是一种无状态的控制器类型,接下来聊聊有状态的控制器类型statefulset,在聊之前,先了解下无状态和有状态的概念。
(1)无状态特点:
*一个deployment起的多pod是一模一样的,没有本地的持久化存储,共享相同的网络存储持久化数据。
*多个pod启动时没有先后顺序。
*不用考虑pod在那个node上运行。
*可随意的伸缩。
(2)有状态特点:
*无状态的特点,有状态的都需要考虑。
*每个pod都是独立的,特定的启动顺序和唯一性
*唯一的网络标识符和持久存储
*启动有序,例如mysql主从,先启动主在启动从。
2、有状态控制器的特点
-无头service, 意思是yaml文件里的clusterIP:none 这个值为空
-kind类型不同
-每个pod都有唯一的域名标识和有序的主机名
3、示例通过statefulset部署一个有状态的应用。
$vim statefulset.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: nginx-statefulset
namespace: default
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
这里看到创建以后,svc的cluster-ip是none,配置文件里定义的pod是3个,现在只能看见一个。
这里看见完整运行后,三个pod都正常running了,说明pod启动时有先后顺序的,有0-1-2这样的标识
statefulset和deployment的区别:statefulset的pod都有唯一的域名标识,域名生成规则如下:
主机名.services名称.名称空间.svc.cluster.local
示例:nginx-statefulset-0 这个pod的域名如下:
nginx-statefulset-0.nginx.default.svc.cluster.local
kubenetes官网:https://kubernetes.io/zh/docs/concepts/workloads/controllers/statefulset/
kubenetes社区:https://www.kubernetes.org.cn/statefulset