目录
文章目录
写在前面
本文,我将带你实战演示k8s中关于pv与pvc存储类实验,帮你更深一步了解k8s中存储部分内容。
我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!
各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:
-
个人微信二维码:x2675263825 (舍得), qq:2675263825。
-
个人博客地址:www.onlyonexl.cn
-
个人微信公众号:云原生架构师实战
-
个人csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
基础知识介绍
实验环境
实验环境:
1、win10,vmwrokstation虚机;
2、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点
k8s version:v1.21
CONTAINER-RUNTIME:docker://20.10.7
特别注意:这里要预先配置好nfs存储类服务!
具体如何配置nfs存储类,请看我的另一篇博客文章:
https://www.onlyonexl.cn/2021/09/21/36%20%E5%AE%9E%E6%88%98%EF%BC%9A%E7%BD%91%E7%BB%9C%E5%AD%98%E5%82%A8%E5%8D%B7NFS%E5%AE%9E%E9%AA%8C%E6%BC%94%E7%A4%BA(%E6%88%90%E5%8A%9F%E6%B5%8B%E8%AF%95-%E5%8D%9A%E5%AE%A2%E8%BE%93%E5%87%BA)-20210921/
1、复制官方示例代码并修改
参考文档:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
官方代码:
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: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
创建statful.yaml:(修改后的代码)
[root@k8s-master ~]#vim stateful.yaml
apiVersion: v1
kind: Service
metadata:
name: sts-nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None #注意这里
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sts-web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "sts-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
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ] #为每个pod创建一个独立的pv
storageClassName: "managed-nfs-storage"
resources:
requests:
storage: 1Gi
2、apply下并查看
[root@k8s-master ~]# kubectl apply -f stateful.yaml
service/sts-nginx created
statefulset.apps/sts-web created
查看pv,pvc情况:
[root@k8s-master ~]#kubectl get pv,pvc
3、验证
1.sts编号与pvc之间的对应关系;sts编号标记启动顺序;sts编号-主机名;
查看pv,pvc情况:
[root@k8s-master ~]#kubectl get pv,pvc
2.验证下本次pod是否是共享存储?=>每个pod都有自己唯一的存储。
进到sts-web-0 pod里,写入一个web0文件,到后端存储观察次测试文件会出现在哪个目录下:
再在sts-web-1后端存储目录里创建测试文件web1.html,再到其他2个后端存储目录观察是否会出现在其目录下?=>不会。
再到sts-web1 pod网站更目录下观察是否存在web1.html?=>存在
注意一下 pod的主机名:
测试结束。
3.sts编号与网络身份验证
创建busybox测试镜像:
[root@k8s-master ~]#kubectl run dns-test --image=busybox:1.28.4 -- sleep 24h
pod/dns-test created
删除当前所有pod,清空测试环境:
[root@k8s-master ~]#kubectl delete -f .
[root@k8s-master ~]#kubectl create deployment web --image=nginx #起一个nginx pod
[root@k8s-master ~]#kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
查看下当前的pod的label是不一样的,符合实验需要:
[root@k8s-master ~]#kubectl get pod --show-labels
再把web 这个应用扩容到3个副本:
[root@k8s-master ~]#kubectl scale deployment web --replicas=3
deployment.apps/web scaled
再把stateful.yaml给apply起来:
[root@k8s-master ~]#kubectl apply -f stateful.yaml
service/sts-nginx created
statefulset.apps/sts-web created
[root@k8s-master ~]#
现在相当于有2个应用:1个web,一个sts-web,各有3个副本。
[root@k8s-master ~]#kubectl get pod --show-labels
我们现在来看下这2个应用之间的差异化在哪里?
现在进到dns-test测试容器里,用nslookup命令进行测试:得出结论如下
实验到此结束。
总结
好了,关于有状态应用部署-StatefulSet工作负载控制器实验就到这里了,感谢大家阅读,我们下期见!