StatefulSet特性:

  • 部署有状态应用

  • 解决Pod独立生命周期,保持Pod启动顺序和唯一性

    1、稳定,唯一的网络标识符,持久存储

    2、有序,优雅的部署和扩展、删除和终止

    3、有序,滚动更新

  • 稳定得网络ID

    使用Headless Service(相比普通得Service只是将spec.clusterIP定义为Node)来维护Pod网络身份;

    DNS解析名称:...svc.cluster.local

  • 稳定的存储

    Statefulset得存储卷使用VolumeClaimTemplate创建,成为卷申请模板,当statefulset使用VolumeClaimTemplate创建一个PersistentVolume时,同样也会为每个Pod分配并创建一个编号得PVC;

StatefulSet-Pod部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[root@pool1 k8s_yaml]# vi 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/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx:1.20
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates: # StatefuSet特有的存储机制
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ] # 访问模式
storageClassName: "managed-nfs-storage" # 动态PV名称
resources:
requests:
storage: 1Gi
[root@pool1 k8s_yaml]# kubectl apply -f statefulset.yaml
service/nginx created
statefulset.apps/web created

[root@pool1 k8s_yaml]# kubectl get pod | grep web
web-0 1/1 Running 0 22m
web-1 1/1 Running 0 22m
web-2 1/1 Running 0 22m

获取pod得DNS域名解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@pool1 k8s_yaml]# kubectl run -it test --image=busybox:1.28.4 -- sh
/ # nslookup nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name: nginx
Address 1: 10.244.206.14 web-0.nginx.default.svc.cluster.local
Address 2: 10.244.52.201 web-2.nginx.default.svc.cluster.local
Address 3: 10.244.206.15 web-1.nginx.default.svc.cluster.local
/ # ping web-0.nginx.default.svc.cluster.local
PING web-0.nginx.default.svc.cluster.local (10.244.206.14): 56 data bytes
64 bytes from 10.244.206.14: seq=0 ttl=62 time=0.689 ms
^C
--- web-0.nginx.default.svc.cluster.local ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.689/0.689/0.689 ms
/ # ping web-2.nginx.default.svc.cluster.local
PING web-2.nginx.default.svc.cluster.local (10.244.52.201): 56 data bytes
64 bytes from 10.244.52.201: seq=0 ttl=62 time=0.354 ms
64 bytes from 10.244.52.201: seq=1 ttl=62 time=0.391 ms
^C
--- web-2.nginx.default.svc.cluster.local ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.354/0.372/0.391 ms
/ # ping web-1.nginx.default.svc.cluster.local
PING web-1.nginx.default.svc.cluster.local (10.244.206.15): 56 data bytes
64 bytes from 10.244.206.15: seq=0 ttl=62 time=0.851 ms
64 bytes from 10.244.206.15: seq=1 ttl=62 time=1.290 ms
^C
--- web-1.nginx.default.svc.cluster.local ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.851/1.070/1.290 ms

# 这时可以通过nslookup解析的域名来让其他服务进行关联,保证每个Pod都有唯一联系地址;而不是通过svc来实现服务发现及负载均衡;