Google Cloudのlinuxとローカルlinuxで、それぞれmariadbとdjangoのコンテナ動かしてる。
ローカルlinuxでdjangoの開発しといて、Google Cloudで本利用し、mariadbの永続化領域(pv)をGoogleDrive経由でtar.gzファイルをローカルlinuxに持ってきてる。
これをmacで動かしはじめたminikubeでも構成作れるかやってみる。
kubectlのコマンドライン練習と、マニフェスト作成の練習ね。
前回
はmacにminikube入れてhyperkitの中で動くコンテナをPodに見立てて、xrdpできるPodが常時稼働できるようにした。
今回も最初に目標設定。
イメージ湧かせましょ。
右端のGoogleからローカルlinuxへのコピーこんな感じ。
GCE ubuntu22のxrdpコンテナは、ローカルlinuxにssh経由のポートフォワードさせて、httpsひっかけたDjangoコンテナを使ってる。
Djangoは8080ポートで公開して、それをhttpsで拾わせて30443で公開しxrdpコンテナにローカル端末からrdpしてブラウザ経由で利用。
mariadbの永続化領域がpvにあるから、それをときどきlocal ubuntu22にtar.gzにしてvmdkに持ってくる。
local ubuntu22のxrdpコンテナは、ローカルやから普通にrdp開くし、djangoの開発とかモジュール更新もほぼここで維持。
dockerイメージはここで管理しておいて、mac向けにdocker saveするからmacではそれをdocker loadする。
mac(gvis-mac.intra.gavann-it.com)ではdocker buildせずdocker loadしてイメージを維持し、local ubuntu22のvmdkに置いてあるmariadbの永続化領域をhyperkitの/dataにコピーさせて使う。
hyperkitの/dataへはminikube sshしてwindows側からteraterm経由でコピーするか、--mount-string /Users/nari/Documents/personal/minikube/:/minikubeMacってminikube起動時に指定してマウントポイントを経由してmacからコピーする。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
+-mac(gvis-mac)----------------+
| +-minikube-------+ |
| | | |
| +----------------+ |
| +-hyperkit-----------------+ |
| | +-container-+ | |
| | | kubernetes| | | +-local ubuntu22 linux--------+ +-GCE ubuntu22 linux----------+
| | +-----------+ +-/data-+ | | | +-docker---------+ +-vmdk-+ | | +-docker---------+ +--pv--+ |
| | +-container-+ | | | | | | +-container-+ | | data | | | | +-container-+ | | data | |
| | | *Django | | *d1 | | | | | | Django | | | d1 | | | | | Django | | | d1 | |
| | +-----------+ +-------+ | | | | +-----------+ | +------+ | | | +-----------+ | +------+ |
| | +-container-+ | | | | | | +-container-+ | | | | | | +-container-+ | | | |
| | | *mariadb | | *d2 | | | | | | mariadb | | | d2 | | | | | mariadb | | | d2 | |
| | +-----------+ +-------+ | | | | +-----------+ | +------+ | | | +-----------+ | +------+ |
| | +-container-+ | | | | | | +-container-+ | | | | | | +-container-+ | | | |
| | | xrdp-ubu22| | d3 | | | <- | | | xrdp-ubu22| | | d3 | | <- | | | xrdp-ubu22| | | d3 | |
| | +-----------+ +-------+ | | <- | | +-----------+ | +------+ | <- | | +-----------+ | +------+ |
| | | | <- | | | | <- | | +-container-+ | |
| | +-------+ | | | | | | | | | gitlab | | |
| | | mini | | | | | | | | | +-----------+ | |
| | +-container-+ | kube | | | | | +-container-+ | | | | +-container-+ | |
| | | *https | | Mac | | | | | | https | | | | | | https | | |
| | +-----------+ +-------+ | | | | +-----------+ | | | | +-----------+ | |
| +--------------------------+ | | +----------------+ | | +----------------+ |
+------------------------------+ +-----------------------------+ +-----------------------------+
|
今回は「*」のついたところを作って、kubernetesのサービスのマニフェストも用意した。
- *mariadb 3306 ->13306
- *Django 8080 ->38080
- *https 80,443->30080,30443
- *d1 Django用永続化領域 1GiB
- *d2 mariadb用永続化領域 20GiB
mariadbは13306ポートで参照。
ちょっとややこしいけど、Djangoは8080->38080で公開してhttpsのコンテナに拾わせておいて、httpsからは443->30443で公開。
38080はPod間通信ではつながるけど、mac以外のホストからは30443でブラウザ参照。
docker-composeをlinux側で作って動かしてるので、それをkubernetesに置き換えるっていう感じで考えた。
docker-compose.ymlの定義#
local ubuntu22 linuxの中で使ってるdocker-compose.ymlの定義はこんな感じ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
version: "3"
services:
sv_mariadb1011:
hostname: svmariadb1011
build:
context: ./nariDockerDat/sv_mariadb11/
dockerfile: sv_mariadb11_Dockerfile
image: mariadb:1011
ports:
- "13306:3306"
env_file:
- ./nariDockerDat/sv_mariadb11/env_sv_mariadb11.txt
volumes:
- ./nariDockerDat/sv_mariadb11/data:/var/lib/mysql
- ./nariDockerDat/sv_mariadb11conf:/etc/mysql/conf.d
### 【参考】
### https://sleepless-se.net/2018/06/12/dockerdjangoを無料でhttps化して簡単にデプロイする方法/
### https://github.com/SteveLTN/https-portal
###
### ※注意
### /var/lib/nginx-conf/にあるdefault*.erbファイルに
###「client_max_body_size 30M; ## for gvisapp」を追記して
### アプリケーションからのblob保存で「413 Request Entity Too Large」が
### 出ないようにすること
###
sv_https-portal:
image: steveltn/https-portal:1
ports:
- "30080:80"
- "30443:443"
environment:
DOMAINS: 'nafslinux.intra.gavann-it.com -> http://svdjango:8080'
STAGE: 'local' # or 'production'
volumes:
- ./nariDockerDat/sv_django-ssl_certs:/var/lib/https-portal
sv_django:
image: sv_django:4
build: ./nariDockerDat/sv_django-uwsgi-nginx
hostname: svdjango
volumes:
- ./nariDockerDat/sv_django-uwsgi-nginx/app:/code/app
ports:
- "38080:8080"
|
最初はkomposeってツールがあって、それを使ってみた。
Kompose - Convert your Docker Compose file to Kubernetes or OpenShift
brewで一発で入るし、マニフェストを書くのはどうしたらいいのかわかってなくてdocker-compose.ymlを流用したいときには助けてはくれる。
それぞれdeploymentのマニフェストがサービスのマニフェストと、pvc/pvを使う感じの出力をしてくれる。
ENVとかdocker-compose.ymlに書いてるから、configmapの定義作ってくれたのはそのまま使わせてもらった。
ただし、deploymentには不要な記述が多かったから、参考にはしたけど自分で解釈しながら作り直した。
結局komposeはもう使ってない。
名前引き#
単一ホスト利用なら、普通だったら/etc/hostsとかC:\Windows\System32\drivers\etcに書けばいい。
自分の場合はルータのDNS機能使ってるので、そこに登録してる。
macから名前引き確認してみる。
1
2
3
4
5
6
7
8
|
nari@gvis-mac ~ % nslookup gvis-mac.intra.gavann-it.com
Server: 172.16.17.15
Address: 172.16.17.15#53
Name: gvis-mac.intra.gavann-it.com
Address: 192.168.1.117
nari@gvis-mac ~ %
|
この登録した名前で、作ったPodのポート番号をwindowsホストとかから参照する。
データベースのPod(mariadb)#
mariadbのconfigmap#
configmapってのはPodが参照する環境変数の置き場みたいなもので名前空間ごとに定義できる。
minikubeでは1つしか名前空間とか定義してへんから、あんまり意識せずに使える。
docker-compose.ymlの中でENVとか書いてたりすると、configmapに書き出してくれる。
kubernetesだと使い方はこのへんにある。
Podを構成してConfigMapを使用する | Kubernetes
gkeだと使い方はこのへんにある。
クイックスタート: アプリを GKE クラスタにデプロイする | Google Kubernetes Engine (GKE) | Google Cloud
komposeが作ってくれたものを丸パクリしてて内容はこんな感じ。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
apiVersion: v1
data:
MARIADB_DATABASE: nariDB_1st
MARIADB_PASSWORD: XXXXXX
MARIADB_ROOT_PASSWORD: XXXXXXXX
MARIADB_USER: nari
TZ: Asia/Tokyo
kind: ConfigMap
metadata:
creationTimestamp: null
labels:
io.kompose.service: sv-mariadb1011-txt
name: sv-mariadb11-txt
|
mariadbの場合は、ENVで定義したデータベース名・rootユーザのパスワード・一般ユーザとそのパスワードを書いておくと、初回起動時の初期化処理で設定やってくれる。
minikubeの場合はconfigmapとして定義しといたらええ。
パスワードはconfigmapじゃなくてsecretで定義したほうがええような気がするけど、目に見えへんから扱いにくいのでminikubeローカル環境ではパス。
mariadbのpv/pvc#
永続化領域の解説がサイトにあるから、最初はこのへん読んだ。
1
2
3
4
5
|
MinikubeのVMはtmpfsで起動するため、ほとんどのディレクトリーは再起動しても持続しません (minikube stop)。
しかし、Minikubeは以下のホストディレクトリーに保存されているファイルを保持するように設定されています:
/data
/var/lib/minikube
/var/lib/docker
|
minikubeで維持するフォルダは決まってるらしい。
pvには種類がある。
Persistent Volumes | Kubernetes
mysql/mariadbでpvc/pvはどう使うのか参考にさせてもらった。
作者さんありがとう。
kubernetesでMysqlを動かしてみる #kubernetes - Qiita
Kubernetes: PersistentVolume概要とminikubeでの検証 #kubernetes - Qiita
pvcで要求して、pvを使うって感じか。
自分で使ってる内容はこんな感じ。
まずは設定ファイル置き場用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
kind: PersistentVolume
apiVersion: v1
metadata:
name: gvis-pv-mariadb1011conf # PVの名前
labels:
type: local
spec:
storageClassName: manual # PVCと一致させる必要がある
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce # 一つのノードからread/writeでマウントできるモード
hostPath:
path: "/data/gvis-pv-mariadb1011conf"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gvis-pv-mariadb1011conf-claim # PVCの名前
spec:
# storageClassName=manualのPVを探してマウントする
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi # PVが持っている容量のうち1GiBを使用する
|
データ置き場用にもういっちょ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
kind: PersistentVolume
apiVersion: v1
metadata:
name: gvis-pv-mariadb1011 # PVの名前
labels:
type: local
spec:
storageClassName: manual # PVCと一致させる必要がある
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce # 一つのノードからread/writeでマウントできるモード
hostPath:
path: "/data/gvis-pv-mariadb1011"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gvis-pv-mariadb1011-claim # PVCの名前
spec:
# storageClassName=manualのPVを探してマウントする
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi # PVが持っている容量のうち20GiBを使用する
|
mariadbのdeployment#
一般的な定義を参考にさせてもらった。
作者さんありがとう。
kubernetesでMysqlを動かしてみる #kubernetes - Qiita
使ってる内容はこんな感じ。
my.cnfとかに書きたい内容あるし、インポートの処理も使いたいからpvc/pvを使ってる。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
apiVersion: apps/v1
kind: Deployment
metadata:
name: sv-mariadb1011
labels:
app: sv-mariadb1011
spec:
replicas: 1
selector:
matchLabels:
app: sv-mariadb1011
strategy:
type: Recreate
template:
metadata:
labels:
app: sv-mariadb1011
spec:
containers:
- env:
- name: MARIADB_DATABASE
valueFrom:
configMapKeyRef:
key: MARIADB_DATABASE
name: sv-mariadb11-txt
- name: MARIADB_PASSWORD
valueFrom:
configMapKeyRef:
key: MARIADB_PASSWORD
name: sv-mariadb11-txt
- name: MARIADB_ROOT_PASSWORD
valueFrom:
configMapKeyRef:
key: MARIADB_ROOT_PASSWORD
name: sv-mariadb11-txt
- name: MARIADB_USER
valueFrom:
configMapKeyRef:
key: MARIADB_USER
name: sv-mariadb11-txt
- name: TZ
valueFrom:
configMapKeyRef:
key: TZ
name: sv-mariadb11-txt
image: save-mariadb:gvis-saved
name: sv-mariadb1011
ports:
- containerPort: 3306
resources: {}
volumeMounts: # コンテナ内のどのディレクトリにpersistentVolumeをマウントするか
- name: mariadb1011-persistent-storage1
mountPath: /var/lib/mysql
- name: mariadb1011-persistent-storage2
mountPath: /etc/mysql/conf.d
hostname: svmariadb1011
restartPolicy: Always
volumes:
- name: mariadb1011-persistent-storage1
persistentVolumeClaim:
claimName: gvis-pv-mariadb1011-claim
# name=gvis-pv-mariadb1011-claimを使って、マウントできるPVを探す
- name: mariadb1011-persistent-storage2
persistentVolumeClaim:
claimName: gvis-pv-mariadb1011conf-claim
# name=gvis-pv-mariadb1011conf-claimを使って、マウントできるPVを探す
|
mariadbのservice#
内容はこんな感じ。
何番のポートを使うかってのを書いとく。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
apiVersion: v1
kind: Service
metadata:
labels:
app: sv-mariadb1011
name: sv-mariadb1011
spec:
type: ClusterIP
ports:
- name: "13306"
port: 13306
targetPort: 3306
selector:
app: sv-mariadb1011
|
mariadbへのデータ流し込み#
mysqlもmariadbも、データのエクスポートは簡単。
データベース作って、テーブル作って、レコードをinsertするsqlのテキストファイルが出力される。
postgresqlも同じ。
GCPのDBデータは、tar.gzで固めてコピーしてきたらlocal ubuntu22の中でそのまま使えるけど、minikubeにはそのまま持って来れず。
そこで、local ubuntu22の中のmariadbから、定期的に
定義やデータをエクスポートする処理
を復活させた。
このエクスポートをPodにインポートして使う。
Podの中で動かす処理は
このへんのリストア処理
にある「4_nariDB_DjangoRecover.sh」とかをPodの中に置いといて使う。
エクスポート結果はwindowsホストからはMドライブとして見えるようにしてて、それをminikubeに取り込む処理をtera termマクロで書いて使うとデータの流し込みができる。
エクスポート結果をminikube環境にコピーして、pod/pv/pvcのあるフォルダに移動して作り直し、インポート終わったらmariadbの設定の一部とテーブルの件数を表示させてエクスポートされてきたファイルはデカいから潰す。
内容はこんな感じ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
include 'Y:\94_connect\connect\teraIni\gvis.ini'
SOURFILE1 = 'M:\nariDockerDat\cl_nari\nariDB_1st\FullBackup_nariDB_1st.sql'
DESTFILE1 = '/Users/nari/Documents/personal/minikube/nariDockerDat/sv_mariadb11conf/nari/FullBackup_nariDB_1st.sql'
SOURFILE2 = 'M:\nariDockerDat\cl_nari\nariDB_Django\FullBackup_nariDB_Django.sql'
DESTFILE2 = '/Users/nari/Documents/personal/minikube/nariDockerDat/sv_mariadb11conf/nari/FullBackup_nariDB_Django.sql'
; --- 接続 --------------
conSTR = 'gvis-mac.intra.gavann-it.com /ssh /2 /auth=password /user=nari /passwd='
strconcat conSTR gvis_macP
strconcat conSTR ' /F='
strconcat conSTR gvis_iPTH
strconcat conSTR 'gray.INI '
strconcat conSTR '/timeout='
strconcat conSTR gvis_TOUT
; ---debug --------------
; messagebox conSTR 'info'
connect conSTR
if result <> 2 goto end
wait "nari@gvis-mac ~ %"
scpsend SOURFILE1 DESTFILE1
scpsend SOURFILE2 DESTFILE2
wait "nari@gvis-mac"
sendln 'cd /Users/nari/Documents/personal/minikube'
wait "nari@gvis-mac"
sendln 'kubectl delete -f sv-mariadb1011-deployment.yaml'
wait "nari@gvis-mac"
sendln 'kubectl delete -f gvis-PersistentVol-mariadb1011conf.yaml'
wait "nari@gvis-mac"
sendln 'kubectl delete -f gvis-PersistentVol-mariadb1011.yaml'
wait "nari@gvis-mac"
sendln 'minikube ssh'
wait "$"
sendln 'sudo su -'
wait "#"
sendln 'cd /data'
wait "#"
sendln 'rm -fR ./gvis-pv-mariadb1011 ; rm -fR ./gvis-pv-mariadb1011conf ; sync ; sync '
wait "#"
sendln 'mkdir gvis-pv-mariadb1011conf ; mkdir gvis-pv-mariadb1011'
wait "#"
sendln 'cp -pR /minikubeMac/nariDockerDat/sv_mariadb11conf/* ./gvis-pv-mariadb1011conf/'
wait "#"
sendln 'exit'
wait "$"
sendln 'exit'
wait "nari@gvis-mac"
sendln 'kubectl create -f gvis-PersistentVol-mariadb1011conf.yaml'
wait "nari@gvis-mac"
sendln 'kubectl create -f gvis-PersistentVol-mariadb1011.yaml'
wait "nari@gvis-mac"
sendln 'kubectl create -f sv-mariadb1011-deployment.yaml'
wait "nari@gvis-mac"
sendln 'sleep 10'
wait "nari@gvis-mac"
sendln "kubectl exec -it `kubectl get pod | grep mariadb | awk '{print $1}'` -- bash"
wait "root@svmariadb1011"
sendln '/bin/sh /etc/mysql/conf.d/nari/fullback/2_fullRecover.sh'
wait "root@svmariadb1011"
sendln '/bin/sh /etc/mysql/conf.d/nari/fullback/4_nariDB_DjangoRecover.sh'
wait "root@svmariadb1011"
sendln 'rm /etc/mysql/conf.d/nari/FullBackup_nariDB_1st.sql'
wait "root@svmariadb1011"
sendln 'rm /etc/mysql/conf.d/nari/FullBackup_nariDB_Django.sql'
wait "root@svmariadb1011"
sendln 'mysql -unari -pXXXXXXXXX'
wait "MariaDB"
sendln "show variables like 'max_allowed_packet' ; "
wait "MariaDB"
sendln 'show databases ; '
wait "MariaDB"
sendln 'use nariDB_1st ; '
wait "MariaDB"
sendln 'select count(*) from GVIS_keihi ; '
wait "MariaDB"
sendln 'exit '
wait "nari@gvis-mac"
delSTR = 'rm -f '
strconcat delSTR DESTFILE1
sendln delSTR
wait "nari@gvis-mac"
delSTR = 'rm -f '
strconcat delSTR DESTFILE2
sendln delSTR
end
|
mariadbの動作確認#
Pod単体の起動確認をたとえばwindows側からa5sql使ってやるとこうなる。

はい、できたー。
ここまで書いて、続きはまた今度。