28-2kubernenets

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了28-2kubernenets相关的知识,希望对你有一定的参考价值。

5.持久化存储

5.1pv,pvc

k8s中的副本控制器保证了pod的始终存储,却保证不了pod中的数据。只有启动一个新pod的,之前pod中的数据会随着容器的删掉而丢失!

pv和pvc的概念:
PersistentVolume(一些简称PV):由管理员添加的的一个存储的描述,是一个全局资源,包含存储的类型,存储的大小和访问模式等。它的生命周期独立于Pod,例如当使用它的Pod销毁时对PV没有影响。

PersistentVolumeClaim(一些简称PVC):是Namespace里的资源,描述对PV的一个请求。请求信息包含存储大小,访问模式等。
#1.所有节点安装nfs-utils
[root@k8s-master ~]# yum install -y nfs-utils

#2.master配置nfs服务端
[root@k8s-master ~]#yum install -y rpcbind
[root@k8s-master ~]# vim /etc/exports
[root@k8s-master ~]# systemctl restart nfs
[root@k8s-master ~]# cat /etc/exports
/data 10.0.0.0/24(rw,async,no_root_squash,no_all_squash)
[root@k8s-master ~]# 
创建挂载目录
[root@k8s-master volume]# mkdir -p /data/k8s

#3.node节点查看nfs挂载目录
[root@k8s-node1 ~]# showmount -e 10.0.0.11
Export list for 10.0.0.11:
/data 10.0.0.0/24
[root@k8s-node2 ~]# showmount -e 10.0.0.11
Export list for 10.0.0.11:
/data 10.0.0.0/24
[root@k8s-node2 ~]# 
#启动nfs服务
所有节点systemctl start nfs
master节点
systemctl start rpcbind

#4.创建PV
## 4.1准备yml
[root@k8s-master volume]# cat test-py.yml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test
  labels:
    type: test
spec:
  capacity:
    storage: 10Gi 
  accessModes:
    - ReadWriteMany 
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path:  "/data/k8s"
    server: 10.0.0.11
    readOnly: false
[root@k8s-master volume]# cat test-py2.yml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test2
  labels:
    type: test
spec:
  capacity:
    storage: 5Gi 
  accessModes:
    - ReadWriteMany 
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path:  "/data/k8s"
    server: 10.0.0.11
    readOnly: false

##4.2创建pv
[root@k8s-master volume]# kubectl create -f test-py.yml 
persistentvolume "test" created

[root@k8s-master volume]# kubectl create -f test-py2.yml 
persistentvolume "test2" created

##4.3查看pv
[root@k8s-master volume]# kubectl get pv
NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     REASON    AGE
test      10Gi       RWX           Recycle         Available                       2m
test2     5Gi        RWX           Recycle         Available                       1m
[root@k8s-master volume]#

#5.创建pvc
##5.1准备yml
[root@k8s-master volume]# cat test-pvc.yml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
[root@k8s-master volume]# kubectl create test-pvc.yml 

##5.2创建pvc
[root@k8s-master volume]# kubectl create -f test-pvc.yml 
persistentvolumeclaim "nfs" created
[root@k8s-master volume]# 

##5.3查看,绑定在了test2这个pv上,选择容量够自己使用的pv
[root@k8s-master volume]# kubectl get pvc 
NAME      STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
nfs       Bound     test2     5Gi        RWX           30s
[root@k8s-master volume]# 

5.2持久化实战

#1.删除之前创建的内容
[root@k8s-master volume]# kubectl get all
NAME        REFERENCE                     TARGET    CURRENT   MINPODS   MAXPODS   AGE
hpa/myweb   ReplicationController/myweb   10%       0%        1         8         1h

NAME       DESIRED   CURRENT   READY     AGE
rc/myweb   1         1         1         1h

NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
svc/kubernetes   10.254.0.1   <none>        443/TCP   23h

NAME             READY     STATUS    RESTARTS   AGE
po/myweb-9khsv   1/1       Running   0          1h

[root@k8s-master volume]# kubectl delete hpa myweb
horizontalpodautoscaler "myweb" deleted
[root@k8s-master volume]# kubectl delete rc myweb
replicationcontroller "myweb" deleted
[root@k8s-master volume]# kubectl get all
NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
svc/kubernetes   10.254.0.1   <none>        443/TCP   23h
[root@k8s-master volume]# 

#2.tomcat-mysql实验的内容重新赋值一份,创建Pod
由于构建了nfs服务,所以tomcat-rc中 name: MYSQL_SERVICE_HOST value: ‘mysql‘ 可以直接使用svc的name。

[root@k8s-master k8s]# cp -r tomcat_demo tomcat_demo2
[root@k8s-master k8s]# cd tomcat_demo2/
[root@k8s-master tomcat_demo2]# ll
total 16
-rw-r--r-- 1 root root 416 Aug 29 13:42 mysql-rc.yml
-rw-r--r-- 1 root root 145 Aug 29 13:42 mysql-svc.yml
-rw-r--r-- 1 root root 483 Aug 29 13:42 tomcat-rc.yml
-rw-r--r-- 1 root root 162 Aug 29 13:42 tomcat-svc.yml
[root@k8s-master tomcat_demo2]# vim tomcat-rc.yml 
[root@k8s-master tomcat_demo2]# kubectl create -f .
replicationcontroller "mysql" created
service "mysql" created
replicationcontroller "myweb" created
service "myweb" created
[root@k8s-master tomcat_demo2]# kubectl get all
NAME       DESIRED   CURRENT   READY     AGE
rc/mysql   1         1         1         7s
rc/myweb   1         1         1         6s

NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
svc/kubernetes   10.254.0.1      <none>        443/TCP          23h
svc/mysql        10.254.81.140   <none>        3306/TCP         7s
svc/myweb        10.254.206.74   <nodes>       8080:30008/TCP   6s

