×

Kubernetes 使用StatefulSet部署MySQL高可用集群

分類:互聯(lián)網(wǎng)熱點 編輯:聊聊云計算 瀏覽量:76
2020-07-13 16:55:23

MySQL簡介

MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件之一。MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),關(guān)系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫。

MySQL高可用方案

下文介紹的MySQL高可用方案采用“主從復(fù)制+讀寫分離”,即由單一的master和多個slave所構(gòu)成。其中,客戶端通過master對數(shù)據(jù)庫進行寫操作,通過slave端進行讀操作。master出現(xiàn)問題后,可以將應(yīng)用切換到slave端。 此方案是MySQL官方提供的一種高可用解決方案,節(jié)點間的數(shù)據(jù)同步采用MySQL Replication技術(shù)。MySQL Replication從一個MySQL數(shù)據(jù)庫服務(wù)器(master)的數(shù)據(jù)復(fù)制到一個或多個MySQL數(shù)據(jù)庫服務(wù)器(slave)。在默認情況下,復(fù)制是異步的;slave不需要一直接收來自主機的更新。根據(jù)配置,可以復(fù)制數(shù)據(jù)庫中的所有數(shù)據(jù)庫、選定的數(shù)據(jù)庫,或者特定的表。

預(yù)配置storageclass,實現(xiàn)nfs做存儲類的動態(tài)供給pv

1、安裝NFS服務(wù)器

#安裝NFS服務(wù)端,選擇k8s集群的master1節(jié)點(192.168.56.10)[root@k8s-master01 ~]# yum install nfs-utils -y (在所有節(jié)點安裝nfs-utils,并在node節(jié)點測試掛載)[root@k8s-master01 ~]# systemctl start nfs[root@k8s-master01 ~]# systemctl enable nfs#在master1上創(chuàng)建nfs共享目錄[root@k8s-master01 ~]# mkdir -p /data/v1[root@k8s-master01 ~]# chown -R 1000:1000 /data/v1[root@k8s-master01 ~]# vim /etc/exports/data/v1 192.168.56.0/24(rw,no_root_squash)[root@k8s-master01 ~]# exportfs -arv 使配置文件生效[root@k8s-master01 ~]# systemctl restart nfs[root@k8s-master01 data]# showmount -eExport list for k8s-master01:/data/v1 192.168.56.0/24#在node01和node02節(jié)點上安裝nfs-utils,并測試掛載[root@k8s-node01 ~]# yum install -y nfs-utils[root@k8s-node02 ~]# yum install -y nfs-utils[root@k8s-node01 ~]# mount -t nfs 192.168.56.10:/data/v1 /mnt[root@k8s-node01 ~]# mount......192.168.56.10:/data/v1 on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.56.11,local_lock=none,addr=192.168.56.10)[root@k8s-node01 ~]# umount /mnt/

2、實現(xiàn)nfs做storageclass存儲類的動態(tài)供給pv

創(chuàng)建運行nfs-provisioner的sa賬號

[root@k8s-master01 ~]# mkdir mysql && cd mysql/[root@k8s-master01 mysql]# vim serviceaccount.yamlapiVersion: v1kind: ServiceAccountmetadata: name: nfs-provisioner通過kubectl更新yaml文件 [root@k8s-master01 mysql]# kubectl apply -f serviceaccount.yamlserviceaccount/nfs-provisioner created[root@k8s-master01 mysql]# kubectl get saNAME SECRETS AGEdefault 1 4d18hnfs-provisioner 1 33s

對nfs-provisioner這個sa賬號做rbac授權(quán)

