上一章节,初步通过Deployment和ReplicaSet了解到了他们对Pod的管理方式,但是这里有一个问题,pod的名字都是无序的随机生成无状态服务,我们又知道同pod之间是可以互相访问的。那有没有一种方式能让这种变成可预测的呢?
举例,有2个pod程序,其中一个是web服务,一个是是mysql服务,web需要去连接mysql进行数据查询,那么就得在web服务中写好mysql的IP地址,但是如果mysql的pod被重建了,IP就发生改变了。如果web是通过主机名去连接mysql,同时这个mysql即便重建主机名也不发生改变,岂不美哉?
K8S为了这种环境提供了一个新的对象:StatefulSet。
StatefulSet
类似于ReplicaSet
,但是它可以处理Pod
的启动顺序,为保留每个Pod
的状态设置唯一标识,同时具有以下功能:
- 稳定的、唯一的网络标识符
- 稳定的、持久化的存储
- 有序的、优雅的部署和缩放
- 有序的、优雅的删除和终止
- 有序的、自动滚动更新
接下来还是以具体的例子来演示。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: m.daocloud.io/docker.io/nginx:latest
ports:
- containerPort: 80
name: web
上述例子使用StatefulSet类型来创建了一个3副本的pod,通过下图可以看到pod的编号不再无序,而是在有序的以0,1,2数字往后叠加。
通过kubectl delete命令删除其中一个pod,可以观察出来,IP发生了改变,但是主机名没有变化。
在我们学习了service的章节后,可以使用 <pod名>.<命名空间>.svc.cluster.local 的方式,通过主机名来直达pod节点。