NAME             READY     STATUS    RESTARTS   AGE
po/mysql-nq9r3   1/1       Running   0          7s
po/myweb-n8h93   1/1       Running   0          6s
[root@k8s-master tomcat_demo2]# 

#没有做持久化时,删除Pod,数据就没有了,因为pod会重新创建
#由于本项目只有数据库中保存数据,所以只对mysql做持久化
#3.创建pv,pvc
##3.1准备yml
[root@k8s-master tomcat_demo2]# mkdir -p /data/mysql
[root@k8s-master tomcat_demo2]# cat mysql-pv.yml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql
  labels:
    type: mysql
spec:
  capacity:
    storage: 10Gi 
  accessModes:
    - ReadWriteMany 
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path:  "/data/mysql"
    server: 10.0.0.11
    readOnly: false
[root@k8s-master tomcat_demo2]
[root@k8s-master tomcat_demo2]# cat mysql-pvc.yml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 9Gi
##3.2创建pv和PVC
[root@k8s-master tomcat_demo2]# kubectl create -f mysql-pv.yml 
persistentvolume "mysql" created
[root@k8s-master tomcat_demo2]# kubectl create -f mysql-pvc.yml 
persistentvolumeclaim "mysql" created
确保mysql pvc绑定在mysql pv上
[root@k8s-master tomcat_demo2]# kubectl get pv
NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM           REASON    AGE
mysql     10Gi       RWX           Recycle         Bound     default/mysql             26m
test2     5Gi        RWX           Recycle         Bound     default/nfs               46m
[root@k8s-master tomcat_demo2]# kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
mysql     Bound     mysql     10Gi       RWX           6m
nfs       Bound     test2     5Gi        RWX           42m
[root@k8s-master tomcat_demo2]# 

##3.3修改MySQL的rc.yml文件
[root@k8s-master tomcat_demo2]# cp mysql-rc.yml mysql-rc-pvc.yml
[root@k8s-master tomcat_demo2]# cat mysql-rc-pvc.yml
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: 10.0.0.11:5000/mysql:5.7
          ports:
          - containerPort: 3306
          env:
          - name: MYSQL_ROOT_PASSWORD
            value: ‘123456‘
          volumeMounts:
          - name: data
            mountPath: /var/lib/mysql
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: mysql

[root@k8s-master tomcat_demo2]# 
##3.4应用
[root@k8s-master tomcat_demo2]# kubectl apply -f mysql-rc-pvc.yml 
replicationcontroller "mysql" configured

##3.5删除现有的pod,自动新建的mysql pod会应用pvc
[root@k8s-master tomcat_demo2]# kubectl get all
NAME       DESIRED   CURRENT   READY     AGE
rc/mysql   1         1         1         15m
rc/myweb   1         1         1         15m

NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
svc/kubernetes   10.254.0.1      <none>        443/TCP          23h
svc/mysql        10.254.81.140   <none>        3306/TCP         15m
svc/myweb        10.254.206.74   <nodes>       8080:30008/TCP   15m

NAME             READY     STATUS    RESTARTS   AGE
po/mysql-nq9r3   1/1       Running   0          15m
po/myweb-n8h93   1/1       Running   0          15m
[root@k8s-master tomcat_demo2]# kubectl delete pod mysql-nq9r3
pod "mysql-nq9r3" deleted
[root@k8s-master tomcat_demo2]# 
[root@k8s-master tomcat_demo2]# kubectl get all -o wide
NAME       DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                       SELECTOR
rc/mysql   1         1         1         11m       mysql          10.0.0.11:5000/mysql:5.7       app=mysql
rc/myweb   1         1         1         36m       myweb          10.0.0.11:5000/tomcat-app:v2   app=myweb

NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE       SELECTOR
svc/kubernetes   10.254.0.1      <none>        443/TCP          1d        <none>
svc/mysql        10.254.81.140   <none>        3306/TCP         36m       app=mysql
svc/myweb        10.254.206.74   <nodes>       8080:30008/TCP   36m       app=myweb

NAME             READY     STATUS    RESTARTS   AGE       IP            NODE
po/mysql-tr6bc   1/1       Running   0          5m        172.16.48.3   k8s-node2
po/myweb-n8h93   1/1       Running   0          36m       172.16.79.2   k8s-node1

##3.6master上查看/data/mysql目录下是否有内容
##注意,这里如果看不到数据,可能有几种原因
1.你的mysql pvc没有绑定在mysql pv上
2.nfs服务是否运行正常,master端运行nfs和rpcbind服务,node端运行nfs服务

[root@k8s-master tomcat_demo2]# ll /data/mysql
total 188484
-rw-r----- 1 polkitd ssh_keys       56 Aug 29 14:14 auto.cnf
-rw------- 1 polkitd ssh_keys     1675 Aug 29 14:14 ca-key.pem
-rw-r--r-- 1 polkitd ssh_keys     1107 Aug 29 14:14 ca.pem
-rw-r--r-- 1 polkitd ssh_keys     1107 Aug 29 14:14 client-cert.pem
-rw------- 1 polkitd ssh_keys     1679 Aug 29 14:14 client-key.pem
drwxr-x--- 2 polkitd ssh_keys       58 Aug 29 14:14 HPE_APP
-rw-r----- 1 polkitd ssh_keys      699 Aug 29 14:20 ib_buffer_pool
-rw-r----- 1 polkitd ssh_keys 79691776 Aug 29 14:20 ibdata1
-rw-r----- 1 polkitd ssh_keys 50331648 Aug 29 14:20 ib_logfile0
-rw-r----- 1 polkitd ssh_keys 50331648 Aug 29 14:14 ib_logfile1
-rw-r----- 1 polkitd ssh_keys 12582912 Aug 29 14:20 ibtmp1
drwxr-x--- 2 polkitd ssh_keys     4096 Aug 29 14:14 mysql
drwxr-x--- 2 polkitd ssh_keys     8192 Aug 29 14:14 performance_schema
-rw------- 1 polkitd ssh_keys     1675 Aug 29 14:14 private_key.pem
-rw-r--r-- 1 polkitd ssh_keys      451 Aug 29 14:14 public_key.pem
-rw-r--r-- 1 polkitd ssh_keys     1107 Aug 29 14:14 server-cert.pem
-rw------- 1 polkitd ssh_keys     1675 Aug 29 14:14 server-key.pem
drwxr-x--- 2 polkitd ssh_keys     8192 Aug 29 14:14 sys
[root@k8s-master tomcat_demo2]# 

