minikubeを利用2-mariadbのPod作る

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からコピーする。

+-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のサービスのマニフェストも用意した。

  1. *mariadb 3306 ->13306
  2. *Django 8080 ->38080
  3. *https 80,443->30080,30443
  4. *d1 Django用永続化領域 1GiB
  5. *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の定義はこんな感じ。

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
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から名前引き確認してみる。

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を使用する
ConfigMapを使用すると、設定をイメージのコンテンツから切り離して、コンテナ化されたアプリケーションの移植性を維持できます。このページでは、ConfigMapを作成し、ConfigMapに保存されているデータを使用してPodを構成する...

gkeだと使い方はこのへんにある。

ConfigMap  |  Google Kubernetes Engine(GKE)  |  Google Cloud

komposeが作ってくれたものを丸パクリしてて内容はこんな感じ。

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

永続化領域の解説がサイトにあるから、最初はこのへん読んだ。

Minikubeを使用してローカル環境でKubernetesを動かす
Minikubeはローカル環境でKubernetesを簡単に実行するためのツールです。Kubernetesを試したり日々の開発への使用を検討するユーザー向けに、PC上のVM内でシングルノードのKubernetesクラスターを実行することがで...
永続ボリューム
MinikubeのVMはtmpfsで起動するため、ほとんどのディレクトリーは再起動しても持続しません (minikube stop)。 
しかし、Minikubeは以下のホストディレクトリーに保存されているファイルを保持するように設定されています:
 /data
 /var/lib/minikube
 /var/lib/docker

minikubeで維持するフォルダは決まってるらしい。
pvには種類がある。

Persistent Volumes
This document describes persistent volumes in Kubernetes. Familiarity with volumes is suggested. Introduction Managing s...

mysql/mariadbでpvc/pvはどう使うのか参考にさせてもらった。
作者さんありがとう。

kubernetesでMysqlを動かしてみる - Qiita
k8sの勉強としてMySQLを動かしてみました。単に動かすだけならk8sのtasksに載ってる通り↓やればできたのですが、Run a Single-Instance Stateful Appli…
Kubernetes: PersistentVolume概要とminikubeでの検証 - Qiita
Kubernetes Persistent Volume の概要 Kubernetes では,Persistent Volume として,外部ストレージに Pod のデータの格納する方法が提供され…

pvcで要求して、pvを使うって感じか。

自分で使ってる内容はこんな感じ。
まずは設定ファイル置き場用。

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を使用する

データ置き場用にもういっちょ。

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を動かしてみる - Qiita
k8sの勉強としてMySQLを動かしてみました。単に動かすだけならk8sのtasksに載ってる通り↓やればできたのですが、Run a Single-Instance Stateful Appli…

使ってる内容はこんな感じ。
my.cnfとかに書きたい内容あるし、インポートの処理も使いたいからpvc/pvを使ってる。

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

内容はこんな感じ。
何番のポートを使うかってのを書いとく。

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の設定の一部とテーブルの件数を表示させてエクスポートされてきたファイルはデカいから潰す。

内容はこんな感じ。

include 'Y:_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使ってやるとこうなる。

gvis-minikubeAPL

はい、できたー。

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

タイトルとURLをコピーしました