[root@k8s-master01 mysql]# vim rbac.yamlkind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: nfs-provisioner-runnerrules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "update", "patch"] - apiGroups: [""] resources: ["services", "endpoints"] verbs: ["get"] - apiGroups: ["extensions"] resources: ["podsecuritypolicies"] resourceNames: ["nfs-provisioner"] verbs: ["use"]---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: name: run-nfs-provisionersubjects: - kind: ServiceAccount name: nfs-provisioner namespace: defaultroleRef: kind: ClusterRole name: nfs-provisioner-runner apiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: leader-locking-nfs-provisionerrules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch", "create", "update", "patch"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: name: leader-locking-nfs-provisionersubjects: - kind: ServiceAccount name: nfs-provisioner namespace: defaultroleRef: kind: Role name: leader-locking-nfs-provisioner apiGroup: rbac.authorization.k8s.io通過kubectl更新yaml文件 [root@k8s-master01 mysql]# kubectl apply -f rbac.yamlclusterrole.rbac.authorization.k8s.io/nfs-provisioner-runner createdclusterrolebinding.rbac.authorization.k8s.io/run-nfs-provisioner createdrole.rbac.authorization.k8s.io/leader-locking-nfs-provisioner createdrolebinding.rbac.authorization.k8s.io/leader-locking-nfs-provisioner created[root@k8s-master01 mysql]# kubectl get rolebindingsNAME ROLE AGEleader-locking-nfs-provisioner Role/leader-locking-nfs-provisioner 36s

通過deployment創(chuàng)建pod用來運行nfs-provisioner

[root@k8s-master01 mysql]# vim deployment.yamlkind: DeploymentapiVersion: apps/v1metadata: name: nfs-provisionerspec: selector: matchLabels: app: nfs-provisioner replicas: 1 strategy: type: Recreate template: metadata: labels: app: nfs-provisioner spec: serviceAccount: nfs-provisioner containers: - name: nfs-provisioner image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner:latest imagePullPolicy: IfNotPresent volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: example.com/nfs - name: NFS_SERVER value: 192.168.56.10 - name: NFS_PATH value: /data/v1 volumes: - name: nfs-client-root nfs: server: 192.168.56.10 path: /data/v1通過kubectl更新yaml文件 [root@k8s-master01 mysql]# kubectl apply -f deployment.yamldeployment.apps/nfs-provisioner created[root@k8s-master01 mysql]# kubectl get podsNAME READY STATUS RESTARTS AGEnfs-provisioner-6dccbfd48f-p4cc4 1/1 Running 0 19s
注:上面yaml文件說明: - name: PROVISIONER_NAME value: example.com/nfs#PROVISIONER_NAME是example.com/nfs#example.com/nfs需要跟后面的storageclass的provisinoer保持一致 - name: NFS_SERVER value: 192.168.56.10 #這個需要寫nfs服務(wù)端所在的ip地址,大家需要寫自己的nfs地址 - name: NFS_PATH value: /data/v1 #這個是nfs服務(wù)端共享的目錄 volumes: - name: nfs-client-root nfs: server: 192.168.56.10 #nfs服務(wù)端ip path:/data/v1 #nfs服務(wù)端共享目錄
kubectl describe pod nfs-provisioner-6dccbfd48f-p4cc4 查看pod詳情kubectl logs -f nfs-provisioner-6dccbfd48f-p4cc4 查看pod日志、排錯

創(chuàng)建storageclass存儲類

[root@k8s-master01 mysql]# vim storageclass.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: nfsprovisioner: example.com/nfs注意:provisioner:example.com/nfs #該值需要和provisioner配置的保持一致通過kubectl更新yaml文件[root@k8s-master01 mysql]# kubectl apply -f storageclass.yaml storageclass.storage.k8s.io/nfs created[root@k8s-master01 mysql]# kubectl get scNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEnfs example.com/nfs Delete Immediate false 6s

MySQL高可用集群部署

1、創(chuàng)建ConfigMap

通過yaml文件創(chuàng)建名為mysql的ConfigMap

[root@k8s-master01 mysql]# vim mysql-configmap.yamlapiVersion: v1kind: ConfigMapmetadata: name: mysql labels: app: mysqldata: master.cnf: | log-bin log_bin_trust_function_creators=1 lower_case_table_names=1 slave.cnf: | super-read-only log_bin_trust_function_creators=1 通過kubectl更新yaml文件[root@k8s-master01 mysql]# kubectl apply -f mysql-configmap.yaml -n kube-publicconfigmap/mysql created[root@k8s-master01 mysql]# kubectl get configmap -n kube-publicNAME DATA AGEcluster-info 2 4d18hmysql 2 11s

