clusterIP: None
selector:
app: nginx
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: “nginx”
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.9.1
ports:
- containerPort: 80
name: web
然后我们创建这个service和statefulset
[root@host1 statefulset]# kubectl create -f nginx-statefulset.yaml
service/nginx created
statefulset.apps/web created
[root@host1 statefulset]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 23h
nginx ClusterIP None 80/TCP 9s
[root@host1 statefulset]# kubectl get statefulset
NAME READY AGE
web 2/2 22s
[root@host1 statefulset]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 104s
web-1 1/1 Running 0 103s
StatefulSet给它所管理的所有的Pod的名字进行了编号,编号规则是:-;并且这些编号都是从0开始累加,与StatefulSet的每个Pod实例一一对应;这些Pod的创建也是严格按照编号顺序进行的。比如在web-0进入到running状态,并且Conditions为Ready之前,web-1一直会处于pending状态
使用kubectl exec命令进入到容器内部查看它们的hostname:
[root@host1 statefulset]# kubectl exec web-0 – sh -c ‘hostname’
web-0
[root@host1 statefulset]# kubectl exec web-1 – sh -c ‘hostname’
web-1
并且,就算Pod被删除后重建,重建Pod的网络标识也不会改变,通过这种方式,Kubernetes就可以成功地将Pod的拓扑状态按照Pod的“名字+编号”的方式固定下来,并且Kubernetes为每个Pod提供了一个固定且唯一的访问入口(这个Pod对应的DNS记录)。
StatefulSet控制器的主要作用之一,就是使用Pod模板创建Pod的时候,对它们进行编号,并且按照编号顺序逐一完成创建工作。当StatefulSet的控制循环发现Pod的实际状态和期望状态不一致的时候,需要新建或删除Pod进行调谐的时候,它会严格按照这些Pod编号的顺序,逐一完成这些操作。任何Pod的变化都会触发statefulset的滚动更新
存储管理
Kubernetes中PV和PVC的设计,类似于“接口”和“实现”的思想。PV和PVC的设计,使得StatefulSet对存储状态的管理成为了可能。
kind: StatefulSet
metadata:
name: web
spec:
serviceName: “nginx”
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.9.1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
storageClassName: rook-ceph-block
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
这里我们使用了Rook的ceph Flex Driver,关于rook的配置可以参考官方文档 https://rook.io/docs/rook/v1.1/ceph-block.html
然后我们创建这个Statefulset
[root@host1 statefulset]# kubectl create -f nginx-statefulset.yaml
statefulset.apps/web created
service/nginx created
[root@host1 statefulset]# kubectl get statefulset
NAME READY AGE
web 2/2 8s
[root@host1 statefulset]# kubectl get statefulset
NAME READY AGE
web 2/2 10s
[root@host1 statefulset]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test-projected-volume 1/1 Running 1 25h
web-0 1/1 Running 0 13s
web-1 1/1 Running 0 11s
[root@host1 statefulset]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
www-web-0 Bound pvc-167033a6-f56a-11e9-9319-000c296c79f3 1Gi RWO rook-ceph-block 2m19s
www-web-1 Bound pvc-17bc7e66-f56a-11e9-9319-000c296c79f3 1Gi RWO rook-ceph-block 2m17s
当我们进入上述创建的Pod,在/usr/share/nginx/html中写入内容,即使Pod被删除重建,Volume中的内容仍不会丢失。这是怎么做到的?
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/587b58e38c8ddcfc8ed44c4b1f214b8b.jpeg)
线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识
一线互联网P7面试集锦+各种大厂面试集锦
学习笔记以及面试真题解析
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
务、框架、Spring相关知识
[外链图片转存中…(img-giqj34k0-1713529668094)]
一线互联网P7面试集锦+各种大厂面试集锦
[外链图片转存中…(img-VDlxQAb5-1713529668096)]
学习笔记以及面试真题解析
[外链图片转存中…(img-y98UUaUX-1713529668104)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!