1.showmount -e在存储节点上查看挂载情况。kubectl apply -f pv-demo.yaml 在管理节点上通过pv资源文件声明资源。kubectl get pv获取pv资源信息。
[root@storage1 volumes]# showmount -e
Export list for storage1.example.com:
/data/volumes/v5 172.20.0.0/16
/data/volumes/v4 172.20.0.0/16
/data/volumes/v3 172.20.0.0/16
/data/volumes/v2 172.20.0.0/16
/data/volumes/v1 172.20.0.0/16
[root@master volumes]# kubectl apply -f pv-demo.yaml
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
persistentvolume/pv004 created
persistentvolume/pv005 created
[root@master volumes]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 2Gi RWO,RWX Retain Available 5s
pv002 2Gi RWO Retain Available 5s
pv003 2Gi RWO,RWX Retain Available 5s
pv004 4Gi RWO,RWX Retain Available 5s
pv005 4Gi RWO,RWX Retain Available 5s
2.vim stateful-demo.yaml编辑StatefulSet资源文件,这里要特别注意在volumeClaimTemplates:中storageClassName:的指定,必须与pv中的STORAGECLASS相对应,否则会出现 \" pod has unbound PersistentVolumeClaims \" 问题 。
[root@master manifests]# vim stateful-demo.yaml
[root@master manifests]# cat stateful-demo.yaml
apiVersion: v1
kind: Service
data:
name: myapp
labels:
app: myapp
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
data:
name: myapp
spec:
serviceName: myapp
replicas: 3
selector:
matchLabels:
app: myapp-pod
template:
data:
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:
- data:
name: myappdata
spec:
accessModes: [ \"ReadWriteOnce\" ]
storageClassName: \"\"
resources:
requests:
storage: 2Gi
3.kubectl apply -f stateful-demo.yaml 声明资源。kubectl get svc -o wide查看服务资源信息。kubectl get sts -o wide查看StatefulSet资源信息。kubectl get pvc -o wide查看pvc资源信息。kubectl get pv -o wide查看pv资源信息。kubectl get pod -o wide查看pod资源信息。
[root@master manifests]# kubectl apply -f stateful-demo.yaml
service/myapp created
statefulset.apps/myapp created
[root@master manifests]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d <none>
myapp ClusterIP None <none> 80/TCP 1m app=myapp-pod
[root@master manifests]# kubectl get sts -o wide
NAME DESIRED CURRENT AGE CONTAINERS IMAGES
myapp 3 3 2m myapp ikubernetes/myapp:v1
[root@master manifests]# kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myappdata-myapp-0 Bound pv002 2Gi RWO 3m
myappdata-myapp-1 Bound pv001 2Gi RWO,RWX 3m
myappdata-myapp-2 Bound pv003 2Gi RWO,RWX 3m
[root@master manifests]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 2Gi RWO,RWX Retain Bound default/myappdata-myapp-1 3h
pv002 2Gi RWO Retain Bound default/myappdata-myapp-0 3h
pv003 2Gi RWO,RWX Retain Bound default/myappdata-myapp-2 3h
pv004 4Gi RWO,RWX Retain Available 3h
pv005 4Gi RWO,RWX Retain Available 3h
[root@master manifests]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myapp-0 1/1 Running 0 4m 10.244.1.7 node1.example.com
myapp-1 1/1 Running 0 4m 10.244.2.98 node2.example.com
myapp-2 1/1 Running 0 4m 10.244.1.8 node1.example.com
4.kubectl delete -f stateful-demo.yaml 尝试删除statefulset资源。kubectl get pvc -o wide可以看到pvc资源是不删除的。kubectl apply -f stateful-demo.yaml 重新声明资源。kubectl get pod -w在另一个终端界面将上述过程动态输出。
[root@master manifests]# kubectl delete -f stateful-demo.yaml
service \"myapp\" deleted
statefulset.apps \"myapp\" deleted
[root@master manifests]# kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myappdata-myapp-0 Bound pv002 2Gi RWO 16m
myappdata-myapp-1 Bound pv001 2Gi RWO,RWX 16m
myappdata-myapp-2 Bound pv003 2Gi RWO,RWX 16m
[root@master manifests]# kubectl apply -f stateful-demo.yaml
service/myapp created
statefulset.apps/myapp created
[root@master ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
myapp-0 1/1 Running 0 15m
myapp-1 1/1 Running 0 15m
myapp-2 1/1 Running 0 15m
myapp-0 1/1 Terminating 0 16m
myapp-2 1/1 Terminating 0 16m
myapp-1 1/1 Terminating 0 16m
myapp-1 0/1 Terminating 0 16m
myapp-2 0/1 Terminating 0 16m
myapp-0 0/1 Terminating 0 16m
myapp-0 0/1 Terminating 0 16m
myapp-0 0/1 Terminating 0 16m
myapp-2 0/1 Terminating 0 16m
myapp-2 0/1 Terminating 0 16m
myapp-1 0/1 Terminating 0 16m
myapp-1 0/1 Terminating 0 16m
myapp-0 0/1 Pending 0 0s
myapp-0 0/1 Pending 0 0s
myapp-0 0/1 ContainerCreating 0 0s
myapp-0 1/1 Running 0 1s
myapp-1 0/1 Pending 0 0s
myapp-1 0/1 Pending 0 0s
myapp-1 0/1 ContainerCreating 0 0s
myapp-1 1/1 Running 0 1s
myapp-2 0/1 Pending 0 0s
myapp-2 0/1 Pending 0 0s
myapp-2 0/1 ContainerCreating 0 0s
myapp-2 1/1 Running 0 1s
5.kubectl exec -it myapp-0 -- /bin/sh进入pod交互界面。nslookup myapp-0在pod内部对pod名称可以进行解析(无法跨pod解析)。dig -t A myapp-0.myapp.default.svc.cluster.local @10.96.0.10在外部节点上也可以对pod名称进行解析。
[root@master manifests]# kubectl exec -it myapp-0 -- /bin/sh
/ # nslookup myapp-0
nslookup: can\'t resolve \'(null)\': Name does not resolve
Name: myapp-0
Address 1: 10.244.2.99 myapp-0.myapp.default.svc.cluster.local
/ # exit
[root@master manifests]# dig -t A myapp-0.myapp.default.svc.cluster.local @10.96.0.10
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A myapp-0.myapp.default.svc.cluster.local @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51804
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myapp-0.myapp.default.svc.cluster.local. IN A
;; ANSWER SECTION:
myapp-0.myapp.default.svc.cluster.local. 5 IN A 10.244.2.99
;; Query time: 1 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Mon Dec 17 02:26:04 EST 2018
;; MSG SIZE rcvd: 123
[root@master manifests]# dig -t A myapp-1.myapp.default.svc.cluster.local @10.96.0.10
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A myapp-1.myapp.default.svc.cluster.local @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7279
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myapp-1.myapp.default.svc.cluster.local. IN A
;; ANSWER SECTION:
myapp-1.myapp.default.svc.cluster.local. 5 IN A 10.244.1.9
;; Query time: 1 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Mon Dec 17 02:26:32 EST 2018
;; MSG SIZE rcvd: 123
[root@master manifests]# dig -t A myapp-2.myapp.default.svc.cluster.local @10.96.0.10
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A myapp-2.myapp.default.svc.cluster.local @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13895
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myapp-2.myapp.default.svc.cluster.local. IN A
;; ANSWER SECTION:
myapp-2.myapp.default.svc.cluster.local. 5 IN A 10.244.1.10
;; Query time: 1 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Mon Dec 17 02:26:42 EST 2018
;; MSG SIZE rcvd: 123
6.kubectl scale sts myapp --replicas=5增加资源的副本数量。kubectl get pvc -o wide查看pvc资源信息。kubectl patch sts myapp -p \'{\"spec\":{\"replicas\":2}}\'缩减资源的副本数量(也可以通过scale方法)。kubectl get pod -w在另一个终端界面将上述过程输出。
[root@master manifests]# kubectl scale sts myapp --replicas=5
statefulset.apps/myapp scaled
[root@master manifests]# kubectl get pvc -o wide
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myappdata-myapp-0 Bound pv002 2Gi RWO 35m
myappdata-myapp-1 Bound pv001 2Gi RWO,RWX 35m
myappdata-myapp-2 Bound pv003 2Gi RWO,RWX 34m
myappdata-myapp-3 Bound pv004 4Gi RWO,RWX 20s
myappdata-myapp-4 Bound pv005 4Gi RWO,RWX 19s
[root@master manifests]# kubectl patch sts myapp -p \'{\"spec\":{\"replicas\":2}}\'
statefulset.apps/myapp patched
[root@master ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
myapp-0 1/1 Running 0 16m
myapp-1 1/1 Running 0 16m
myapp-2 1/1 Running 0 16m
myapp-3 0/1 Pending 0 0s
myapp-3 0/1 Pending 0 0s
myapp-3 0/1 Pending 0 0s
myapp-3 0/1 ContainerCreating 0 0s
myapp-3 1/1 Running 0 1s
myapp-4 0/1 Pending 0 0s
myapp-4 0/1 Pending 0 0s
myapp-4 0/1 Pending 0 0s
myapp-4 0/1 ContainerCreating 0 0s
myapp-4 1/1 Running 0 2s
myapp-4 1/1 Terminating 0 2m
myapp-4 0/1 Terminating 0 2m
myapp-4 0/1 Terminating 0 2m
myapp-4 0/1 Terminating 0 2m
myapp-3 1/1 Terminating 0 2m
myapp-3 0/1 Terminating 0 2m
myapp-3 0/1 Terminating 0 2m
myapp-3 0/1 Terminating 0 2m
myapp-2 1/1 Terminating 0 20m
myapp-2 0/1 Terminating 0 20m
myapp-2 0/1 Terminating 0 20m
myapp-2 0/1 Terminating 0 20m
7.kubectl patch sts myapp -p \'{\"spec\":{\"replicas\":5}}\'将副本数量重新调整。kubectl patch sts myapp -p \'{\"spec\":{\"updateStrategy\":{\"rollingUpdate\":{\"partition\":4}}}}\'设置分区更新策略值(金丝雀更新)。kubectl describe sts myapp | grep -i partition获取statefulset资源的partition值。kubectl set image sts/myapp myapp=ikubernetes/myapp:v2对statefulset资源的镜像进行设置。kubectl get sts -o wide获取statefulset资源信息。kubectl get pods myapp-4 -o yaml | grep -i image查看最后一个pod的镜像信息(已经更新)。 kubectl get pods myapp-3 -o yaml | grep -i image查看倒数第二个pod的镜像信息(没有更新)。
[root@master manifests]# kubectl patch sts myapp -p \'{\"spec\":{\"replicas\":5}}\'
statefulset.apps/myapp patched
[root@master manifests]# kubectl patch sts myapp -p \'{\"spec\":{\"updateStrategy\":{\"rollingUpdate\":{\"partition\":4}}}}\'
statefulset.apps/myapp patched
[root@master manifests]# kubectl describe sts myapp | grep -i partition
Partition: 4
[root@master manifests]# kubectl set image sts/myapp myapp=ikubernetes/myapp:v2
statefulset.apps/myapp image updated
[root@master manifests]# kubectl get sts -o wide
NAME DESIRED CURRENT AGE CONTAINERS IMAGES
myapp 5 5 32m myapp ikubernetes/myapp:v2
[root@master manifests]# kubectl get pods myapp-4 -o yaml | grep -i image
- image: ikubernetes/myapp:v2
imagePullPolicy: IfNotPresent
image: ikubernetes/myapp:v2
imageID: docker-pullable://ikubernetes/myapp@sha256:85a2b81a62f09a414ea33b74fb8aa686ed9b168294b26b4c819df0be0712d358
[root@master manifests]# kubectl get pods myapp-3 -o yaml | grep -i image
- image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
image: ikubernetes/myapp:v1
imageID: docker-pullable://ikubernetes/myapp@sha256:9c3dc30b5219788b2b8a4b065f548b922a34479577befb54b03330999d30d513
8.kubectl patch sts myapp -p \'{\"spec\":{\"updateStrategy\":{\"rollingUpdate\":{\"partition\":0}}}}\'设置分区更新策略值(完全更新)。kubectl get pod -w将更新过程输出。kubectl get pods -o wide获取pod资源信息。curl 10.244.2.103/hostname.html可以访问pod。kubectl get pods myapp-0 -o yaml | grep -i image查看第一个pod的镜像信息(已经更新)。
[root@master manifests]# kubectl patch sts myapp -p \'{\"spec\":{\"updateStrategy\":{\"rollingUpdate\":{\"partition\":0}}}}\'
statefulset.apps/myapp patched
[root@master ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
myapp-0 1/1 Running 0 35m
myapp-1 1/1 Running 0 35m
myapp-2 1/1 Running 0 9m
myapp-3 1/1 Running 0 9m
myapp-4 1/1 Running 0 3m
myapp-3 1/1 Terminating 0 10m
myapp-3 0/1 Terminating 0 10m
myapp-3 0/1 Terminating 0 10m
myapp-3 0/1 Terminating 0 10m
myapp-3 0/1 Pending 0 0s
myapp-3 0/1 Pending 0 0s
myapp-3 0/1 ContainerCreating 0 0s
myapp-3 1/1 Running 0 1s
myapp-2 1/1 Terminating 0 10m
myapp-2 0/1 Terminating 0 10m
myapp-2 0/1 Terminating 0 10m
myapp-2 0/1 Terminating 0 10m
myapp-2 0/1 Pending 0 0s
myapp-2 0/1 Pending 0 0s
myapp-2 0/1 ContainerCreating 0 0s
myapp-2 1/1 Running 0 1s
myapp-1 1/1 Terminating 0 36m
myapp-1 0/1 Terminating 0 36m
myapp-1 0/1 Terminating 0 36m
myapp-1 0/1 Terminating 0 36m
myapp-1 0/1 Pending 0 0s
myapp-1 0/1 Pending 0 0s
myapp-1 0/1 ContainerCreating 0 0s
myapp-1 1/1 Running 0 1s
myapp-0 1/1 Terminating 0 36m
myapp-0 0/1 Terminating 0 36m
myapp-0 0/1 Terminating 0 36m
myapp-0 0/1 Terminating 0 36m
myapp-0 0/1 Pending 0 0s
myapp-0 0/1 Pending 0 0s
myapp-0 0/1 ContainerCreating 0 0s
myapp-0 1/1 Running 0 1s
[root@master manifests]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myapp-0 1/1 Running 0 1m 10.244.2.103 node2.example.com
myapp-1 1/1 Running 0 1m 10.244.1.16 node1.example.com
myapp-2 1/1 Running 0 1m 10.244.1.15 node1.example.com
myapp-3 1/1 Running 0 1m 10.244.2.102 node2.example.com
myapp-4 1/1 Running 0 5m 10.244.1.14 node1.example.com
[root@master manifests]# curl 10.244.2.103/hostname.html
myapp-0
[root@master manifests]# kubectl get pods myapp-0 -o yaml | grep -i image
- image: ikubernetes/myapp:v2
imagePullPolicy: IfNotPresent
image: ikubernetes/myapp:v2
imageID: docker-pullable://ikubernetes/myapp@sha256:85a2b81a62f09a414ea33b74fb8aa686ed9b168294b26b4c819df0be0712d358
继续阅读与本文标签相同的文章
众筹项目能否成功?用机器学习预测可以早知道
-
Python高级进阶#011 pyqt5按钮QPushButton应用
2026-05-18栏目: 教程
-
Apache Solr Velocity模版注入远程命令执行漏洞复线
2026-05-18栏目: 教程
-
从订货会的功能变迁看出版业的沧海桑田
2026-05-18栏目: 教程
-
ASP.NET Core on K8S深入学习(9)Secret & Configmap
2026-05-18栏目: 教程
-
【深度知识】Kafka原理入门和详解
2026-05-18栏目: 教程
