国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

在K8S集群中一步步構建一個復雜的MySQL數據庫

songze / 3263人閱讀

摘要:結束語本文揉合多項技術,構建了一個復雜且可做生產使用的范例,當然,此庫是單實例數據庫,倘若需構建數據庫高可用方案,需部署如集群,其中自動作業備份范例僅使用備份,在生產環境不是很實用,我們需要考慮使用備份以及備份日志。

文檔說明

? 本文面向容器初學者,作者先簡單的用MySQL官方鏡像搭建一個可運行的單實例數據庫,而后考慮生產或現實需求,一步一步完善并揉合K8S多個技術,從而構建一個復雜且可供生產用的MySQL單實例庫。

簡單部署

? 如下所示,我們僅需設置root用戶密碼(環境變量MYSQL_ROOT_PASSWORD), 便可輕松的使用MySQL官方鏡像構建一個MySQL數據庫。

# kubectl create -f - <

? 注意:若你的K8S集群是minishiftopenshiftorigin,因其為安全考慮,不允許容器以root用戶運行,而官方MySQL鏡像卻需root權限,故為使其能順利運行,我們需將anyuid scc賦予default serviceaccount

# oc adm policy add-scc-to-user anyuid -z default

? 創建一Service以便集群內外均可訪問數據庫,其中集群外需通過nodePort設置的30006端口訪問。

# kubectl create -f - <

? 接著,訪問數據庫并驗證其運行正常:

# kubectl get pod                                   # 當前Pod名稱
NAME                     READY     STATUS    RESTARTS   AGE
mysql-5b5668c448-t44ml   1/1       Running   0          3h

# 通過本機訪問
# kubectl exec -it mysql-5b5668c448-t44ml -- mysql -uroot -pChangeme

mysql> select 1;
+---+
| 1 |
+---+
| 1 |
+---+

# 集群內部通過mysql service訪問:
# kubectl exec -it mysql-5b5668c448-t44ml -- mysql -uroot -pChangeme -hmysql

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2018-05-21 07:19:14 |
+---------------------+

# 集群外部,可通過任何一個K8S節點訪問數據庫:
# mysql -uroot -pChangeme -horigin-lb-01 -P30006

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
擴展部署 持久化存儲

? 若要確保MySQL重啟后數據仍然存在,我們需為其配置可持久化存儲,作者的實驗環境配置了GlusterFS分布式存儲,其支持K8S動態提供特性,故可執行如下命令創建PVC

# kubectl create -f - <

? 而后,調整Deploy并掛載卷:

    spec:
      containers:
      - image: mysql
...
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql
自定義配置文件

? 通過創建cm并掛載到容器中,我們可自定義MySQL配置文件。如下所示,名為mysql-configcm包含一個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掛載到容器內:

    spec:
...
      containers:
      - image: mysql
...
        volumeMounts:
        - name: mysql-config
          mountPath: /etc/mysql/conf.d/
...
      volumes:
      - name: mysql-config
        configMap:
          name: mysql-config
...
加密銘感數據

? 用戶密碼等銘感數據以Secret加密保存,而后被Deployment通過volume掛載或環境變量引用。如本例,我們創建rootapptest用戶,將3個用戶的密碼加密保存:

# echo -n Changeme | base64
Q2hhbmdlbWU=
# kubectl create -f - <

? Secret創建完成后,我們將用戶明文密碼從Deployment去除,采用環境變量方式引用Secret數據,參見如下Yaml修改,做了3個調整:

鏡像初始化時自動創建MYSQL_DATABASE環境變量1設置的數據庫;

鏡像初始化時將MYSQL_DATABASE數據庫賦予MYSQL_USER用戶;

root用戶及MYSQL_USER用戶,其密碼均通過secretKeyRefsecret獲取;

    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鏡像控制器可通過livenessProbe判斷容器是否異常,進而決定是否重建容器;而Service服務可通過readinessProbe判斷容器服務是否正常,從而確保服務可用性。

