博客 / 詳情

返回

容器化應用: Openshift 部署 MySQL數據庫服務: 上篇

創建應用

$ oc new-app \
-e MYSQL_USER=data \
-e MYSQL_PASSWORD=data \
-e MYSQL_DATABASE=data \
-e MYSQL_ROOT_PASSWORD=root centos/mysql-57-centos7

注意: 如果要在CentOS下使用最新的MySQL 5.7版本, 容器鏡像的名稱為centos/mysql-57-centos7. 官方文檔使用的是openshift/mysql-55-centos, 具體參考: 初始化數據庫

在容器中運行MySQL命令

列出運行中的PODS:

oc get pods

登錄遠程SHELL:

oc rsh ${pod-name}

輸入mysql命令進入MySQL交互式SHELL

bash-4.2$ mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -h $HOSTNAME $MYSQL_DATABASE
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.37 MySQL Community Server (GPL)
...
mysql>

環境變量

You must either specify the following environment variables:
  MYSQL_USER (regex: '^[a-zA-Z0-9_]+$')
  MYSQL_PASSWORD (regex: '^[a-zA-Z0-9_~!@#$%^&*()-=<>,.?;:|]+$')
  MYSQL_DATABASE (regex: '^[a-zA-Z0-9_]+$')
Or the following environment variable:
  MYSQL_ROOT_PASSWORD (regex: '^[a-zA-Z0-9_~!@#$%^&*()-=<>,.?;:|]+$')
Or both.
Optional Settings:
  MYSQL_LOWER_CASE_TABLE_NAMES (default: 0)
  MYSQL_LOG_QUERIES_ENABLED (default: 0)
  MYSQL_MAX_CONNECTIONS (default: 151)
  MYSQL_FT_MIN_WORD_LEN (default: 4)
  MYSQL_FT_MAX_WORD_LEN (default: 20)
  MYSQL_AIO (default: 1)
  MYSQL_KEY_BUFFER_SIZE (default: 32M or 10% of available memory)
  MYSQL_MAX_ALLOWED_PACKET (default: 200M)
  MYSQL_TABLE_OPEN_CACHE (default: 400)
  MYSQL_SORT_BUFFER_SIZE (default: 256K)
  MYSQL_READ_BUFFER_SIZE (default: 8M or 5% of available memory)
  MYSQL_INNODB_BUFFER_POOL_SIZE (default: 32M or 50% of available memory)
  MYSQL_INNODB_LOG_FILE_SIZE (default: 8M or 15% of available memory)
  MYSQL_INNODB_LOG_BUFFER_SIZE (default: 8M or 15% of available memory)

注意: 某些環境變量有兩種默認值, 當容器沒有設置內存限制時, 使用固定值, 否則是用容器限制的百分比.

修改數據庫密碼

在容器環境中唯一修復MYSQL_USER和root密碼的方式是通過MYSQL_PASSWORD, MYSQL_ROOT_PASSWORD環境變量, 因為, MYSQL的配置已經被固化到了部署配置(DC: Deployment Config)當中, 通過命令行獲取POD或DC的環境變量列表:

➜  .minishift oc set env pod mysql-57-centos7-1-qplng --list
# pods mysql-57-centos7-1-qplng, container mysql-57-centos7
MYSQL_DATABASE=data
MYSQL_PASSWORD=data
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=data

➜  .minishift oc set env dc mysql-57-centos7 --list
# deploymentconfigs mysql-57-centos7, container mysql-57-centos7
MYSQL_DATABASE=data
MYSQL_PASSWORD=data
MYSQL_ROOT_PASSWORD=data
MYSQL_USER=data

注意:
1. 如果環沒有設置境變量MYSQL_ROOT_PASSWORD, root 用户是不能遠程登錄的, 容器內本地環境仍然可以無密碼登錄, 在產品環境下建議不要設置MYSQL_ROOT_PASSWORD. 這不影響正常的 MYSQL_USER用户.
2. 建議不要用其他非環境變量的方式修改密碼, 因為容器在啓動的時候回通過環境變量充值MySQL用户密碼.

修改部署配置(DC: Deployment Config)的環境變量

