实战-有状态应用部署-StatefulSet工作负载控制器(成功测试-博客输出)-20211004

image-20211004115638483

目录

写在前面

本文,我将带你实战演示k8s中关于pv与pvc存储类实验,帮你更深一步了解k8s中存储部分内容。

我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!

各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:

  1. 个人微信二维码:x2675263825 (舍得), qq:2675263825。

    image-20211002091450217

  2. 个人博客地址:www.onlyonexl.cn

    image-20211002092057988

  3. 个人微信公众号:云原生架构师实战

    image-20211002141739664

  4. 个人csdn

    https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

    image-20211002092344616

基础知识介绍

image-20211004130759214

image-20211004130816941

image-20211004130831195

image-20211004130845052

实验环境

实验环境:
1、win10,vmwrokstation虚机;
2、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点
   k8s version:v1.21
   CONTAINER-RUNTIME:docker://20.10.7

image-20211002143602812

特别注意:这里要预先配置好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/

image-20211004130241197

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

image-20210703100827037

image-20210703100838708

image-20210703100847093

2、apply下并查看

[root@k8s-master ~]# kubectl apply -f stateful.yaml
service/sts-nginx created
statefulset.apps/sts-web created

image-20210629150247514

查看pv,pvc情况:

[root@k8s-master ~]#kubectl get pv,pvc

image-20210629150422768

3、验证

1.sts编号与pvc之间的对应关系;sts编号标记启动顺序;sts编号-主机名;

查看pv,pvc情况:

[root@k8s-master ~]#kubectl get pv,pvc

image-20210629150422768

2.验证下本次pod是否是共享存储?=>每个pod都有自己唯一的存储。

进到sts-web-0 pod里,写入一个web0文件,到后端存储观察次测试文件会出现在哪个目录下:

image-20211004111417906

image-20211004111502530

再在sts-web-1后端存储目录里创建测试文件web1.html,再到其他2个后端存储目录观察是否会出现在其目录下?=>不会。

image-20211004111605708

再到sts-web1 pod网站更目录下观察是否存在web1.html?=>存在

image-20211004111643856

注意一下 pod的主机名:

image-20211004111714858

测试结束。

3.sts编号与网络身份验证

创建busybox测试镜像:

[root@k8s-master ~]#kubectl run dns-test --image=busybox:1.28.4 -- sleep 24h
pod/dns-test created

image-20211004112126207

删除当前所有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

image-20211004112157440

再把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

image-20211004112220349

我们现在来看下这2个应用之间的差异化在哪里?

image-20211004112242064

现在进到dns-test测试容器里,用nslookup命令进行测试:得出结论如下

image-20211004112308786

image-20211004112329148

实验到此结束。

总结

​ 好了,关于有状态应用部署-StatefulSet工作负载控制器实验就到这里了,感谢大家阅读,我们下期见!

image-20211004102016838

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值