##3.7由于MySQL在node2节点上,所以在node2节点上查看挂载情况
[root@k8s-node2 ~]# df -h
Filesystem             Size  Used Avail Use% Mounted on
10.0.0.11:/data/mysql   98G   12G   87G  12% /var/lib/kubelet/pods/4539b360-ca24-11e9-90d0-000c29e15b21/volumes/kubernetes.io~nfs/mysql
overlay                 98G  3.4G   95G   4% /var/lib/docker/overlay2/5e84e1093fab4dce4ce314f8ce6cfbfb35e3af6428be837a2c40f617ab627561/merged
shm                     64M     0   64M   0% /var/lib/docker/containers/3324fee122006e54388c132976752343824fb7a91a438a0c5344e5fcdc0e917e/shm
overlay                 98G  3.4G   95G   4% /var/lib/docker/overlay2/0be4a6ee94804a6d0b8ff5f90874a11ec25ef02bdd6e878f901d5c671be75530/merged
[root@k8s-node2 ~]# 

##3.8测试删除Pod,新加的数据仍然存在
[root@k8s-master tomcat_demo2]# kubectl delete pod mysql-wz4ds
pod "mysql-wz4ds" deleted

技术图片

技术图片

5.3分布式文件系统glusterfs

nfs服务不方便扩容和管理,生产环境更多使用glusterfs
Glusterfs是一个开源分布式文件系统,具有强大的横向扩展能力,可支持数PB存储容量和数千客户端,通过网络互联成一个并行的网络文件系统。
具有可扩展性、高性能、高可用性等特点。
#1.安装glusterfs
所有节点:
yum install  centos-release-gluster -y
yum install  install glusterfs-server -y
systemctl start glusterd.service
systemctl enable glusterd.service
mkdir -p /gfs/test1
mkdir -p /gfs/test2

#2.master节点添加存储资源池
detach是删除节点
probe是添加节点
[root@k8s-master tomcat_demo2]# gluster pool list
UUID                    Hostname    State
e3966f16-295f-4dd4-99db-0facec4ad990    localhost   Connected 
[root@k8s-master tomcat_demo2]# gluster peer probe k8s-node1
peer probe: success. 
[root@k8s-master tomcat_demo2]# gluster peer probe k8s-node2
peer probe: success. 
[root@k8s-master tomcat_demo2]# gluster pool list
UUID                    Hostname    State
04afc91b-5c3d-4a07-a86f-e59288ae7ed2    k8s-node1   Connected 
234ac958-4da1-4ae1-ab72-df825026465d    k8s-node2   Connected 
e3966f16-295f-4dd4-99db-0facec4ad990    localhost   Connected 
[root@k8s-master tomcat_demo2]# 

#3.glusterfs卷管理
##3.1创建分布式复制卷使用最多,最稳定
由于复制-分布式,所以replica 2,最少需要4个目录,所以使用了master和node1上各两个
force是由于/gfs/test1目录再root分区下,建议在其他分区更加安全,所以不加force会创建失败。我这里就强制创建了
[root@k8s-master tomcat_demo2]#gluster volume create qiangge replica 2 k8s-master:/gfs/test1 k8s-master:/gfs/test2 k8s-node1:/gfs/test1 k8s-node1:/gfs/test2 force

##3.2启动卷
[root@k8s-master tomcat_demo2]# gluster volume start qiangge
volume start: qiangge: success

##3.3查看卷
[root@k8s-master tomcat_demo2]# gluster volume info qiangge 

Volume Name: qiangge
Type: Distributed-Replicate
Volume ID: 4ab2f3fb-ffcb-4213-8455-2f9ddf7b443a
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: k8s-master:/gfs/test1
Brick2: k8s-master:/gfs/test2
Brick3: k8s-node1:/gfs/test1
Brick4: k8s-node1:/gfs/test2
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
[root@k8s-master tomcat_demo2]# 

##3.4挂载卷
mount -t glusterfs 
10.0.0.11:任意一个节点
/qiangge 选择卷
/mnt 选择挂载点
[root@k8s-master tomcat_demo2]# mount -t glusterfs 10.0.0.11:/qiangge /mnt
容量为98G
[root@k8s-master tomcat_demo2]# df -h
10.0.0.11:/qiangge   98G   12G   87G  12% /mnt

##3.5分布式复制卷扩容
[root@k8s-master tomcat_demo2]# gluster volume add-brick qiangge k8s-node2:/gfs/test1 k8s-node2:/gfs/test2 force
volume add-brick: success

##3.6扩容后查看
[root@k8s-master tomcat_demo2]# gluster volume info qiangge

Volume Name: qiangge
Type: Distributed-Replicate
Volume ID: 4ab2f3fb-ffcb-4213-8455-2f9ddf7b443a
Status: Started
Snapshot Count: 0
Number of Bricks: 3 x 2 = 6
Transport-type: tcp
Bricks:
Brick1: k8s-master:/gfs/test1
Brick2: k8s-master:/gfs/test2
Brick3: k8s-node1:/gfs/test1
Brick4: k8s-node1:/gfs/test2
Brick5: k8s-node2:/gfs/test1
Brick6: k8s-node2:/gfs/test2
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
[root@k8s-master tomcat_demo2]# 
容量变为了147G
[root@k8s-master tomcat_demo2]# df -h
10.0.0.11:/qiangge  147G   14G  134G  10% /mnt

