文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

docker中stateful控制器怎么用

2023-06-04 14:42

关注

这篇文章主要介绍了docker中stateful控制器怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

    在应用程序中,可以分为有状态应用和无状态应用。

    无状态的应用更关注于群体,任何一个成员都可以被取代。

    对有状态的应用是关注个体。

    像我们前面用deployment控制器管理的nginx、myapp等都属于无状态应用。

    像mysqlredis,zookeeper等都属于有状态应用,他们有的还有主从之分、先后顺序之分。

    statefulset控制器能实现有状态应用的管理,但实现起来也是非常麻烦的。需要把我们运维管理的过程写入脚本并注入到statefulset中才能使用。虽然互联网上有人做好了stateful的脚本,但是还是建议大家不要轻易的把redis、mysql等这样有状态的应用迁移到k8s上。

    在k8s中,statefulset主要管理一下特效的应用:

        a)、每一个Pod稳定且有唯一的网络标识符;

        b)、稳定且持久的存储设备;

        c)、要求有序、平滑的部署和扩展;

        d)、要求有序、平滑的终止和删除;

        e)、有序的滚动更新,应该先更新从节点,再更新主节点;

     statefulset由三个组件组成:

        a) headless service(无头的服务,即没名字);

        b)statefulset控制器

        c)volumeClaimTemplate(存储卷申请模板,因为每个pod要有专用存储卷,而不能共用存储卷)

[root@master ~]# kubectl explain sts   #stateful的简称
[root@master stateful]# cat stateful-demo.yaml apiVersion: v1kind: Servicemetadata:  name: myapp-svc  labels:    app: myapp-svcspec:  ports:  - port: 80    name: web  clusterIP: None  selector:    app: myapp-pod---apiVersion: apps/v1kind: StatefulSetmetadata:  name: myappspec:  serviceName: myapp-svc  replicas: 2  selector:    matchLabels:      app: myapp-pod  template:    metadata:      labels:        app: myapp-pod    spec:      containers:      - name: myapp        image: ikubernetes/myapp:v1        ports:        - containerPort: 80          name: web        volumeMounts:        - name: myappdata          mountPath: /usr/share/nginx/html  volumeClaimTemplates: #存储卷申请模板,可以为每个pod定义volume;可以为pod所在的名称空间自动创建pvc。  - metadata:      name: myappdata    spec:      accessModes: ["ReadWriteOnce"]      #storageClassName: "gluster-dynamic"      resources:        requests:          storage: 5Gi #2G的pvc
[root@master stateful]# kubectl apply -f stateful-demo.yaml service/myapp-svc unchangedstatefulset.apps/myapp created
[root@master stateful]# kubectl get svcNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGEmyapp-svc    ClusterIP   None            <none>        80/TCP              12m

    看到myapp-svc是无头服务。

[root@master stateful]# kubectl get stsNAME      DESIRED   CURRENT   AGEmyapp     2         2         6m
[root@master stateful]# kubectl get pvcNAME                STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGEmyappdata-myapp-0   Bound     pv002     2Gi        RWO                           3smyappdata-myapp-1   Bound     pv003     1Gi        RWO,RWX                       1s
[root@master stateful]# kubectl get pvNAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                       STORAGECLASS   REASON    AGEpv001     1Gi        RWO,RWX        Retain           Available                                                        1dpv002     2Gi        RWO            Retain           Bound       default/myappdata-myapp-0                            1dpv003     1Gi        RWO,RWX        Retain           Bound       default/myappdata-myapp-1                            1dpv004     1Gi        RWO,RWX        Retain           Bound       default/mypvc                                        1dpv005     1Gi        RWO,RWX        Retain           Available
[root@master stateful]# kubectl get podsNAME                             READY     STATUS             RESTARTS   AGEmyapp-0                          1/1       Running            0          4mmyapp-1                          1/1       Running            0          4m
[root@master stateful]# kubectl delete -f stateful-demo.yaml service "myapp-svc" deletedstatefulset.apps "myapp" deleted

    上面删除会使pod和service删除,但是pvc是不会删除,所以还能恢复。

[root@master stateful]# kubectl exec -it myapp-0 -- /bin/sh/ # nslookup myapp-0.myapp-svc.default.svc.cluster.localnslookup: can't resolve '(null)': Name does not resolveName:      myapp-0.myapp-svc.default.svc.cluster.localAddress 1: 10.244.1.110 myapp-0.myapp-svc.default.svc.cluster.local/ # / # / # nslookup myapp-1.myapp-svc.default.svc.cluster.localnslookup: can't resolve '(null)': Name does not resolveName:      myapp-1.myapp-svc.default.svc.cluster.localAddress 1: 10.244.2.97 myapp-1.myapp-svc.default.svc.cluster.local

     myapp-0.myapp-svc.default.svc.cluster.local

    格式为:pod_name.service_name.namespace.svc.cluster.local   

    下面扩展myapp pod为5个:

[root@master stateful]# kubectl scale sts myapp --replicas=5statefulset.apps/myapp scaled
[root@master stateful]# kubectl get podsNAME                             READY     STATUS             RESTARTS   AGEclient                           0/1       Error              0          17dmyapp-0                          1/1       Running            0          37mmyapp-1                          1/1       Running            0          37mmyapp-2                          1/1       Running            0          46smyapp-3                          1/1       Running            0          43smyapp-4                          0/1       Pending            0          41s
[root@master stateful]# kubectl get pvcNAME                STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGEmyappdata-myapp-0   Bound     pv002     2Gi        RWO                           52mmyappdata-myapp-1   Bound     pv003     1Gi        RWO,RWX                       52mmyappdata-myapp-2   Bound     pv005     1Gi        RWO,RWX                       2mmyappdata-myapp-3   Bound     pv001     1Gi        RWO,RWX                       2mmyappdata-myapp-4   Pending                                                      2m

    另外也可以用patch打补丁的方法来进行扩容和缩容:

[root@master stateful]# kubectl patch sts myapp -p '{"spec":{"replicas":2statefulset.apps/myapp patched

    下面我们再来介绍一下滚动更新。

[root@master stateful]# kubectl explain sts.spec.updateStrategy.rollingUpdate

    假设有4个pod(pod0,pod1,pod2,pod3),如果设置partition为5,那么说明大于等于5的pod更新,我们四个Pod就都不更新;如果partition为4,那么说明大于等于4的pod更新,即pod3更新,其他pod都不更新;如果partiton为3,那么说明大于等于3的pod更新,那么就是pod2和pod3更新,其他pod都不更新。

[root@master stateful]# kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}'statefulset.apps/myapp patched
[root@master stateful]# kubectl describe sts myappUpdate Strategy:    RollingUpdatePartition:        4

    下面把myapp升级为v2版本

[root@master stateful]# kubectl set image sts/myapp myapp=ikubernetes/myapp:v2statefulset.apps/myapp image updated
[root@master ~]# kubectl get sts -o wideNAME      DESIRED   CURRENT   AGE       CONTAINERS   IMAGESmyapp     2         2         1h        myapp        ikubernetes/myapp:v2
[root@master ~]# kubectl get pods myapp-4 -o yaml containerStatuses:  - containerID: docker://898714f2e5bf4f642e2a908e7da67eebf6d3074c89bbd0d798d191a2061a3115    image: ikubernetes/myapp:v2

    可以看到pod myapp-4使用的模板版本是v2了。

感谢你能够认真阅读完这篇文章,希望小编分享的“docker中stateful控制器怎么用”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