$ oc set env dc <dc_name> [<dc_name_2> ...] \
  MYSQL_PASSWORD=<new_password> \
  MYSQL_ROOT_PASSWORD=<new_root_password>

容器是通過DC進行實例化的, 如果要對每一個DC下的實例都有效, 需要修改DC的環境變量, 首先獲取當前項目(名稱空間)下的DC列表:

➜  .minishift oc get dc
NAME                 REVISION   DESIRED   CURRENT   TRIGGERED BY
hello-microservice   1          1         1         config,image(hello-microservice:latest)
mysql-57-centos7     1          1         1         config,image(mysql-57-centos7:latest)
nodejs-ex            1          1         1         config,image(nodejs-ex:latest)

然後執行:

➜  .minishift oc set env dc mysql-57-centos7 MYSQL_PASSWORD=changed MYSQL_ROOT_PASSWORD=changed     
deploymentconfig "mysql-57-centos7" updated

注意: 更新環境變量會觸發一次重新部署.

數據持久化

容器如果沒有使用外部的持久化卷, 那麼當容器重新啓動後, 之前更新的數據將會全部丟失, 因此, 像MySQL這類需要持久化數據存儲支持的應用, 如果丟失數據, 是要命的事情!

創建持久化卷

MySQL 容器鏡像可以掛載卷, 以持久化數據庫存儲:

/var/lib/mysql/data - 該目錄是MySQL存儲數據庫文件的目錄

掛載卷之前, 我們先創建持久化卷(PV), 如下:

clipboard.png

定義名稱為 db.mysql.data, 卷的訪問模式為單用户非共享卷, 也就是同時只能有一個容器能夠掛載這個卷. 測試目的, 卷的大小設置為較小的值128MiB.

注意: MiB(BINARY UNITS, 二進制單位)的進制是1024, MB(DECIMAL UNITS 十進制單位)的進制是1000, 下面是創建卷的描述文件:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: '2017-10-22T13:04:04Z'
  name: db.mysql.data
  namespace: reactive-microservices
  resourceVersion: '7789'
  selfLink: >-
    /api/v1/namespaces/reactive-microservices/persistentvolumeclaims/db.mysql.data
  uid: 7adb87cd-b729-11e7-8e63-665a136940b1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 128Mi
status:
  phase: Pending

通過 oc get 命令查看持久卷被綁定到哪裏了

➜  .minishift oc get persistentvolume |grep mysql
pv0020    100Gi      RWO,ROX,RWX   Recycle         Bound       reactive-microservices/db.mysql.data                            1d

➜  .minishift oc get persistentvolumeclaim       
NAME            STATUS    VOLUME    CAPACITY   ACCESSMODES   STORAGECLASS   AGE
db.mysql.data   Bound     pv0020    100Gi      RWO,ROX,RWX                  1m

clipboard.png

我們看到我們的持久化卷請求(PVC: Persistent Volume Claim), 被綁定到了容量為100Gi的設備pv0020上了.

掛載

clipboard.png

進入DC(上圖 Applications > Deployments), 選中 mysql-57-centos7 這個DC. 刪除已經掛載的容器內部卷. 並點擊Add Storage添加簽名創建的卷.

注意: 因為默認 mysql-57-centos7 部署配置的數據目錄默認掛載位置是 /var/lib/mysql/data, 因此為了避免路徑衝突, 需要刪除內置的卷. 因為修改了配置, Openshift 會自動重新觸發一次 mysql-57-centos7 的部署.

現在可以登錄容器創建一些測試數據了

sh-4.2$ oc rsh mysql-57-centos7-10-sffhd

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.16 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| data               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use data;
Database changed
mysql> show tables;
+----------------+
| Tables_in_data |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

mysql> select * from users;
+----+--------------+
| id | username     |
+----+--------------+
|  1 | admin        |
|  2 | system:admin |
|  3 | developer    |
+----+--------------+
3 rows in set (0.00 sec)

mysql> 

注意: 你現在可以重新部署一次這個DC來看看新實例化的容器MySQL的數據有沒有丟失, 如下:

clipboard.png

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.