摘要:結(jié)束語(yǔ)本文揉合多項(xiàng)技術(shù),構(gòu)建了一個(gè)復(fù)雜且可做生產(chǎn)使用的范例,當(dāng)然,此庫(kù)是單實(shí)例數(shù)據(jù)庫(kù),倘若需構(gòu)建數(shù)據(jù)庫(kù)高可用方案,需部署如集群,其中自動(dòng)作業(yè)備份范例僅使用備份,在生產(chǎn)環(huán)境不是很實(shí)用,我們需要考慮使用備份以及備份日志。
文檔說(shuō)明
? 本文面向容器初學(xué)者,作者先簡(jiǎn)單的用MySQL官方鏡像搭建一個(gè)可運(yùn)行的單實(shí)例數(shù)據(jù)庫(kù),而后考慮生產(chǎn)或現(xiàn)實(shí)需求,一步一步完善并揉合K8S多個(gè)技術(shù),從而構(gòu)建一個(gè)復(fù)雜且可供生產(chǎn)用的MySQL單實(shí)例庫(kù)。
簡(jiǎn)單部署? 如下所示,我們僅需設(shè)置root用戶密碼(環(huán)境變量MYSQL_ROOT_PASSWORD), 便可輕松的使用MySQL官方鏡像構(gòu)建一個(gè)MySQL數(shù)據(jù)庫(kù)。
# kubectl create -f - <? 注意:若你的K8S集群是minishift、openshift、origin,因其為安全考慮,不允許容器以root用戶運(yùn)行,而官方MySQL鏡像卻需root權(quán)限,故為使其能順利運(yùn)行,我們需將anyuid scc賦予default serviceaccount:
# oc adm policy add-scc-to-user anyuid -z default? 創(chuàng)建一Service以便集群內(nèi)外均可訪問(wèn)數(shù)據(jù)庫(kù),其中集群外需通過(guò)nodePort設(shè)置的30006端口訪問(wèn)。
# kubectl create -f - <? 接著,訪問(wèn)數(shù)據(jù)庫(kù)并驗(yàn)證其運(yùn)行正常:
# kubectl get pod # 當(dāng)前Pod名稱 NAME READY STATUS RESTARTS AGE mysql-5b5668c448-t44ml 1/1 Running 0 3h # 通過(guò)本機(jī)訪問(wèn) # kubectl exec -it mysql-5b5668c448-t44ml -- mysql -uroot -pChangeme mysql> select 1; +---+ | 1 | +---+ | 1 | +---+ # 集群內(nèi)部通過(guò)mysql service訪問(wèn): # kubectl exec -it mysql-5b5668c448-t44ml -- mysql -uroot -pChangeme -hmysql mysql> select now(); +---------------------+ | now() | +---------------------+ | 2018-05-21 07:19:14 | +---------------------+ # 集群外部,可通過(guò)任何一個(gè)K8S節(jié)點(diǎn)訪問(wèn)數(shù)據(jù)庫(kù): # mysql -uroot -pChangeme -horigin-lb-01 -P30006 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+擴(kuò)展部署 持久化存儲(chǔ)? 若要確保MySQL重啟后數(shù)據(jù)仍然存在,我們需為其配置可持久化存儲(chǔ),作者的實(shí)驗(yàn)環(huán)境配置了GlusterFS分布式存儲(chǔ),其支持K8S動(dòng)態(tài)提供特性,故可執(zhí)行如下命令創(chuàng)建PVC:
# kubectl create -f - <? 而后,調(diào)整Deploy并掛載卷:
spec: containers: - image: mysql ... volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumes: - name: mysql-data persistentVolumeClaim: claimName: mysql自定義配置文件? 通過(guò)創(chuàng)建cm并掛載到容器中,我們可自定義MySQL配置文件。如下所示,名為mysql-config的cm包含一個(gè)custom.cnf文件:
apiVersion: v1 metadata: name: mysql-config data: custom.cnf: | [mysqld] default_storage_engine=innodb skip_external_locking lower_case_table_names=1 skip_host_cache skip_name_resolve kind: ConfigMap? 將cm掛載到容器內(nèi):
spec: ... containers: - image: mysql ... volumeMounts: - name: mysql-config mountPath: /etc/mysql/conf.d/ ... volumes: - name: mysql-config configMap: name: mysql-config ...加密銘感數(shù)據(jù)? 用戶密碼等銘感數(shù)據(jù)以Secret加密保存,而后被Deployment通過(guò)volume掛載或環(huán)境變量引用。如本例,我們創(chuàng)建root、app 、test用戶,將3個(gè)用戶的密碼加密保存:
# echo -n Changeme | base64 Q2hhbmdlbWU= # kubectl create -f - <? Secret創(chuàng)建完成后,我們將用戶明文密碼從Deployment去除,采用環(huán)境變量方式引用Secret數(shù)據(jù),參見如下Yaml修改,做了3個(gè)調(diào)整:
鏡像初始化時(shí)自動(dòng)創(chuàng)建MYSQL_DATABASE環(huán)境變量1設(shè)置的數(shù)據(jù)庫(kù);
鏡像初始化時(shí)將MYSQL_DATABASE數(shù)據(jù)庫(kù)賦予MYSQL_USER用戶;
root用戶及MYSQL_USER用戶,其密碼均通過(guò)secretKeyRef從secret獲取;
spec: ... containers: - image: mysql name: mysql imagePullPolicy: IfNotPresent env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-user-pwd key: mysql-root-pwd - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: mysql-user-pwd key: mysql-app-user-pwd - name: MYSQL_USER value: app - name: MYSQL_DATABASE value: appdb容器健康檢查? K8S鏡像控制器可通過(guò)livenessProbe判斷容器是否異常,進(jìn)而決定是否重建容器;而Service服務(wù)可通過(guò)readinessProbe判斷容器服務(wù)是否正常,從而確保服務(wù)可用性。
? 本例,作者配置的livenessProbe與readinessProbe是一樣的,即連續(xù)3次查詢數(shù)據(jù)庫(kù)失敗,則定義為異常。對(duì)livenessProbe與readinessProbe詳細(xì)用法,不在本文的討論范圍內(nèi),可參考K8S官方文檔:
Configure Liveness and Readiness Probes
Pod Lifecycle
spec: containers: - image: mysql ... livenessProbe: exec: command: - /bin/sh - "-c" - MYSQL_PWD="${MYSQL_ROOT_PASSWORD}" - mysql -h 127.0.0.1 -u root -e "SELECT 1" initialDelaySeconds: 30 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 3 readinessProbe: exec: command: - /bin/sh - "-c" - MYSQL_PWD="${MYSQL_ROOT_PASSWORD}" - mysql -h 127.0.0.1 -u root -e "SELECT 1" initialDelaySeconds: 10 timeoutSeconds: 1 successThreshold: 1 failureThreshold: 3 ...容器初始化假設(shè),我們有這樣的需求:“初始部署MySQL時(shí),其已包應(yīng)用所需的數(shù)據(jù)庫(kù)、用戶、權(quán)限、表結(jié)構(gòu)與數(shù)據(jù)”。研究MySQL官方鏡像的Dockerfile可知,數(shù)據(jù)庫(kù)初始化時(shí)將自動(dòng)執(zhí)行目錄/docker-entrypoint-initdb.d內(nèi)的.sh、.sql、.sql.gz文件,鑒于此,我們可有如下兩種方法:
基于官方鏡像重新編寫Dockerfile,將腳本copy到新鏡像/docker-entrypoint-initdb.d目錄,因需編譯新鏡像,故此方法不靈活;
初始化容器(initContainers)在常規(guī)容器(containers)前運(yùn)行,故在初始化容器中可將腳本拷貝到共享目錄,而后MySQL鏡像掛載此目錄到/docker-entrypoint-initdb.d,此方法靈活。
本例,作者采用初始化容器方案,功能如下:
初始化與常規(guī)容器共享名為mysql-initdb的emptyDir,均被掛載到/docker-entrypoint-initdb.d目錄;
初始化容器將.sql文件置于共享的/docker-entrypoint-initdb.d目錄,其含初始化testdb與appdb數(shù)據(jù)庫(kù);
為了避免MySQL數(shù)據(jù)庫(kù)目錄內(nèi)的lost+found目錄被誤認(rèn)為是數(shù)據(jù)庫(kù),初始化容器中將其刪除;
spec: initContainers: - name: mysql-init image: busybox imagePullPolicy: IfNotPresent env: - name: MYSQL_TEST_USER_PASSWORD valueFrom: secretKeyRef: name: mysql-user-pwd key: mysql-test-user-pwd command: - sh - "-c" - | set -ex rm -fr /var/lib/mysql/lost+found cat > /docker-entrypoint-initdb.d/mysql-testdb-init.sql </docker-entrypoint-initdb.d/mysql-appdb-init.sql < 完整Deployment ? 通過(guò)如上多步調(diào)整,MySQL數(shù)據(jù)庫(kù)的Deplyment如下所示:
apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: mysql name: mysql spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: initContainers: - name: mysql-init image: busybox imagePullPolicy: IfNotPresent env: - name: MYSQL_TEST_USER_PASSWORD valueFrom: secretKeyRef: name: mysql-user-pwd key: mysql-test-user-pwd command: - sh - "-c" - | set -ex rm -fr /var/lib/mysql/lost+found cat > /docker-entrypoint-initdb.d/mysql-testdb-init.sql </docker-entrypoint-initdb.d/mysql-appdb-init.sql < 創(chuàng)建此Deployment后,我們有如下組件:
# kubectl get all,pvc,cm,secret # MySQL Deployment: NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/mysql 1 1 1 1 1m # RS被Deployment調(diào)用,其是自動(dòng)生成的 NAME DESIRED CURRENT READY AGE rs/mysql-998977cdd 1 1 1 1m # Pod: NAME READY STATUS RESTARTS AGE po/mysql-998977cdd-v2ks2 1/1 Running 1 1m # Service: NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/mysql NodePort 172.30.3.200定期自動(dòng)備份3306:30006/TCP 8h # Pvc: NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc/mysql Bound pvc-fe.. 1Gi ROX glusterfs-raid0 2m # Configmap: NAME DATA AGE cm/mysql-config 1 6h # Secret: NAME TYPE DATA AGE secrets/mysql-user-pwd Opaque 3 1h ? 考慮到數(shù)據(jù)安全性,我們定期備份數(shù)據(jù)庫(kù),在K8S集群中,我們可配置CronJob實(shí)現(xiàn)自動(dòng)備份作業(yè)。首先,創(chuàng)建一個(gè)持久化存儲(chǔ)供備份用:
# kubectl create -f - <? 繼而,配置實(shí)際的自動(dòng)化作業(yè)任務(wù),如下所示,每天凌晨0點(diǎn)將使用mysqldump備份appdb數(shù)據(jù)庫(kù)。
# kubectl create -f - <結(jié)束語(yǔ)/mysql-backup/mysql-`date +"%Y%m%d"`.sql volumeMounts: - name: mysql-backup mountPath: /mysql-backup restartPolicy: OnFailure volumes: - name: mysql-backup persistentVolumeClaim: claimName: mysql-backup EOF ? 本文揉合K8S多項(xiàng)技術(shù),構(gòu)建了一個(gè)復(fù)雜且可做生產(chǎn)使用的范例,當(dāng)然,此庫(kù)是單實(shí)例數(shù)據(jù)庫(kù),倘若需構(gòu)建數(shù)據(jù)庫(kù)高可用方案,需部署如MySQL HA、PXC集群,其中自動(dòng)作業(yè)備份范例僅使用mysqldump備份,在生產(chǎn)環(huán)境不是很實(shí)用,我們需要考慮使用xtrabackup備份以及mysqlbinlog備份日志。
參見docker-entrypoint.sh。 ?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/32678.html
摘要:結(jié)束語(yǔ)本文揉合多項(xiàng)技術(shù),構(gòu)建了一個(gè)復(fù)雜且可做生產(chǎn)使用的范例,當(dāng)然,此庫(kù)是單實(shí)例數(shù)據(jù)庫(kù),倘若需構(gòu)建數(shù)據(jù)庫(kù)高可用方案,需部署如集群,其中自動(dòng)作業(yè)備份范例僅使用備份,在生產(chǎn)環(huán)境不是很實(shí)用,我們需要考慮使用備份以及備份日志。 文檔說(shuō)明 ? 本文面向容器初學(xué)者,作者先簡(jiǎn)單的用MySQL官方鏡像搭建一個(gè)可運(yùn)行的單實(shí)例數(shù)據(jù)庫(kù),而后考慮生產(chǎn)或現(xiàn)實(shí)需求,一步一步完善并揉合K8S多個(gè)技術(shù),從而構(gòu)建一...
摘要:結(jié)束語(yǔ)本文揉合多項(xiàng)技術(shù),構(gòu)建了一個(gè)復(fù)雜且可做生產(chǎn)使用的范例,當(dāng)然,此庫(kù)是單實(shí)例數(shù)據(jù)庫(kù),倘若需構(gòu)建數(shù)據(jù)庫(kù)高可用方案,需部署如集群,其中自動(dòng)作業(yè)備份范例僅使用備份,在生產(chǎn)環(huán)境不是很實(shí)用,我們需要考慮使用備份以及備份日志。 文檔說(shuō)明 ? 本文面向容器初學(xué)者,作者先簡(jiǎn)單的用MySQL官方鏡像搭建一個(gè)可運(yùn)行的單實(shí)例數(shù)據(jù)庫(kù),而后考慮生產(chǎn)或現(xiàn)實(shí)需求,一步一步完善并揉合K8S多個(gè)技術(shù),從而構(gòu)建一...
閱讀 795·2021-09-28 09:35
閱讀 2617·2019-08-29 11:25
閱讀 2184·2019-08-23 18:36
閱讀 1888·2019-08-23 16:31
閱讀 2098·2019-08-23 14:50
閱讀 3164·2019-08-23 13:55
閱讀 3323·2019-08-23 12:49
閱讀 2116·2019-08-23 11:46