2、創(chuàng)建Services

通過yaml文件創(chuàng)建兩個service,分別是 mysql 和 mysql-read

[root@k8s-master01 mysql]# vim mysql-service.yamlapiVersion: v1kind: Servicemetadata: name: mysql labels: app: mysqlspec: ports: - name: mysql port: 3306 clusterIP: None selector: app: mysql---apiVersion: v1kind: Servicemetadata: name: mysql-read labels: app: mysqlspec: ports: - name: mysql port: 3306 selector: app: mysql通過kubectl更新yaml文件[root@k8s-master01 mysql]# kubectl apply -f mysql-service.yaml -n kube-publicservice/mysql createdservice/mysql-read created[root@k8s-master01 mysql]# kubectl get svc -n kube-publicNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEmysql ClusterIP None 3306/TCP 6smysql-read ClusterIP 10.96.89.246 3306/TCP 6s
master、node節(jié)點下載測試的image鏡像docker pull registry.cn-hangzhou.aliyuncs.com/yangb/mysql5.7:latestdocker pull registry.cn-hangzhou.aliyuncs.com/test_k8s/xtrabackup:1.0docker tag registry.cn-hangzhou.aliyuncs.com/yangb/mysql5.7:latest mysql:5.7docker tag registry.cn-hangzhou.aliyuncs.com/test_k8s/xtrabackup:1.0 gcr.io/google-samples/xtrabackup:1.0

3、創(chuàng)建StatefulSet

通過yaml文件創(chuàng)建名為mysql的StatefulSet

[root@k8s-master01 mysql]# vim mysql-statefulset.yamlapiVersion: apps/v1kind: StatefulSetmetadata: name: mysqlspec: selector: matchLabels: app: mysql serviceName: mysql replicas: 3 volumeClaimTemplates: - metadata: name: data annotations: volume.beta.kubernetes.io/storage-class: "nfs" spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 10Gi template: metadata: labels: app: mysql spec: initContainers: - name: init-mysql image: mysql:5.7 command: - bash - "-c" - | set -ex [[ `hostname` =~ -(+)$ ]] || exit 1 ordinal=${BASH_REMATCH} echo > /mnt/conf.d/server-id.cnf echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf if [[ $ordinal -eq 0 ]]; then cp /mnt/config-map/master.cnf /mnt/conf.d/ else cp /mnt/config-map/slave.cnf /mnt/conf.d/ fi volumeMounts: - name: conf mountPath: /mnt/conf.d - name: config-map mountPath: /mnt/config-map - name: clone-mysql image: gcr.io/google-samples/xtrabackup:1.0 command: - bash - "-c" - | set -ex [[ -d /var/lib/mysql/mysql ]] && exit 0 [[ `hostname` =~ -(+)$ ]] || exit 1 ordinal=${BASH_REMATCH} [[ $ordinal -eq 0 ]] && exit 0 ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql xtrabackup --prepare --target-dir=/var/lib/mysql volumeMounts: - name: data mountPath: /var/lib/mysql subPath: mysql - name: conf mountPath: /etc/mysql/conf.d containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ALLOW_EMPTY_PASSWORD value: "1" ports: - name: mysql containerPort: 3306 volumeMounts: - name: data mountPath: /var/lib/mysql subPath: mysql - name: conf mountPath: /etc/mysql/conf.d resources: requests: cpu: 500m memory: 1Gi livenessProbe: exec: command: ["mysqladmin", "ping"] initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 readinessProbe: exec: command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"] initialDelaySeconds: 5 periodSeconds: 2 timeoutSeconds: 1 - name: xtrabackup image: gcr.io/google-samples/xtrabackup:1.0 ports: - name: xtrabackup containerPort: 3307 command: - bash - "-c" - | set -ex cd /var/lib/mysql if [[ -f xtrabackup_slave_info ]]; then mv xtrabackup_slave_info change_master_to.sql.in rm -f xtrabackup_binlog_info elif [[ -f xtrabackup_binlog_info ]]; then [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[ ]]+(.*?)$ ]] || exit 1 rm xtrabackup_binlog_info echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH}',\ MASTER_LOG_POS=${BASH_REMATCH}" > change_master_to.sql.in fi if [[ -f change_master_to.sql.in ]]; then echo "Waiting for mysqld to be ready (accepting connections)" until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; done echo "Initializing replication from clone position" mv change_master_to.sql.in change_master_to.sql.orig mysql -h 127.0.0.1 <
在啟動后,應(yīng)該能夠看到如下的信息:[root@k8s-master01 mysql]# kubectl get pods -lapp=mysql --watch -n kube-publicNAME READY STATUS RESTARTS AGEmysql-0 2/2 Running 0 16mmysql-1 2/2 Running 1 15mmysql-2 2/2 Running 1 15m[root@k8s-master01 mysql]# kubectl get pod -o wide -n kube-publicNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmysql-0 2/2 Running 0 16m 10.244.2.12 k8s-node02 mysql-1 2/2 Running 1 15m 10.244.1.13 k8s-node01 mysql-2 2/2 Running 1 15m 10.244.1.14 k8s-node01