##3.7往qiangge卷中写入数据
[root@k8s-master tomcat_demo2]# cd /mnt/
[root@k8s-master mnt]# cp /opt/k8s/jenkins-k8s/xiaoniaofeifei.zip .
[root@k8s-master mnt]# ll
total 89
-rw-r--r-- 1 root root 91014 Aug 29 15:02 xiaoniaofeifei.zip
[root@k8s-master mnt]# unzip xiaoniaofeifei.zip 
Archive:  xiaoniaofeifei.zip
  inflating: sound1.mp3              
   creating: img/
  inflating: img/bg1.jpg             
  inflating: img/bg2.jpg             
  inflating: img/number1.png         
  inflating: img/number2.png         
  inflating: img/s1.png              
  inflating: img/s2.png              
  inflating: 21.js                   
  inflating: 2000.png                
  inflating: icon.png                
  inflating: index.html    

#master节点上查看  
[root@k8s-master mnt]# tree /gfs/
/gfs/
├── test1
│?? ├── 2000.png
│?? ├── 21.js
│?? ├── icon.png
│?? ├── img
│?? │?? ├── number1.png
│?? │?? ├── number2.png
│?? │?? └── s1.png
│?? ├── index.html
│?? ├── sound1.mp3
│?? └── xiaoniaofeifei.zip
└── test2
    ├── 2000.png
    ├── 21.js
    ├── icon.png
    ├── img
    │?? ├── number1.png
    │?? ├── number2.png
    │?? └── s1.png
    ├── index.html
    ├── sound1.mp3
    └── xiaoniaofeifei.zip

4 directories, 18 files
[root@k8s-master mnt]# ^C
[root@k8s-master mnt]# 

#node1节点上查看
[root@k8s-node1 ~]# tree /gfs/
/gfs/
├── test1
│?? └── img
│??     ├── bg1.jpg
│??     └── s2.png
└── test2
    └── img
        ├── bg1.jpg
        └── s2.png

4 directories, 4 files
[root@k8s-node1 ~]# 

#node2节点上查看
[root@k8s-node2 ~]# tree /gfs/
/gfs/
├── test1
│?? └── img
│??     └── bg2.jpg
└── test2
    └── img
        └── bg2.jpg

4 directories, 2 files
[root@k8s-node2 ~]# 

5.4k8s对接glusterfs

#1.创建endpoint
[root@k8s-master glusterfs]#vi  glusterfs-ep.yaml
apiVersion: v1
kind: Endpoints
metadata:
  name: glusterfs
  namespace: default
subsets:
- addresses:
  - ip: 10.0.0.11
  - ip: 10.0.0.12
  - ip: 10.0.0.13
  ports:
  - port: 49152
    protocol: TCP
[root@k8s-master glusterfs]# kubectl create -f glusterfs-ep.yaml 
endpoints "glusterfs" created
[root@k8s-master glusterfs]# kubectl get ep
NAME         ENDPOINTS                                         AGE
glusterfs    10.0.0.11:49152,10.0.0.12:49152,10.0.0.13:49152   12s
kubernetes   10.0.0.11:6443                                    1d
mysql        172.16.48.3:3306                                  1h
myweb        172.16.79.2:8080                                  1h
[root@k8s-master glusterfs]# 

#2.创建service
service与endpoint是通过name关联的,name要相同
[root@k8s-master glusterfs]# cat glusterfs-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: glusterfs
  namespace: default
spec:
  ports:
  - port: 49152
    protocol: TCP
    targetPort: 49152
  sessionAffinity: None
  type: ClusterIP

[root@k8s-master glusterfs]# 
[root@k8s-master glusterfs]# kubectl create -f glusterfs-svc.yaml 
service "glusterfs" created
[root@k8s-master glusterfs]# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
glusterfs    10.254.192.201   <none>        49152/TCP        9s
kubernetes   10.254.0.1       <none>        443/TCP          1d
mysql        10.254.81.140    <none>        3306/TCP         1h
myweb        10.254.206.74    <nodes>       8080:30008/TCP   1h
[root@k8s-master glusterfs]# 

#3.查看service与endpoint是否关联上
[root@k8s-master glusterfs]# kubectl describe svc glusterfs
Name:           glusterfs
Namespace:      default
Labels:         <none>
Selector:       <none>
Type:           ClusterIP
IP:         10.254.192.201
Port:           <unset> 49152/TCP
Endpoints:      10.0.0.11:49152,10.0.0.12:49152,10.0.0.13:49152
Session Affinity:   None
No events.
[root@k8s-master glusterfs]# 

#4.创建gluster类型pv
path: "qiangge"就是卷的名字,在搭建glusterfs的时候创建的
[root@k8s-master glusterfs]# cat gluster-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gluster
  labels:
    type: glusterfs
spec:
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs"
    path: "qiangge"
    readOnly: false

[root@k8s-master glusterfs]# 
[root@k8s-master glusterfs]# kubectl create -f gluster-pv.yml 
persistentvolume "gluster" created
[root@k8s-master glusterfs]# kubectl get pv
NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM           REASON    AGE
gluster   50Gi       RWX           Retain          Available                             10s
mysql     10Gi       RWX           Recycle         Bound       default/mysql             1h
test2     5Gi        RWX           Recycle         Bound       default/nfs               1h
[root@k8s-master glusterfs]# 

