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

收藏 打印