本次實驗是以前面的實驗為基礎,使用的是模擬使用kubernetes集群部署一個企業版的wordpress為實例進行研究學習,主要的過程如下:
1.mysql deployment部署, wordpress deployment部署, wordpress連接mysql時,mysql的 pod ip易變
2.為mysql創建 service,申請固定 service lp
3. wordpress外部可訪問,使用 node port類型的 service
4. nodeport類型的 service需要映射端口,不是很優雅
5.使用 ingressl
6.mysq1的pod旦被重新調度,數據就會丟失
7. hostpath將pod數據掛載至本地,然后使用標簽選擇器將mysq1lpod固定在一個節點上
8.共享存儲以持久化數據,即使po掛掉,被重新拉起,也能自動掛載存儲
本次實驗解決使用共享存儲數據持久化的問題實驗使用NFS作為共享存儲
一 使用NFS共享存儲
1.1 安裝NFS
再server3和server1上安裝nfs
[root@docker-server1 ~]# yum -y install nfs-utils
[root@docker-server3 ~]# yum -y install nfs-utils
[root@docker-server3 ~]# vi /etc/exports
/data *(rw,no_root_squash)
[root@docker-server3 ~]# systemctl restart nfs
[root@docker-server3 ~]# systemctl status nfs
[root@docker-server3 ~]# showmount -e
Export list for docker-server3: /data *
1.2 到server1上進行掛載測試
[root@docker-server1 ~]# mount -t nfs 192.168.132.133:/data /mnt
[root@docker-server1 ~]# df -hT
192.168.132.133:/data nfs4 47G 7.3G 40G 16% /mnt
[root@docker-server1 ~]# umount /mnt/
nfs配置成功
1.3 數據庫使用共享存儲掛載卷
[root@docker-server3 ~]# mkdir /data/mysql
[root@docker-server1 deployment]# vi mysql-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: mysql namespace: default spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: volumes: - name: mydata nfs: server: 192.168.132.133 path: /data/mysql containers: - name: mysql image: mysql:5.7 volumeMounts: - name: mydata mountPath: /var/lib/mysql ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: RedHat123 - name: MYSQL_DATABASE value: wordpress
[root@docker-server1 deployment]# kubectl get pods -o wide
mysql-857589b5d4-j65d2 1/1 Running 0 20s 10.244.2.20 192.168.132.133 <none>
[root@docker-server3 ~]# ll /data/mysql
-rw-r----- 1 polkitd ssh_keys 56 Jan 17 22:29 auto.cnf -rw------- 1 polkitd ssh_keys 1676 Jan 17 22:29 ca-key.pem -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 17 22:29 ca.pem -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 17 22:29 client-cert.pem -rw------- 1 polkitd ssh_keys 1680 Jan 17 22:29 client-key.pem -rw-r----- 1 polkitd ssh_keys 1346 Jan 17 22:29 ib_buffer_pool -rw-r----- 1 polkitd ssh_keys 79691776 Jan 17 22:29 ibdata1 -rw-r----- 1 polkitd ssh_keys 50331648 Jan 17 22:29 ib_logfile0 -rw-r----- 1 polkitd ssh_keys 50331648 Jan 17 22:29 ib_logfile1 -rw-r----- 1 polkitd ssh_keys 12582912 Jan 17 22:30 ibtmp1 drwxr-x--- 2 polkitd ssh_keys 4096 Jan 17 22:29 mysql drwxr-x--- 2 polkitd ssh_keys 8192 Jan 17 22:29 performance_schema -rw------- 1 polkitd ssh_keys 1680 Jan 17 22:29 private_key.pem -rw-r--r-- 1 polkitd ssh_keys 452 Jan 17 22:29 public_key.pem -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 17 22:29 server-cert.pem -rw------- 1 polkitd ssh_keys 1680 Jan 17 22:29 server-key.pem drwxr-x--- 2 polkitd ssh_keys 8192 Jan 17 22:29 sys drwxr-x--- 2 polkitd ssh_keys 20 Jan 17 22:29 wordpress
這樣,房mysql的pod是被刪除的時候,數據不會丟失
這種方式,可以滿足效果,但是當直接對接不同的存儲,需要使用不同的對接格式,對於K8S而言,不方便,所以使用PV的格式掛載,即不管使用哪一種存儲方式,最終創建一個PV出來,然后K8S直接掛載PV,不用關心底層是哪一種存儲
二 持久化卷(PV)
2.1 PV及PVC介紹
PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 提供了方便的持久化卷:PV 提供網絡存儲資源,而 PVC 請求存儲資源。這樣,設置持久化的工作流包括配置底層文件系統或者雲數據卷、創建持久性數據卷、最后創建 PVC 來將 Pod 跟數據卷關聯起來。PV 和 PVC 可以將 pod 和數據卷解耦,pod 不需要知道確切的文件系統或者支持它的持久化引擎。
PersistentVolume(PV)是集群之中的一塊網絡存儲。跟 Node 一樣,也是集群的資源。PV 跟 Volume (卷) 類似,不過會有獨立於 Pod 的生命周期
1.為了屏蔽 kubernetes對底層存儲的差異,有了個申明稱之為pv
2. pod在創建時,只需要聲明需要一個pV即可,這
3. 創建pv:
- 大小10G
- 獨享還是共享
- 從哪種存儲申請
4. 創建pvc:
- 大小20G
- 獨享還是共享
2.2 創建一個PV
基於NFS創建PV
[root@docker-server1 yamls]# mkdir /yamls/storage
[root@docker-server1 yamls]# cd /yamls/storage
[root@docker-server1 storage]# vim pv1.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: pv1 spec: capacity: storage: 1G accessModes: - ReadWriteMany nfs: server: 192.168.132.133 path: "/data"
[root@docker-server1 storage]# kubectl apply -f pv1.yaml
[root@docker-server1 storage]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 1G RWX Retain Available 23s
RECLAIM POLICY回收策略
PV的回收策略(persistentVolumeReclaimPolicy,即PVC釋放卷的時候PV該如何操作)也有三種
- Retain,不清理, 保留Volume(需要手動清理)
- Recycle,刪除數據,即rm -rf /thevolume/*(只有NFS和HostPath支持)
- Delete,刪除存儲資源,比如刪除AWS EBS卷(只有AWS EBS, GCE PD, Azure Disk和Cinder支持)
2.3 創建一個PVC
[root@docker-server1 storage]# vim pvc1.yaml
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc1 spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi
[root@docker-server1 storage]# kubectl apply -f pvc1.yaml
persistentvolumeclaim/pvc1 created
[root@docker-server1 storage]# kubectl get pvc -n kube-system
No resources found in kube-system namespace. #pvc只有在創建的命名空間看到
[root@docker-server1 storage]# kubectl get pv -n kube-system
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 1G RWX Retain Available 8m56s
[root@docker-server1 storage]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc1 Pending 2m8s
[root@docker-server1 storage]# kubectl describe pvc pvc1
Name: pvc1 Namespace: default StorageClass: Status: Pending Volume: Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"pvc1","namespace":"default"},"spec":{"accessModes":... Finalizers: [kubernetes.io/pvc-protection] Capacity: Access Modes: VolumeMode: Filesystem Mounted By: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal FailedBinding 7s (x15 over 3m22s) persistentvolume-controller no persistent volumes available for this claim and no storage class is set #沒有完全滿足的pv可以綁定
這是因為pv是1G,PVC申請的是1Gi,修改如下
[root@docker-server1 storage]# vi pvc1.yaml
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc1 spec: accessModes: - ReadWriteMany resources: requests: storage: 1G
pvc資源只能刪除重建
[root@docker-server1 storage]# kubectl delete pvc pvc1
persistentvolumeclaim "pvc1" deleted
[root@docker-server1 storage]# kubectl apply -f pvc1.yaml
persistentvolumeclaim/pvc1 created
[root@docker-server1 storage]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc1 Bound pv1 1G RWX 5s
已經綁定
[root@docker-server1 storage]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 1G RWX Retain Bound default/pvc1 16m
2.4 mysql使用pvc綁定
[root@docker-server3 ~]# mkdir /data/mysql11
apiVersion: v1 kind: PersistentVolume metadata: name: pv-rwo.yaml spec: capacity: storage: 10G accessModes: - ReadWriteOnce nfs: server: 192.168.132.133 path: "/data/mysql11"
[root@docker-server1 storage]# kubectl apply -f pv-rwo.yaml
[root@docker-server1 storage]# vi pvc-rwo.yaml
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-rwo spec: accessModes: - ReadWriteOnce resources: requests: storage: 10G
[root@docker-server1 storage]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-rwo Bound pv-rwo.yaml 10G RWO 6s pvc1 Bound pv1 1G RWX 10m
[root@docker-server1 storage]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-rwo.yaml 10G RWO Retain Bound default/pvc-rwo 101s pv1 1G RWX Retain Bound default/pvc1 24m
掛載到數據庫
[root@docker-server1 storage]# vim /yamls/deployment/mysql-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: mysql namespace: default spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: # volumes: # - name: mydata # nfs: # server: 192.168.132.133 # path: /data/mysql volumes: - name: mydata persistentVolumeClaim: claimName: pvc-rwo containers: - name: mysql image: mysql:5.7 volumeMounts: - name: mydata mountPath: /var/lib/mysql ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: RedHat123 - name: MYSQL_DATABASE value: wordpress
[root@docker-server1 storage]# kubectl apply -f /yamls/deployment/mysql-deployment.yaml
[root@docker-server3 ~]# ll /data/mysql11
total 188484 -rw-r----- 1 polkitd ssh_keys 56 Jan 18 00:46 auto.cnf -rw------- 1 polkitd ssh_keys 1676 Jan 18 00:46 ca-key.pem -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 18 00:46 ca.pem -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 18 00:46 client-cert.pem -rw------- 1 polkitd ssh_keys 1680 Jan 18 00:46 client-key.pem -rw-r----- 1 polkitd ssh_keys 1346 Jan 18 00:46 ib_buffer_pool -rw-r----- 1 polkitd ssh_keys 79691776 Jan 18 00:46 ibdata1 -rw-r----- 1 polkitd ssh_keys 50331648 Jan 18 00:46 ib_logfile0 -rw-r----- 1 polkitd ssh_keys 50331648 Jan 18 00:46 ib_logfile1 -rw-r----- 1 polkitd ssh_keys 12582912 Jan 18 00:46 ibtmp1 drwxr-x--- 2 polkitd ssh_keys 4096 Jan 18 00:46 mysql drwxr-x--- 2 polkitd ssh_keys 8192 Jan 18 00:46 performance_schema -rw------- 1 polkitd ssh_keys 1680 Jan 18 00:46 private_key.pem -rw-r--r-- 1 polkitd ssh_keys 452 Jan 18 00:46 public_key.pem -rw-r--r-- 1 polkitd ssh_keys 1112 Jan 18 00:46 server-cert.pem -rw------- 1 polkitd ssh_keys 1680 Jan 18 00:46 server-key.pem drwxr-x--- 2 polkitd ssh_keys 8192 Jan 18 00:46 sys drwxr-x--- 2 polkitd ssh_keys 20 Jan 18 00:46 wordpress
已經重建數據,則PV和PVC簡單學習到這里
博主聲明:本文的內容來源主要來自譽天教育晏威老師,由本人實驗完成操作驗證,需要的博友請聯系譽天教育(http://www.yutianedu.com/),獲得官方同意或者晏老師(https://www.cnblogs.com/breezey/)本人同意即可轉載,謝謝!