MySQL部署環(huán)境驗證

1)通過運行一個臨時的容器(使用mysql:5.7鏡像),使用 MySQL 客戶端發(fā)送測試請求給 mysql master 節(jié)點( 主機名為 mysql-0.mysql;跨命名空間的話,主機名請使用 mysql-0.mysql.kube-public )

[root@k8s-master01 mysql]# kubectl run mysql-client --image=mysql:5.7 -it --rm --restart=Never -- mysql -h mysql-0.mysql.kube-publicIf you don't see a command prompt, try pressing enter.Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 625Server version: 5.7.16-log MySQL Community Server (GPL)Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.在master節(jié)點上創(chuàng)建demo數(shù)據(jù)庫,并創(chuàng)建一個只有message字段的demo.messages的表,并為message字段插入hello值。mysql> CREATE DATABASE demo;Query OK, 1 row affected (0.02 sec)mysql> CREATE TABLE demo.messages (message VARCHAR(250));Query OK, 0 rows affected (0.10 sec)mysql> INSERT INTO demo.messages VALUES ('hello');Query OK, 1 row affected (0.02 sec)

2)使用主機名為mysql-read來發(fā)送測試請求給服務(wù)器 (另開窗口)

[root@k8s-master01 mysql]# kubectl run mysql-client1 --image=mysql:5.7 -i -t --rm --restart=Never -- mysql -h mysql-read.kube-publicIf you don't see a command prompt, try pressing enter.Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 608Server version: 5.7.16 MySQL Community Server (GPL)Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;+------------------------+| Database |+------------------------+| information_schema || demo || mysql || performance_schema || sys || xtrabackup_backupfiles |+------------------------+6 rows in set (0.02 sec)mysql> select * from demo.messages;+---------+| message |+---------+| hello |+---------+1 row in set (0.00 sec)

滾動更新、擴展伸縮、更新策略、版本升級

RollingUpdate 更新策略在 StatefulSet 中實現(xiàn) Pod 的自動滾動更新。當(dāng)StatefulSet的 .spec.updateStrategy.type 設(shè)置為 RollingUpdate 時,默認為:RollingUpdate。StatefulSet 控制器將在 StatefulSet 中刪除并重新創(chuàng)建每個 Pod。它將以與 Pod 終止相同的順序進行(從最大的序數(shù)到最小的序數(shù)),每次更新一個 Pod。在更新其前身之前,它將等待正在更新的 Pod 狀態(tài)變成正在運行并就緒。

如下操作的滾動更新是有 mysql 2-0的順序更新。