#5.创建pvc
[root@k8s-master glusterfs]# cat gluster-pvc.yml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: gluster
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
[root@k8s-master glusterfs]# kubectl create -f gluster-pvc.yml 
persistentvolumeclaim "gluster" created
[root@k8s-master glusterfs]# kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
gluster   Bound     gluster   50Gi       RWX           7s
mysql     Bound     mysql     10Gi       RWX           1h
nfs       Bound     test2     5Gi        RWX           1h
[root@k8s-master glusterfs]# 

#6.创建pod
[root@k8s-master glusterfs]# cat nginx_pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80
          hostPort: 80
      volumeMounts:
        - name: nfs-vol2
          mountPath: /usr/share/nginx/html
  volumes:
  - name: nfs-vol2
    persistentVolumeClaim:
      claimName: gluster

[root@k8s-master glusterfs]# 
[root@k8s-master glusterfs]# kubectl create -f nginx_pod.yaml 
pod "nginx" created

#查看在node2节点上
[root@k8s-master glusterfs]# kubectl get all -o wide
NAME       DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                       SELECTOR
rc/mysql   1         1         1         1h        mysql          10.0.0.11:5000/mysql:5.7       app=mysql
rc/myweb   1         1         1         1h        myweb          10.0.0.11:5000/tomcat-app:v2   app=myweb

NAME             CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE       SELECTOR
svc/glusterfs    10.254.192.201   <none>        49152/TCP        26m       <none>
svc/kubernetes   10.254.0.1       <none>        443/TCP          1d        <none>
svc/mysql        10.254.81.140    <none>        3306/TCP         1h        app=mysql
svc/myweb        10.254.206.74    <nodes>       8080:30008/TCP   1h        app=myweb

NAME             READY     STATUS    RESTARTS   AGE       IP            NODE
po/mysql-snhd1   1/1       Running   1          1h        172.16.48.3   k8s-node2
po/myweb-n8h93   1/1       Running   0          1h        172.16.79.2   k8s-node1
po/nginx         1/1       Running   0          1m        172.16.48.2   k8s-node2

技术图片

6.k8s的持续发布

技术图片

6.1安装gitlab

内存至少要2G呀,要不卡到502呀!
#1.node2安装gitlab
[root@k8s-node2 jenkins-k8s]#wget  https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.9.11-ce.0.el7.x86_64.rpm
[root@k8s-node2 jenkins-k8s]#yum localinstall  gitlab-ce-11.9.11-ce.0.el7.x86_64.rpm  -y
配置gitlab
[root@k8s-node2 jenkins-k8s]#vim /etc/gitlab/gitlab.rb
13行 external_url ‘http://10.0.0.13‘
1535行 prometheus_monitoring[‘enable‘] = false
启动gitlab
[root@k8s-node2 jenkins-k8s]#gitlab-ctl reconfigure
访问gitlab
http://10.0.0.13

密码为12345678

技术图片
技术图片
技术图片
技术图片

6.2gitlab创建仓库并上传代码

#2.gitlab创建仓库并上传代码
##2.1准备文件
[root@k8s-node2 jenkins-k8s]# mkdir /opt/xiaoniao
[root@k8s-node2 jenkins-k8s]# cd /opt/xiaoniao/
[root@k8s-node2 xiaoniao]# cp /opt/jenkins-k8s/xiaoniaofeifei.zip .
[root@k8s-node2 xiaoniao]# unzip xiaoniaofeifei.zip 
Archive:  xiaoniaofeifei.zip
  inflating: sound1.mp3              
   creating: img/
  inflating: img/bg1.jpg             
  inflating: img/bg2.jpg             
  inflating: img/number1.png         
  inflating: img/number2.png         
  inflating: img/s1.png              
  inflating: img/s2.png              
  inflating: 21.js                   
  inflating: 2000.png                
  inflating: icon.png                
  inflating: index.html              
[root@k8s-node2 xiaoniao]# ll
total 232
-rw-r--r-- 1 root root 15329 Aug  2  2014 2000.png
-rw-r--r-- 1 root root 51562 Aug  2  2014 21.js
-rw-r--r-- 1 root root   254 Aug  2  2014 icon.png
drwxr-xr-x 2 root root   102 Aug  8  2014 img
-rw-r--r-- 1 root root  3049 Aug  2  2014 index.html
-rw-r--r-- 1 root root 63008 Aug  2  2014 sound1.mp3
-rw-r--r-- 1 root root 91014 Aug 29 16:54 xiaoniaofeifei.zip
[root@k8s-node2 xiaoniao]# rm -rf xiaoniaofeifei.zip 
[root@k8s-node2 xiaoniao]# 

##2.2gitlab创建仓库并上传代码

[root@k8s-node2 xiaoniao]# git config --global user.name "Administrator"
[root@k8s-node2 xiaoniao]# git config --global user.email admin@example.com
[root@k8s-node2 xiaoniao]# git init
Initialized empty Git repository in /opt/xiaoniao/.git/
[root@k8s-node2 xiaoniao]# git remote add origin http://10.0.0.13/root/xiaoniao.git
[root@k8s-node2 xiaoniao]# git push -u origin master
Username for ‘http://10.0.0.13‘: ^C
[root@k8s-node2 xiaoniao]# git add .
[root@k8s-node2 xiaoniao]# git commit -m "Initial commit"
[master (root-commit) 0212ea4] Initial commit
 11 files changed, 184 insertions(+)
 create mode 100644 2000.png
 create mode 100644 21.js
 create mode 100644 icon.png
 create mode 100644 img/bg1.jpg
 create mode 100644 img/bg2.jpg
 create mode 100644 img/number1.png
 create mode 100644 img/number2.png
 create mode 100644 img/s1.png
 create mode 100644 img/s2.png
 create mode 100644 index.html
 create mode 100644 sound1.mp3