? 本例,作者配置的livenessProbereadinessProbe是一樣的,即連續3次查詢數據庫失敗,則定義為異常。對livenessProbereadinessProbe詳細用法,不在本文的討論范圍內,可參考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
...
容器初始化

假設,我們有這樣的需求:“初始部署MySQL時,其已包應用所需的數據庫、用戶、權限、表結構與數據”。研究MySQL官方鏡像的Dockerfile可知,數據庫初始化時將自動執行目錄/docker-entrypoint-initdb.d內的.sh.sql.sql.gz文件,鑒于此,我們可有如下兩種方法:

基于官方鏡像重新編寫Dockerfile,將腳本copy到新鏡像/docker-entrypoint-initdb.d目錄,因需編譯新鏡像,故此方法不靈活;

初始化容器(initContainers)在常規容器(containers)前運行,故在初始化容器中可將腳本拷貝到共享目錄,而后MySQL鏡像掛載此目錄到/docker-entrypoint-initdb.d,此方法靈活。

本例,作者采用初始化容器方案,功能如下:

初始化與常規容器共享名為mysql-initdbemptyDir,均被掛載到/docker-entrypoint-initdb.d目錄;

初始化容器將.sql文件置于共享的/docker-entrypoint-initdb.d目錄,其含初始化testdbappdb數據庫;

為了避免MySQL數據庫目錄內的lost+found目錄被誤認為是數據庫,初始化容器中將其刪除;

    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

? 通過如上多步調整,MySQL數據庫的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 <

創建此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調用,其是自動生成的
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            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
定期自動備份

? 考慮到數據安全性,我們定期備份數據庫,在K8S集群中,我們可配置CronJob實現自動備份作業。首先,創建一個持久化存儲供備份用:

# kubectl create -f - <

? 繼而,配置實際的自動化作業任務,如下所示,每天凌晨0點將使用mysqldump備份appdb數據庫。

# kubectl create -f - < /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多項技術,構建了一個復雜且可做生產使用的范例,當然,此庫是單實例數據庫,倘若需構建數據庫高可用方案,需部署如MySQL HAPXC集群,其中自動作業備份范例僅使用mysqldump備份,在生產環境不是很實用,我們需要考慮使用xtrabackup備份以及mysqlbinlog備份日志。


  • 參見docker-entrypoint.sh。 ?

  • 文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

    轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32678.html

    相關文章

    • K8S集群中一步步構建一個復雜MySQL據庫

      摘要:結束語本文揉合多項技術,構建了一個復雜且可做生產使用的范例,當然,此庫是單實例數據庫,倘若需構建數據庫高可用方案,需部署如集群,其中自動作業備份范例僅使用備份,在生產環境不是很實用,我們需要考慮使用備份以及備份日志。 文檔說明 ? 本文面向容器初學者,作者先簡單的用MySQL官方鏡像搭建一個可運行的單實例數據庫,而后考慮生產或現實需求,一步一步完善并揉合K8S多個技術,從而構建一...

      YancyYe 評論0 收藏0
    • K8S集群中一步步構建一個復雜MySQL據庫

      摘要:結束語本文揉合多項技術,構建了一個復雜且可做生產使用的范例,當然,此庫是單實例數據庫,倘若需構建數據庫高可用方案,需部署如集群,其中自動作業備份范例僅使用備份,在生產環境不是很實用,我們需要考慮使用備份以及備份日志。 文檔說明 ? 本文面向容器初學者,作者先簡單的用MySQL官方鏡像搭建一個可運行的單實例數據庫,而后考慮生產或現實需求,一步一步完善并揉合K8S多個技術,從而構建一...

      didikee 評論0 收藏0

    發表評論

    0條評論

    songze

    |高級講師

    TA的文章

    閱讀更多
    最新活動
    閱讀需要支付1元查看
    <