master、node節(jié)點下載測試的image鏡像docker pull registry.cn-hangzhou.aliyuncs.com/chad/mysql-5.7.19:latestdocker tag registry.cn-hangzhou.aliyuncs.com/chad/mysql-5.7.19:latest mysql:5.7.19修改mysql image版本mysql:5.7.19[root@k8s-master01 mysql]# cp mysql-statefulset.yaml mysql-5.7.19-statefulset.yaml[root@k8s-master01 mysql]# vim mysql-5.7.19-statefulset.yamlo-v2.yaml..... image: mysql:5.7.19 image: mysql:5.7.19....通過kubectl更新yaml文件[root@k8s-master01 mysql]# kubectl apply -f mysql-5.7.19-statefulset.yaml -n kube-publicstatefulset.apps/mysql configured查看滾動更新的過程[root@k8s-master01 ~]# kubectl get pods -w -n kube-publicNAME READY STATUS RESTARTS AGEmysql-0 2/2 Running 0 64mmysql-1 2/2 Running 1 64mmysql-2 2/2 Running 1 63mmysql-2 2/2 Terminating 1 63mmysql-2 0/2 Terminating 1 64mmysql-2 0/2 Terminating 1 64mmysql-2 0/2 Terminating 1 64mmysql-2 0/2 Pending 0 0smysql-2 0/2 Pending 0 0smysql-2 0/2 Init:0/2 0 0smysql-2 0/2 Init:0/2 0 1smysql-2 0/2 Init:1/2 0 3smysql-2 0/2 PodInitializing 0 4smysql-2 1/2 Running 0 5smysql-2 2/2 Running 0 9smysql-1 2/2 Terminating 1 65mmysql-1 0/2 Terminating 1 65mmysql-1 0/2 Terminating 1 65mmysql-1 0/2 Terminating 1 65mmysql-1 0/2 Pending 0 0smysql-1 0/2 Pending 0 0smysql-1 0/2 Init:0/2 0 0smysql-1 0/2 Init:0/2 0 1smysql-1 0/2 Init:1/2 0 2smysql-1 0/2 PodInitializing 0 3smysql-1 1/2 Running 0 6smysql-1 2/2 Running 0 11smysql-0 2/2 Terminating 0 66mmysql-0 1/2 Terminating 0 66mmysql-0 0/2 Terminating 0 66mmysql-0 0/2 Terminating 0 67mmysql-0 0/2 Terminating 0 67mmysql-0 0/2 Pending 0 0smysql-0 0/2 Pending 0 0smysql-0 0/2 Init:0/2 0 0smysql-0 0/2 Init:0/2 0 1smysql-0 0/2 Init:1/2 0 3smysql-0 0/2 PodInitializing 0 7smysql-0 1/2 Running 0 9smysql-0 2/2 Running 0 13s
[root@k8s-master01 mysql]# kubectl get sts -o wide -n kube-public NAME READY AGE CONTAINERS IMAGESmysql 3/3 77m mysql,xtrabackup mysql:5.7.19,gcr.io/google-samples/xtrabackup:1.0擴容方法1:命令行,進行擴容[root@k8s-master01 mysql]# kubectl scale sts mysql --replicas=4 -n kube-publicstatefulset.apps/mysql scaled方法2:聲明式命令方式,直接修改stateful-demo-v2.yaml文件,進行擴容(推薦)[root@k8s-master01 mysql]# vim mysql-5.7.19-statefulset.yaml修改.spec.replicas的值spec: replicas: 4 [root@k8s-master01 mysql]# kubectl apply -f mysql-5.7.19-statefulset.yaml 方法3:補丁式命令方式,直接編輯運行中sts,進行擴容[root@k8s-master01 mysql]# kubectl edit sts mysql -n kube-public修改.spec.replicas的值spec: replicas: 4 方法4:補丁式命令方式,通過打補丁的方式,進行擴容[root@k8s-master01 mysql]# kubectl patch sts mysql -p '{"spec":{"replicas":4}}' -n kube-public 查看mysql pod動態(tài)擴容[root@k8s-master01 ~]# kubectl get pods -w -n kube-publicNAME READY STATUS RESTARTS AGEmysql-0 2/2 Running 0 16mmysql-1 2/2 Running 0 17mmysql-2 2/2 Running 0 17mmysql-3 0/2 Pending 0 0smysql-3 0/2 Pending 0 0smysql-3 0/2 Pending 0 2smysql-3 0/2 Init:0/2 0 2smysql-3 0/2 Init:0/2 0 4smysql-3 0/2 Init:1/2 0 5smysql-3 0/2 Init:1/2 0 6smysql-3 0/2 PodInitializing 0 27smysql-3 1/2 Error 0 28smysql-3 1/2 Running 1 29smysql-3 2/2 Running 1 34s查看mysql pod信息[root@k8s-master01 mysql]# kubectl get pod -n kube-public NAME READY STATUS RESTARTS AGEmysql-0 2/2 Running 0 16mmysql-1 2/2 Running 0 17mmysql-2 2/2 Running 0 17mmyapp-3 1/1 Running 0 102s查看pvc[root@k8s-master01 mysql]# kubectl get pvc -n kube-publicNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEdata-mysql-0 Bound pvc-fba11f83-cf29-4b76-b66a-3a58f91738a9 10Gi RWO nfs 93mdata-mysql-1 Bound pvc-6c434fb2-1076-4912-80fb-eee6c0e3b957 10Gi RWO nfs 93mdata-mysql-2 Bound pvc-d33d34dd-a80f-41bd-82d0-58f7126fed13 10Gi RWO nfs 92mdata-mysql-3 Bound pvc-202370f2-a2aa-456c-8cb0-81686a4ea39e 10Gi RWO nfs 11m查看pv[root@k8s-master01 mysql]# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpvc-202370f2-a2aa-456c-8cb0-81686a4ea39e 10Gi RWO Delete Bound kube-public/data-mysql-3 nfs 11mpvc-6c434fb2-1076-4912-80fb-eee6c0e3b957 10Gi RWO Delete Bound kube-public/data-mysql-1 nfs 92mpvc-d33d34dd-a80f-41bd-82d0-58f7126fed13 10Gi RWO Delete Bound kube-public/data-mysql-2 nfs 92mpvc-fba11f83-cf29-4b76-b66a-3a58f91738a9 10Gi RWO Delete Bound kube-public/data-mysql-0 nfs 93m縮容方法1:命令行,進行縮容[root@k8s-master01 mysql]# kubectl scale sts mysql --replicas=3 -n kube-publicstatefulset.apps/mysql scaled查看mysql pod動態(tài)縮容[root@k8s-master01 ~]# kubectl get pods -w -n kube-publicNAME READY STATUS RESTARTS AGEmysql-0 2/2 Running 0 31mmysql-1 2/2 Running 0 32mmysql-2 2/2 Running 0 32mmysql-3 2/2 Running 1 16mmysql-3 2/2 Terminating 1 16mmysql-3 0/2 Terminating 1 16mmysql-3 0/2 Terminating 1 16mmysql-3 0/2 Terminating 1 16m查看mysql pod信息[root@k8s-master01 mysql]# kubectl get pod -n kube-publicNAME READY STATUS RESTARTS AGEmysql-0 2/2 Running 0 33mmysql-1 2/2 Running 0 34mmysql-2 2/2 Running 0 34m查看pvc (pod刪除,pv和pvc 關(guān)聯(lián)還在,方便后續(xù)動態(tài)擴容,自動掛載原pvc和pv)[root@k8s-master01 mysql]# kubectl get pvc -n kube-publicNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEdata-mysql-0 Bound pvc-fba11f83-cf29-4b76-b66a-3a58f91738a9 10Gi RWO nfs 100mdata-mysql-1 Bound pvc-6c434fb2-1076-4912-80fb-eee6c0e3b957 10Gi RWO nfs 100mdata-mysql-2 Bound pvc-d33d34dd-a80f-41bd-82d0-58f7126fed13 10Gi RWO nfs 99mdata-mysql-3 Bound pvc-202370f2-a2aa-456c-8cb0-81686a4ea39e 10Gi RWO nfs 18m查看pv (pod刪除,pv和pvc 關(guān)聯(lián)還在,方便后續(xù)動態(tài)擴容,自動掛載原pvc和pv)[root@k8s-master01 mysql]# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpvc-202370f2-a2aa-456c-8cb0-81686a4ea39e 10Gi RWO Delete Bound kube-public/data-mysql-3 nfs 18mpvc-6c434fb2-1076-4912-80fb-eee6c0e3b957 10Gi RWO Delete Bound kube-public/data-mysql-1 nfs 100mpvc-d33d34dd-a80f-41bd-82d0-58f7126fed13 10Gi RWO Delete Bound kube-public/data-mysql-2 nfs 99mpvc-fba11f83-cf29-4b76-b66a-3a58f91738a9 10Gi RWO Delete Bound kube-public/data-mysql-0 nfs 100m查看nfs存儲目錄/data/v1 (pod刪除,數(shù)據(jù)還在)[root@k8s-master01 mysql]# ll /data/v1/total 0drwxrwxrwx 3 root root 19 Jul 8 11:00 kube-public-data-mysql-0-pvc-fba11f83-cf29-4b76-b66a-3a58f91738a9drwxrwxrwx 3 root root 19 Jul 8 11:00 kube-public-data-mysql-1-pvc-6c434fb2-1076-4912-80fb-eee6c0e3b957drwxrwxrwx 3 root root 19 Jul 8 11:01 kube-public-data-mysql-2-pvc-d33d34dd-a80f-41bd-82d0-58f7126fed13drwxrwxrwx 3 root root 19 Jul 8 12:22 kube-public-data-mysql-3-pvc-202370f2-a2aa-456c-8cb0-81686a4ea39e