[root@k8s-node2 xiaoniao]# git push -u origin master
Username for ‘http://10.0.0.13‘: root
Password for ‘http://root@10.0.0.13‘: 12345678
Counting objects: 14, done.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 88.15 KiB | 0 bytes/s, done.
Total 14 (delta 0), reused 0 (delta 0)
To http://10.0.0.13/root/xiaoniao.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
[root@k8s-node2 xiaoniao]# 

6.3安装jenkins并拉取代码

#1.node1上安装jenkins
##1.1安装jenkins
[root@k8s-node1 jenkins-k8s]# rpm -ivh jdk-8u102-linux-x64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:jdk1.8.0_102-2000:1.8.0_102-fcs  ################################# [100%]
Unpacking JAR files...
    tools.jar...
    plugin.jar...
    javaws.jar...
    deploy.jar...
    rt.jar...
    jsse.jar...
    charsets.jar...
    localedata.jar...
[root@k8s-node1 jenkins-k8s]# mkdir -p /app
[root@k8s-node1 jenkins-k8s]# tar xf apache-tomcat-8.0.27.tar.gz -C /app
[root@k8s-node1 jenkins-k8s]# rm -rf /app/apache-tomcat-8.0.27/webapps/*
[root@k8s-node1 jenkins-k8s]# mv jenkins.war /app/apache-tomcat-8.0.27/webapps/ROOT.war
[root@k8s-node1 jenkins-k8s]# 
##1.2jenkin的数据包
[root@k8s-node1 jenkins-k8s]# tar xf jenkin-data.tar.gz -C /root
[root@k8s-node1 jenkins-k8s]# ls /root/.jenkins/
config.xml                                     jenkins.install.UpgradeWizard.state             nodes                     updates
hudson.model.UpdateCenter.xml                  jenkins.model.JenkinsLocationConfiguration.xml  plugins                   userContent
hudson.plugins.git.GitTool.xml                 jenkins.telemetry.Correlator.xml                queue.xml                 users
identity.key.enc                               jobs                                            secret.key                workflow-libs
jenkins.install.InstallUtil.installingPlugins  logs                                            secret.key.not-so-secret
jenkins.install.InstallUtil.lastExecVersion    nodeMonitors.xml                                secrets
[root@k8s-node1 jenkins-k8s]# 
##1.3启动tomcat
[root@k8s-node1 jenkins-k8s]# /app/apache-tomcat-8.0.27/bin/startup.sh 
Using CATALINA_BASE:   /app/apache-tomcat-8.0.27
Using CATALINA_HOME:   /app/apache-tomcat-8.0.27
Using CATALINA_TMPDIR: /app/apache-tomcat-8.0.27/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /app/apache-tomcat-8.0.27/bin/bootstrap.jar:/app/apache-tomcat-8.0.27/bin/tomcat-juli.jar
Tomcat started.
[root@k8s-node1 jenkins-k8s]# netstat -antlp|grep 8080
tcp        0      0 10.0.0.12:48266         10.0.0.11:8080          ESTABLISHED 124115/kubelet      
tcp        0      0 10.0.0.12:49970         10.0.0.11:8080          ESTABLISHED 124115/kubelet      
tcp        0      0 10.0.0.12:42178         10.0.0.11:8080          ESTABLISHED 26169/kube-proxy    
tcp        0      0 10.0.0.12:42182         10.0.0.11:8080          ESTABLISHED 26169/kube-proxy    
tcp        0      0 10.0.0.12:44416         10.0.0.11:8080          ESTABLISHED 124115/kubelet      
tcp        0      0 10.0.0.12:48388         10.0.0.11:8080          ESTABLISHED 124115/kubelet      
tcp6       0      0 :::8080                 :::*                    LISTEN      60694/java          
[root@k8s-node1 jenkins-k8s]# 

admin/123456

技术图片

在jenkins上创建构建项目
#1.在node1上生成秘钥对
[root@k8s-node1 jenkins-k8s]# ssh-key
ssh-keygen   ssh-keyscan  
[root@k8s-node1 jenkins-k8s]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:BpstuSGo4XaoPG7u1uzVw07fmkuEm3yDdgQEKsnEtDQ root@k8s-node1
The key s randomart image is:
+---[RSA 2048]----+
|oE   ...         |
|+.+ . .          |
| = .  ..         |
|  ..   *o        |
|. . . *.So       |
|.o.  .+=*        |
|.+o. ..@ =       |
|++.o. + * +      |
|B=o.   . =o.     |
+----[SHA256]-----+
[root@k8s-node1 jenkins-k8s]# 

#2.复制公钥到github中
[root@k8s-node1 ~]# cat /root/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsZ08H1iFE2/Vwy8Rgx8hfUMuspYIh6TptlwbDd2vGANkLfJlVodhDRSpAeOI51i/VETR+7XJtMQ12AN5tM/s0tHNJxw8FptRJ8sOBcVxjkDjiq2BC5YPsJC6RUm2Ze64yu0wF+yr5yaya/mhOlC58Ri9qCR+1mAL6FZrN3Mi/3KEBeNU9Vuojpi2+Hd4MJt0Vnii+xps1ZlfdHCzynraeyzDDT5BTwuvwDx78HpwBSc3GKtH90AkkINOqPoyJmbG+YC1p7jhc6a9saRm2okNo5LYP/6xPi+XhKoVALmLl/iPJuL90a3Lmg2lgASrrBbtWa40jRh/PliWEh+oWexBj root@k8s-node1
[root@k8s-node1 ~]# 

技术图片
技术图片
技术图片
技术图片
技术图片

