k8s 之statefulset有状态应用
StatefulSet 由以下几个部分组成:
1. Headless Service:用来定义 pod 网路标识,生成可解析的 DNS 记录
2. volumeClaimTemplates:存储卷申请模板,创建 pvc,指定 pvc 名称大小,自动创建 pvc,且 pvc 由存储类供应。
3. StatefulSet:管理 pod 的
Headless service 不分配 clusterIP,headless service 可以通过解析 service 的 DNS,返回所 有 Pod 的 dns 和 ip 地址 (statefulSet 部署的 Pod 才有 DNS),普通的 service,只能通过解析 service 的 DNS 返回 service 的 ClusterIP。
在用 statefulset 管理 pod 时要求 pod 名称必须是有序的 ,每一个 pod 不能被随意取代,pod 重建后 pod 名称还是 一样的。因为 pod IP 是变化的,所以要用 Pod 名称来识别。pod 名称是 pod 唯一性的标识符, 必须持久稳定有效。这时候要用到无头服务,它可以给每个 Pod 一个唯一的名称。
解析
1 | <service name>.$<namespace name>.svc.cluster. local |
Statefulset 资源清单文件编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | [root@master-1 statefulset] # cat statefulset.yaml 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: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: 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 resources: requests: storage: 1Gi [root@master-1 statefulset] # kubectl apply -f statefulset.yaml service /nginx unchanged statefulset.apps /web created [root@master-1 statefulset] # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-014f93a3-c32a-4a67-8d89-5601c4ebc85c 1Gi RWX Delete Bound default /test-claim managed-nfs-storage 131m pvc-2f3fd42e-20bf-45a2-a743-36995db15701 2Gi RWO Delete Bound default /www-storage-1 managed-nfs-storage 33m pvc-4a77164b-ec51-4a0f-8070-4fc4721288c5 1Gi RWX Delete Bound default /test-claim1-1 managed-nfs-storage 130m pvc-4a8303f8-38fe-42f2-994b-ed4626d9ac5e 2Gi RWO Delete Bound default /www-storage-0 managed-nfs-storage 33m pvc-a7ea9d95-cd35-4e64-8a91-aadd0470a5c0 1Gi RWO Delete Bound default /www-web-1 managed-nfs-storage 3s pvc-c0aec411-f567-4926-b2a4-bf84883e9392 1Gi RWO Delete Bound default /www-web-0 managed-nfs-storage 14s [root@master-1 statefulset] # kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test -claim Bound pvc-014f93a3-c32a-4a67-8d89-5601c4ebc85c 1Gi RWX managed-nfs-storage 131m test -claim1-1 Bound pvc-4a77164b-ec51-4a0f-8070-4fc4721288c5 1Gi RWX managed-nfs-storage 130m www-storage-0 Bound pvc-4a8303f8-38fe-42f2-994b-ed4626d9ac5e 2Gi RWO managed-nfs-storage 33m www-storage-1 Bound pvc-2f3fd42e-20bf-45a2-a743-36995db15701 2Gi RWO managed-nfs-storage 33m www-web-0 Bound pvc-c0aec411-f567-4926-b2a4-bf84883e9392 1Gi RWO managed-nfs-storage 12s www-web-1 Bound pvc-a7ea9d95-cd35-4e64-8a91-aadd0470a5c0 1Gi RWO managed-nfs-storage 1s |
动态跟踪pod
1 | [root@master-1 statefulset] # kubectl get pods -l app=nginx -w |
循环查看主机名
1 2 3 | [root@master-1 statefulset] # for i in 0 1;do kubectl exec web-$i -- sh -c 'hostname';done web-0 web-1 |
进入pod 容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | [root@master-1 statefulset] # kubectl exec -it web-1 -c nginx -- /bin/sh # /bin/bash root@web-1:/ # apt install -y dnsutils Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: bind9-dnsutils bind9-host bind9-libs libedit2 libfstrm0 libjson-c5 liblmdb0 libmaxminddb0 libprotobuf-c1 libuv1 Suggested packages: mmdb-bin The following NEW packages will be installed: bind9-dnsutils bind9-host bind9-libs dnsutils libedit2 libfstrm0 libjson-c5 liblmdb0 libmaxminddb0 libprotobuf-c1 libuv1 0 upgraded, 11 newly installed, 0 to remove and 0 not upgraded. Need to get 2798 kB of archives. After this operation, 6269 kB of additional disk space will be used. Get:1 http: //deb .debian.org /debian bullseye /main amd64 libuv1 amd64 1.40.0-2 [132 kB] Get:2 http: //deb .debian.org /debian bullseye /main amd64 libfstrm0 amd64 0.6.0-1+b1 [21.5 kB] Get:3 http: //deb .debian.org /debian bullseye /main amd64 libjson-c5 amd64 0.15-2 [42.8 kB] Get:4 http: //deb .debian.org /debian bullseye /main amd64 liblmdb0 amd64 0.9.24-1 [45.0 kB] Get:5 http: //deb .debian.org /debian bullseye /main amd64 libmaxminddb0 amd64 1.5.2-1 [29.8 kB] Get:6 http: //deb .debian.org /debian bullseye /main amd64 libprotobuf-c1 amd64 1.3.3-1+b2 [27.0 kB] Get:7 http: //deb .debian.org /debian bullseye /main amd64 bind9-libs amd64 1:9.16.37-1~deb11u1 [1424 kB] Get:8 http: //deb .debian.org /debian bullseye /main amd64 bind9-host amd64 1:9.16.37-1~deb11u1 [308 kB] Get:9 http: //deb .debian.org /debian bullseye /main amd64 libedit2 amd64 3.1-20191231-2+b1 [96.7 kB] Get:10 http: //deb .debian.org /debian bullseye /main amd64 bind9-dnsutils amd64 1:9.16.37-1~deb11u1 [404 kB] Get:11 http: //deb .debian.org /debian bullseye /main amd64 dnsutils all 1:9.16.37-1~deb11u1 [267 kB] Fetched 2798 kB in 1s (3423 kB /s ) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libuv1:amd64. (Reading database ... 7826 files and directories currently installed.) Preparing to unpack ... /00-libuv1_1 .40.0-2_amd64.deb ... Unpacking libuv1:amd64 (1.40.0-2) ...........................................................................................................................................................................] Selecting previously unselected package libfstrm0:amd64......................................................................................................................................................] Preparing to unpack ... /01-libfstrm0_0 .6.0-1+b1_amd64.deb ... Unpacking libfstrm0:amd64 (0.6.0-1+b1) ......................................................................................................................................................................] Selecting previously unselected package libjson-c5:amd64.....................................................................................................................................................] Preparing to unpack ... /02-libjson-c5_0 .15-2_amd64.deb ... Unpacking libjson-c5:amd64 (0.15-2) .........................................................................................................................................................................] Selecting previously unselected package liblmdb0:amd64.......................................................................................................................................................] Preparing to unpack ... /03-liblmdb0_0 .9.24-1_amd64.deb ... Unpacking liblmdb0:amd64 (0.9.24-1) ... ########..............................................................................................................................................................] Selecting previously unselected package libmaxminddb0:amd64..................................................................................................................................................] Preparing to unpack ... /04-libmaxminddb0_1 .5.2-1_amd64.deb ... Unpacking libmaxminddb0:amd64 (1.5.2-1) ... ############......................................................................................................................................................] Selecting previously unselected package libprotobuf-c1:amd64.................................................................................................................................................] Preparing to unpack ... /05-libprotobuf-c1_1 .3.3-1+b2_amd64.deb ... Unpacking libprotobuf-c1:amd64 (1.3.3-1+b2) ... ################..............................................................................................................................................] Selecting previously unselected package bind9-libs:amd64. ##########..........................................................................................................................................] Preparing to unpack ... /06-bind9-libs_1 %3a9.16.37-1~deb11u1_amd64.deb ... Unpacking bind9-libs:amd64 (1:9.16.37-1~deb11u1) ... ####################.....................................................................................................................................] Selecting previously unselected package bind9-host. #########################.................................................................................................................................] Preparing to unpack ... /07-bind9-host_1 %3a9.16.37-1~deb11u1_amd64.deb ... Unpacking bind9-host (1:9.16.37-1~deb11u1) ... ##################################.............................................................................................................................] Selecting previously unselected package libedit2:amd64. #############################.........................................................................................................................] Preparing to unpack ... /08-libedit2_3 .1-20191231-2+b1_amd64.deb ... Unpacking libedit2:amd64 (3.1-20191231-2+b1) ... ########################################.....................................................................................................................] Selecting previously unselected package bind9-dnsutils. #####################################.................................................................................................................] Preparing to unpack ... /09-bind9-dnsutils_1 %3a9.16.37-1~deb11u1_amd64.deb ... Unpacking bind9-dnsutils (1:9.16.37-1~deb11u1) ... ##############################################.............................................................................................................] Selecting previously unselected package dnsutils. ####################################################........................................................................................................] Preparing to unpack ... /10-dnsutils_1 %3a9.16.37-1~deb11u1_all.deb ... Unpacking dnsutils (1:9.16.37-1~deb11u1) ... #############################################################....................................................................................................] Setting up liblmdb0:amd64 (0.9.24-1) ... #####################################################################................................................................................................] Setting up libmaxminddb0:amd64 (1.5.2-1) ... #########################################################################........................................................................................] Setting up libfstrm0:amd64 (0.6.0-1+b1) ... ###################################################################################...............................................................................] Setting up libedit2:amd64 (3.1-20191231-2+b1) ... #####################################################################################.......................................................................] Setting up libprotobuf-c1:amd64 (1.3.3-1+b2) ... ##############################################################################################...............................................................] Setting up libuv1:amd64 (1.40.0-2) ... ################################################################################################################.......................................................] Setting up libjson-c5:amd64 (0.15-2) ... #######################################################################################################################..............................................] Setting up bind9-libs:amd64 (1:9.16.37-1~deb11u1) ... ##################################################################################################################......................................] Setting up bind9-host (1:9.16.37-1~deb11u1) ... ################################################################################################################################..............................] Setting up bind9-dnsutils (1:9.16.37-1~deb11u1) ... #####################################################################################################################################.....................] Setting up dnsutils (1:9.16.37-1~deb11u1) ... ###################################################################################################################################################.............] Processing triggers for libc-bin (2.31-13+deb11u6) ... ##################################################################################################################################################.....] # statefulset中pod DNS 记录组成部分 statefulset名字-随机数.servicename.namespace(名称空间).svc.cluster.local. root@web-1:/ # nslookup web-0.nginx.default.svc.cluster.local. Server: 10.96.0.10 Address: 10.96.0.10 #53 Name: web-0.nginx.default.svc.cluster. local Address: 10.244.84.166 [root@master-1 statefulset] # kubectl get pods -o wide 查看pod 详细信息对比ip NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nfs-client-provisioner-7c7bf9f6bd-dp5h8 1 /1 Running 0 3h26m 10.244.84.156 node-1 <none> <none> nginx- test 1 /1 Running 4 105d 10.244.84.148 node-1 <none> <none> read -pod 1 /1 Running 0 173m 10.244.84.157 node-1 <none> <none> storage-0 1 /1 Running 0 75m 10.244.84.164 node-1 <none> <none> storage-1 1 /1 Running 0 75m 10.244.84.165 node-1 <none> <none> web-0 1 /1 Running 0 51m 10.244.84.166 node-1 <none> <none> web-1 1 /1 Running 0 51m 10.244.84.167 node-1 <none> <none> root@web-1:/ # apt install -y inetutils-ping Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: netbase The following NEW packages will be installed: inetutils- ping netbase 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Need to get 265 kB of archives. After this operation, 416 kB of additional disk space will be used. Get:1 http: //deb .debian.org /debian bullseye /main amd64 netbase all 6.3 [19.9 kB] Get:2 http: //deb .debian.org /debian bullseye /main amd64 inetutils- ping amd64 2:2.0-1+deb11u1 [245 kB] Fetched 265 kB in 0s (904 kB /s ) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package netbase. (Reading database ... 7917 files and directories currently installed.) Preparing to unpack ... /archives/netbase_6 .3_all.deb ... Unpacking netbase (6.3) ... ###########.......................................................................................................................................................................] Selecting previously unselected package inetutils- ping . ####..................................................................................................................................................] Preparing to unpack ... /inetutils-ping_2 %3a2.0-1+deb11u1_amd64.deb ... Unpacking inetutils- ping (2:2.0-1+deb11u1) ... ##################################.............................................................................................................................] Setting up netbase (6.3) ... #########################################################################........................................................................................................] Setting up inetutils- ping (2:2.0-1+deb11u1) ... ###############################################################################################...............................................................] root@web-1:/ # ping web-0.nginx.default.svc.cluster.local PING web-0.nginx.default.svc.cluster. local (10.244.84.166): 56 data bytes 64 bytes from 10.244.84.166: icmp_seq=0 ttl=63 time =0.150 ms 64 bytes from 10.244.84.166: icmp_seq=1 ttl=63 time =0.109 ms 64 bytes from 10.244.84.166: icmp_seq=2 ttl=63 time =0.073 ms ^C--- web-0.nginx.default.svc.cluster. local ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min /avg/max/stddev = 0.073 /0 .111 /0 .150 /0 .031 ms |
草都可以从石头缝隙中长出来更可况你呢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示