1.应用场景

- 稳定的不共享持久化存储:即每个pod的存储资源是不共享的,且pod重新调度后还是能访问到相同的持久化数据,基于pvc实现。
- 稳定的网络标志:即pod重新调度后其PodName和HostName不变,且PodName和HostName是相同的,基于Headless Service来实现的。
- 有序部署,有序扩展:即pod是有顺序的,在部署或者扩展的时候是根据定义的顺序依次依序部署的(即从0到N-1,在下一个Pod运行之前所有之前的pod必都是Running状态或者Ready状态),是基于init containers来实现的。
- 有序收缩:在pod删除时是从最后一个依次往前删除,即从N-1到0.
​
基于上面的特性,可以发现statefulset由以下几个部分组成:
​
- 用于定义网络标志(DNS domain)的headless service
- 用于**创建pvc的volumeClaimTemplates**
- 具体的statefulSet应用

2.示例

2.1创建yaml文件

[root@vm21 opt]# vi statefulset-demo.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None                                 # 要点1,可以不用指定clusterIP
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"                           # 要点2,指定serviceName名称
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
          name: web

2.2应用yaml文件

[root@vm21 opt]# kubectl apply -f statefulset-demo.yaml
service/nginx created
statefulset.apps/web created

2.3查看资源清单

[root@vm21 opt]# kubectl get pods,svc,sts
NAME        READY   STATUS    RESTARTS   AGE
pod/web-0   1/1     Running   0          10m
pod/web-1   1/1     Running   0          10m
​
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   109m
service/nginx        ClusterIP   None         <none>        80/TCP    10m
​
NAME                   READY   AGE
statefulset.apps/web   2/2     10m

2.4扩缩容

# 增加一个pod
[root@vm21 opt]# kubectl scale --replicas=3 sts web
statefulset.apps/web scaled

2.5查看资源清单

[root@vm21 opt]# kubectl get pods,svc,sts
NAME        READY   STATUS    RESTARTS   AGE
pod/web-0   1/1     Running   0          10m
pod/web-1   1/1     Running   0          10m
pod/web-2   1/1     Running   0          5m51s                             # 扩容后增加的pod
​
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   109m
service/nginx        ClusterIP   None         <none>        80/TCP    10m
​
NAME                   READY   AGE
statefulset.apps/web   3/3     10m

2.6创建外部测试pod

vi busubox-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

2.7stateful资源对照清单

[root@vm21 opt]# kubectl get pod -o wide |grep web
NAME      READY   STATUS    RESTARTS   AGE     IP               NODE   NOMINATED NODE   READINESS GATES
web-0     1/1     Running   0          35m     10.244.125.197   vm23   <none>           <none>
web-1     1/1     Running   0          34m     10.244.14.5      vm22   <none>           <none>
web-2     1/1     Running   0          30m     10.244.124.71    vm21   <none>           <none>

2.8测试stateful解析

[root@vm21 opt]# kubectl exec -it busybox -- sh
/bin # nslookup web-0.nginx
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name:      web-0.nginx
Address 1: 10.244.125.197 web-0.nginx.default.svc.cluster.local    #对照上面清单中web-0的IP为10.244.125.197
​
/bin # nslookup web-1.nginx
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name:      web-1.nginx
Address 1: 10.244.14.5 web-1.nginx.default.svc.cluster.local      #对照上面清单中web-0的IP为10.244.14.5
​
/bin # nslookup web-2.nginx
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name:      web-2.nginx
Address 1: 10.244.124.71 web-2.nginx.default.svc.cluster.local    #对照上面清单中web-0的IP为10.244.124.71
​
/ # ping web-0.nginx
PING web-0.nginx (10.244.125.197): 56 data bytes                  #对照上面清单中web-0的IP为10.244.125.197
64 bytes from 10.244.125.197: seq=0 ttl=63 time=0.173 ms
64 bytes from 10.244.125.197: seq=1 ttl=63 time=0.081 ms
64 bytes from 10.244.125.197: seq=2 ttl=63 time=0.139 ms
^C
--- web-0.nginx ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.081/0.131/0.173 ms
​
/ # wget web-0.nginx
Connecting to web-0.nginx (10.244.125.197:80)
index.html           100% |*****************************************************|   615   0:00:00 ETA
​
/ # cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
​
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
​
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

2.9小结

1)有序索引
对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 将被分配一个整数序号, 从 0 到 N-1,该序号在 StatefulSet 上是唯一的。比如``sts name=nginx ,replicas=3则对应的pod名称依次为nginx-0、nginx-1、nginx-2`,
​
2)稳定的网络ID
StatefulSet 可以使用 "无头服务" 控制它的 Pod 的网络域。管理域的这个服务的格式为: 
         $(服务名称).$(命名空间).svc.cluster.local
其中 cluster.local 是集群域。 
一旦每个 Pod 创建成功,就会得到一个匹配的 DNS 子域,格式为: 
         $(pod 名称).$(所属服务的 DNS 域名)
其中所属服务由 StatefulSet 的 serviceName 域来设定。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