[root@k8s-node1 ~]# ll /root/.jenkins/workspace/xiaoniao/
total 140
-rw-r--r-- 1 root root 15329 Aug 29 19:04 2000.png
-rw-r--r-- 1 root root 51562 Aug 29 19:04 21.js
-rw-r--r-- 1 root root   254 Aug 29 19:04 icon.png
drwxr-xr-x 2 root root   102 Aug 29 19:04 img
-rw-r--r-- 1 root root  3049 Aug 29 19:04 index.html
-rw-r--r-- 1 root root 63008 Aug 29 19:04 sound1.mp3
[root@k8s-node1 ~]# 

技术图片

6.4构建docker镜像并测试

#1.构建docker镜像并测试

[root@k8s-node2 xiaoniao]# pwd
/opt/xiaoniao
[root@k8s-node2 xiaoniao]# ll
total 144
-rw-r--r-- 1 root root 15329 Aug  2  2014 2000.png
-rw-r--r-- 1 root root 51562 Aug  2  2014 21.js
-rw-r--r-- 1 root root    59 Aug 29 19:13 dockerfile
-rw-r--r-- 1 root root   254 Aug  2  2014 icon.png
drwxr-xr-x 2 root root   102 Aug  8  2014 img
-rw-r--r-- 1 root root  3049 Aug  2  2014 index.html
-rw-r--r-- 1 root root 63008 Aug  2  2014 sound1.mp3
[root@k8s-node2 xiaoniao]# cat dockerfile 
FROM 10.0.0.11:5000/nginx:1.13
ADD . /usr/share/nginx/html
[root@k8s-node2 xiaoniao]# vi  .dockerignore

#不要把dockerfile这个文件上传到容器中
[root@k8s-node2 xiaoniao]# cat .dockerignore 
dockerfile
[root@k8s-node2 xiaoniao]# 

#创建镜像
[root@k8s-node2 xiaoniao]# docker build -t xiaoniao:v1 .
Sending build context to Docker daemon 328.2 kB
Step 1/2 : FROM 10.0.0.11:5000/nginx:1.13
 ---> ae513a47849c
Step 2/2 : ADD . /usr/share/nginx/html
 ---> 7ac78e054c58
Removing intermediate container 3fe76618255c
Successfully built 7ac78e054c58
[root@k8s-node2 xiaoniao]# docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
xiaoniao                                v1                  7ac78e054c58        42 seconds ago      109 MB

#创建容器
[root@k8s-node2 xiaoniao]# docker run -d -p 88:80 xiaoniao:v1
ab6195eb8e19a0505ad8a4c41a9ea116fa962fd0a971bd4fb3fd37614e0c667b
[root@k8s-node2 xiaoniao]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
ab6195eb8e19        xiaoniao:v1         "nginx -g ‘daemon ..."   5 seconds ago       Up 4 seconds        0.0.0.0:88->80/tcp   competent_easley
[root@k8s-node2 xiaoniao]#

技术图片

#把新加的内容传到github上
[root@k8s-node2 xiaoniao]# git add .
[root@k8s-node2 xiaoniao]# git commit -m "first update"
[master 747d882] first update
 2 files changed, 3 insertions(+)
 create mode 100644 .dockerignore
 create mode 100644 dockerfile
[root@k8s-node2 xiaoniao]# git push -u origin master
Username for ‘http://10.0.0.13‘: root
Password for ‘http://root@10.0.0.13‘: 
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 377 bytes | 0 bytes/s, done.
Total 4 (delta 1), reused 0 (delta 0)
To http://10.0.0.13/root/xiaoniao.git
   0212ea4..747d882  master -> master
Branch master set up to track remote branch master from origin.
[root@k8s-node2 xiaoniao]# 

技术图片
技术图片
技术图片

#查看node1上workspace下的内容
[root@k8s-node1 ~]# ll /root/.jenkins/workspace/xiaoniao/
total 144
-rw-r--r-- 1 root root 15329 Aug 29 19:04 2000.png
-rw-r--r-- 1 root root 51562 Aug 29 19:04 21.js
-rw-r--r-- 1 root root    59 Aug 29 19:34 dockerfile
-rw-r--r-- 1 root root   254 Aug 29 19:04 icon.png
drwxr-xr-x 2 root root   102 Aug 29 19:04 img
-rw-r--r-- 1 root root  3049 Aug 29 19:04 index.html
-rw-r--r-- 1 root root 63008 Aug 29 19:04 sound1.mp3
[root@k8s-node1 ~]# 

6.5自动化构建docker镜像版本问题

使用jenkins环境变量
BUILD_ID

修改构建后脚本为
docker build  -t 10.0.0.11:5000/xiaoniao:v$BUILD_ID  .
docker push 10.0.0.11:5000/xiaoniao:v$BUILD_ID 

技术图片
技术图片

#查看私有仓库中的版本
[root@k8s-master ~]# ls /opt/myregistry/docker/registry/v2/repositories/xiaoniao/_manifests/tags/
v1  v3  v4  v5
[root@k8s-master ~]# 
#防止误操作立即构建,没有更新,就不上传新版本了

#!/bin/bash
if [ $GIT_PREVIOUS_SUCCESSFUL_COMMIT == $GIT_COMMIT ];then
     echo "no change,skip build"
     exit 0
else
     echo "git pull commmit id not equals to current commit id trigger build"
fi

技术图片
技术图片

[root@k8s-master ~]# ls /opt/myregistry/docker/registry/v2/repositories/xiaoniao/_manifests/tags/
v1  v3  v4  v5
[root@k8s-master ~]# 

6.6jenkins实现k8s应用的版本升级和回归

#1.k8s集群部署项目
#1.1创建deployment
[root@k8s-master ~]# kubectl run xiaoniao --image=10.0.0.11:5000/xiaoniao:v1 --replicas=2 --record 
deployment "xiaoniao" created
#--record 是为了查看历史记录
[root@k8s-master ~]# kubectl rollout history deployment 
deployments "xiaoniao"
REVISION    CHANGE-CAUSE
1       kubectl run xiaoniao --image=10.0.0.11:5000/xiaoniao:v1 --replicas=2 --record