往期文章

Kubernetes 是什么?

Kubernetes 組件

Kubernetes 基礎(chǔ)概念

Kubernetes 1.18.2集群部署 (單Master)+docker

Kubernetes 1.18.2集群部署 (多Master)+docker

Kubernetes Harbor v2.0.0私有鏡像倉庫部署-更新

Kubernetes kubectx/kubens切換context和namespace

Kubernetes 刪除namespace時卡在Terminating狀態(tài)

Kubernetes kubeadm初始化kubernetes集群延長證書過期時間

Kubernetes kubectl命令

Kubernetes 創(chuàng)建、更新應(yīng)用

Kubernetes 資源清單

Kubernetes Pod狀態(tài)和生命周期管理

Kubernetes Pod控制器

Kubernetes ReplicaSet控制器

Kubernetes Deployment控制器

Kubernetes DamonSet控制器

Kubernetes 服務(wù)發(fā)現(xiàn)Service

Kubernetes Nginx Ingress Controller

Kubernetes 存儲卷

Kubernetes 特殊存儲卷—Secret和ConfigMap

Kubernetes StatefulSet控制器

Kubernetes 認證、授權(quán)和準入控制

Kubernetes dashboard認證訪問

Kubernetes 網(wǎng)絡(luò)模型和網(wǎng)絡(luò)策略

Kubernetes 網(wǎng)絡(luò)原理解析

Kubernetes 網(wǎng)絡(luò)插件-flannel

Kubernetes 網(wǎng)絡(luò)插件-calico

Kubernetes Pod資源調(diào)度

Kubernetes 資源指標和集群監(jiān)控

Kubernetes 集群中部署Prometheus+Grafana+Alertmanager監(jiān)控告警系統(tǒng)

Kubernetes Prometheus監(jiān)控Nginx

Kubernetes Prometheus監(jiān)控MySQL

Kubernetes Prometheus監(jiān)控tomcat


聲明:免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請發(fā)

送郵件至:operations@xinnet.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時

需注明出處:新網(wǎng)idc知識百科

免費咨詢獲取折扣

Loading