一. SatefulSet有状态服务控制器
什么是有状态服务? 什么是无状态服务?
1.无状态服务的特点
1. 认为pod都是一样的,创建的副本都是一样的
2. 没有顺序要求 #没有启动顺序要求
3.不用考虑在那个node上运行
4. 随意进行伸缩和扩展#像我们之前部署的deployment就是无状态服务的控制器
2.有状态服务的特点
上面的因素都要考虑到
让每个pod都是独立的,保持pod的启动顺序和唯一性
##通过 唯一网络标识符、持久存储区分
##有序, 比如mysql主从 必须先有主后有从
二. 部署应用
在此之前我们需要先知道什么是"无头service"
之前我们的svc中是有ip地址的,无头svc没有ip,但是会生成一个类似域名的存在去提供访问
创建无头service
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None #service的类型为无头svc
selector:
app: nginx
创建StatefulSet应用
apiVersion: apps/v1
kind: StatefulSet #指定类型
metadata:
name: nginx-statefulset
namespace: default
spec:
serviceName: nginx #使用上面的svc
replicas: 3 #給3个副本,每个都是独立的pod
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
部署
kubectl create -f ss.yaml
kubectl create -f ss-svc.yaml
查看pod
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-statefulset-0 1/1 Running 0 95s
nginx-statefulset-1 1/1 Running 0 55s
nginx-statefulset-2 1/1 Running 0 20s
#可以看到3个pod,都是用的唯一的名称,服务名称+0、1、2
查看svc
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 40d
nginx ClusterIP "None" <none> 80/TCP 2m19s
#可以看到CLUSTER-IP的位置是None,说明是个无头service
现在他要保证pod都是独立的,保证pod的启动顺序和唯一性,这里使用唯一的网络标识或持久存储
他是怎么进行约定的呢?
statefuset和deployment的区别就是"唯一身份标识"
他会根据主机名、以及一定规则生成的域名来保证身份唯一
#每个pod都会有一个唯一的主机名,会生成唯一的域名
#固定格式:
主机pod名称.service名称.名称空间.svc.cluster.local
#比如我们刚才那个生成出以下的唯一域名
nginx-statefulset-0.nginx.default.svc.cluster.local