[root@k8s-master ~]# 
#1.2查看,创建了两个副本
[root@k8s-master ~]# kubectl get all
NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/xiaoniao   2         2         2            2           2m

NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
svc/kubernetes   10.254.0.1   <none>        443/TCP   1d

NAME                    DESIRED   CURRENT   READY     AGE
rs/xiaoniao-562012648   2         2         2         2m

NAME                          READY     STATUS    RESTARTS   AGE
po/xiaoniao-562012648-jwk09   1/1       Running   0          2m
po/xiaoniao-562012648-px0fb   1/1       Running   0          2m
[root@k8s-master ~]# 
#1.3暴露端口,让外部访问
[root@k8s-master ~]# kubectl expose deployment xiaoniao --port=80 --type=NodePort
service "xiaoniao" exposed
[root@k8s-master ~]# kubectl get svc
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   10.254.0.1      <none>        443/TCP        1d
xiaoniao     10.254.10.198   <nodes>       80:32169/TCP   10s
[root@k8s-master ~]# 
#1.4访问
[root@k8s-master ~]# curl 10.0.0.12:32169|grep ‘小鸟‘
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3049  100  3049    0     0  1315k      0 --:--:-- --:--:-- --:--:-- 2977k
        <title>小鸟飞飞飞-文章库小游戏</title>
                    "tTitle": "小鸟飞飞飞-文章库小游戏",
            document.title = "我玩小鸟飞飞飞过了"+t+"关!你能超过洒家我吗?";
[root@k8s-master ~]# 

#2.k8s  版本升级和回滚
##2.1版本更新
[root@k8s-master ~]# kubectl set image deploy xiaoniao xiaoniao=10.0.0.11:5000/xiaoniao:v3
deployment "xiaoniao" image updated
[root@k8s-master ~]# kubectl set image deploy xiaoniao xiaoniao=10.0.0.11:5000/xiaoniao:v6
deployment "xiaoniao" image updated
##2.2查看历史版本
[root@k8s-master ~]# kubectl rollout history deployment xiaoniao
deployments "xiaoniao"
REVISION    CHANGE-CAUSE
1       kubectl run xiaoniao --image=10.0.0.11:5000/xiaoniao:v1 --replicas=2 --record
2       kubectl set image deploy xiaoniao xiaoniao=10.0.0.11:5000/xiaoniao:v3
3       kubectl set image deploy xiaoniao xiaoniao=10.0.0.11:5000/xiaoniao:v6

[root@k8s-master ~]#
##2.3回滚:
[root@k8s-master ~]# kubectl rollout undo deploy xiaoniao 
deployment "xiaoniao" rolled back

#3.jenkins实现一键k8s版本升级
修改构建执行shell脚本内容
if [ $GIT_PREVIOUS_SUCCESSFUL_COMMIT == $GIT_COMMIT ];then
     echo "no change,skip build"
     exit 0
else
     echo "git pull commmit id not equals to current commit id trigger build"
     docker build  -t 10.0.0.11:5000/xiaoniao:v$BUILD_ID  .
     docker push 10.0.0.11:5000/xiaoniao:v$BUILD_ID
     kubectl -s 10.0.0.11:8080 set image deploy xiaoniao xiaoniao=10.0.0.11:5000/xiaoniao:v$BUILD_ID 
fi

技术图片

#更新git中内容测试

[root@k8s-node2 xiaoniao]# echo "jiu yao jie shu le">over.html
[root@k8s-node2 xiaoniao]# git add .
[root@k8s-node2 xiaoniao]# git commit -m "update"
[master 76930bb] update
 1 file changed, 1 insertion(+)
 create mode 100644 over.html
[root@k8s-node2 xiaoniao]# git push -u origin master
Username for ‘http://10.0.0.13‘: root
Password for ‘http://root@10.0.0.13‘: 
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 282 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://10.0.0.13/root/xiaoniao.git
   747d882..76930bb  master -> master
Branch master set up to track remote branch master from origin.
[root@k8s-node2 xiaoniao]# 

技术图片

[root@k8s-master ~]# kubectl get all -o wide
NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/xiaoniao   2         2         2            2           23m

NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE       SELECTOR
svc/kubernetes   10.254.0.1      <none>        443/TCP        1d        <none>
svc/xiaoniao     10.254.10.198   <nodes>       80:32169/TCP   19m       run=xiaoniao

NAME                     DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                     SELECTOR
rs/xiaoniao-1161273840   2         2         2         59s       xiaoniao       10.0.0.11:5000/xiaoniao:v9   pod-template-hash=1161273840,run=xiaoniao
rs/xiaoniao-562012648    0         0         0         23m       xiaoniao       10.0.0.11:5000/xiaoniao:v1   pod-template-hash=562012648,run=xiaoniao
rs/xiaoniao-711827946    0         0         0         16m       xiaoniao       10.0.0.11:5000/xiaoniao:v3   pod-template-hash=711827946,run=xiaoniao
rs/xiaoniao-783916636    0         0         0         8m        xiaoniao       10.0.0.11:5000/v7            pod-template-hash=783916636,run=xiaoniao
rs/xiaoniao-936550893    0         0         0         16m       xiaoniao       10.0.0.11:5000/xiaoniao:v6   pod-template-hash=936550893,run=xiaoniao

NAME                           READY     STATUS    RESTARTS   AGE       IP            NODE
po/xiaoniao-1161273840-28277   1/1       Running   0          58s       172.16.79.2   k8s-node1
po/xiaoniao-1161273840-r2ff1   1/1       Running   0          58s       172.16.48.3   k8s-node2

技术图片

回滚

技术图片
技术图片
技术图片

以上是关于28-2kubernenets的主要内容,如果未能解决你的问题,请参考以下文章