新しいめのmacminiでM4とはいえ、x86エミュレートさせるとめっちゃ処理重くて使い物にならんかった。
後でチューニングできる箇所見つけられるかもしれんけど、すぐにツボは発見できず。
x86エミュレートでkubernetesを維持するには苦しいので、x86のwindows側で動くlinuxホストと同列でkubernetes用のlinuxホストを作る。
爆速期待。
macminiの中は、arm64でdjango/httpsとmariadbのみのkubernetesクラスタを別で目指す。
作成イメージ
x86ホストを用意して⭐️印箇所を作ってく。
<----------- M4 mac -----------> <--------------------- Windows11 pro VMware ---------------------> <-------- Google cloud -------->
+-macmini sequoia--------------+ +-local ubuntu24 linux ⭐️----+ +-local ubuntu24 linux--------+ +-GCE ubuntu24 linux----------+
| +-utm----------------------+ | | +-microk8s-------+ +-vmdk-+ | | +-docker---------+ +-vmdk-+ | | +-docker---------+ +--pv--+ |
| | +-sequoia-------------+ | | | | +-Pod-------+ | | data | | | | +-container-+ | | data | | | | +-container-+ | | data | |
| | | vscode/cyberduck | | | | | | Django | | | d1 | | | | | Django | | | d1 | | | | | Django | | | d1 | |
| | | office/brew/rdp | | | | | +-----------+ | +------+ | | | +-----------+ | +------+ | | | +-----------+ | +------+ |
| | +---------------------+ | | | | +-Pod-------+ | | | | | | +-container-+ | | | | | | +-container-+ | | | |
| | +-ubuntu24 x86️------+ | | | | | | mariadb | | | d2 | | | | | mariadb | | | d2 | | | | | mariadb | | | d2 | |
| | | ctr microk8s | | | | | +-----------+ | +------+ | | | +-----------+ | +------+ | | | +-----------+ | +------+ |
| | |+-container-+ | | | | | +-Pod-------+ | | | | | | +-container-+ | | | | | | +-container-+ | | | |
| | ||kubernetes | | | | <- | | | xrdp-ubu24| | | d3 | | <- | | | xrdp-ubu24| | | d3 | | <- | | | xrdp-ubu24| | | d3 | |
| | |+-----------+ | | | <- | | +-----------+ | +------+ | <- | | +-----------+ | +------+ | <- | | +-----------+ | +------+ |
| | |+-container-+ +/data+| | | <- | | | | <- | | | | <- | | +-container-+ | |
| | ||Django | | d1 || | | | | | | | | | | | | | gitlab | | |
| | |+-----------+ +-----+| | | | | | | | | | | | | +-----------+ | |
| | |+-container-+ | || | | | | +-Pod-------+ | +------+ | | | +-container-+ | +------+ | | | +-container-+ | +------+ |
| | ||mariadb | | d2 || | | | | | https | | | d4 | | | | | https | | | d4 | | | | | https | | | d4 | |
| | |+-----------+ +-----+| | | | | +-----------+ | +------+ | | | +-----------+ | +------+ | | | +-----------+ | +------+ |
| | |+-container-+ | || | | | +----------------+ | | +----------------+ | | +----------------+ |
| | ||xrdp-ubu24 | | d3 || | | +-----------------------------+ +-----------------------------+ +-----------------------------+
| | |+-----------+ +-----+| | |
| | |+-container-+ +-----+| | | +--smb share ⭐️---------------+
| | ||https | | d4 || | | | windows smb share |
| | |+-----------+ +-----+| | | +-----------------------------+
| | +---------------------+ | |
| +--------------------------+ |
| |
| +-music----------+ |
| | 8400(37GB) | |
| +----------------+ |
+------------------------------+
vmwareで普通にノード足す
インストール10分以内で終わる。UTMで設定したリソースと同じCPU/メモリ/ディスク/IPアドレスを割り当てて、Ubuntu24serverをサービス一切選択せずすっぴん状態でインストールして用意しとく。
mac内で使ってたkubernetesのために使う領域をwindowsホストの中にコピーしといて、共有領域使ってマウントさせる。
仮想マシンの設定
このへんの設定をやってく。
microk8sではkubectlはrootユーザで使うときの文字列が長いからエイリアス作っとく。
alias kubectl='microk8s kubectl'
IPを引き継がせたら宅内DNSの効き目のおかげでmacから即接続できる。
共有フォルダ使う
windowsホスト母艦にしてて、その中にkubernetesの領域用意しとく。
vmwareの共有機能でもええかなと思ったけど、ちゃんと動かん箇所あったからsmb共有をマウント利用した。
vmwareのフォルダ共有ではアカン
UTMでフォルダの共有はfstabに書いて使った。vmwareやとちょっと違う。
長いことvmware使ってるけど、親ホストとの共有機能って一回もやったことなかったな。やってみよか。
linuxでsamba動かしてるから、そこばっかり使ってたしな。
mountするにはどうしたらええか探してみた。
実施されてる方がおられた。作者さんありがとう。
コマンドラインでやるってことは、fstab使わんのやね。代わりにfuse使うみたい。
OS起動したときにマウントするにはどないしたらええんやろ。
解説して実施されてる方がおられた。作者さんありがとう。
自分用にアレンジして自動マウントやってみた。
root@kubelinux:~# cat /etc/systemd/system/vmware-shared-folders.service
[Unit]
Description=VMware Shared Folders Mount
[Service]
Type=forking
ExecStart=/usr/bin/vmhgfs-fuse .host:/ /microk8s/ -o allow_other,uid=1000 ⭐️ルートのmicrok8sフォルダにマウントするコマンドライン
[Install]
WantedBy=multi-user.target
root@kubelinux:~#
root@kubelinux:~# mkdir /microk8s ⭐️マウントポイントね
root@kubelinux:~# /usr/bin/vmhgfs-fuse .host:/ /microk8s/ -o allow_other,uid=1000 ⭐️マウントするコマンドラインのテスト
root@kubelinux:~# df -h | grep microk8
vmhgfs-fuse 466G 237G 229G 51% /microk8s ⭐️つながる
root@kubelinux:~# echo aaa >> /microk8s/kubernetes/foo.txt ⭐️書き込みテストしてみる
root@kubelinux:~# cat /microk8s/kubernetes/foo.txt ⭐️読み込みテストできてるやん
aaa
root@kubelinux:~# ls -l /microk8s/kubernetes/
total 1
-rwxrwxrwx 1 nari root 5 Dec 21 23:26 foo.txt ⭐️マウントするコマンドラインがきいてて、uid=1000=nariの所有権になってる
root@kubelinux:~#
root@kubelinux:~# systemctl daemon-reload ⭐️サービス定義をデーモンとして認識させる
root@kubelinux:~# systemctl enable vmware-shared-folders.service ⭐️サービス有効化
Created symlink /etc/systemd/system/multi-user.target.wants/vmware-shared-folders.service → /etc/systemd/system/vmware-shared-folders.service.
root@kubelinux:~# systemctl status vmware-shared-folders.service ⭐️presetがenableになってる確認
○ vmware-shared-folders.service - VMware Shared Folders Mount
Loaded: loaded (/etc/systemd/system/vmware-shared-folders.service; enabled; preset: enabled)
Active: inactive (dead)
root@kubelinux:~#
なるほど。これでOS再起動したら自動マウントできてた。
microk8sのデータをwindows側でコピーしたら、マウントしたフォルダで見えるようになった。
root@kubelinux:~# ls -l /microk8s/kubernetes/
total 27
-rwxrwxrwx 1 nari root 809 Dec 22 08:38 cl-ubun-pod.yaml
-rwxrwxrwx 1 nari root 1393 Dec 22 08:38 gvis-PersistentVol-mariadbconf.yaml
-rwxrwxrwx 1 nari root 1361 Dec 22 08:38 gvis-PersistentVol-mariadb.yaml
-rwxrwxrwx 1 nari root 1405 Dec 22 08:38 gvis-PersistentVol-sv_django-ssl_certs.yaml
-rwxrwxrwx 1 nari root 1414 Dec 22 08:38 gvis-PersistentVol-sv_django-uwsgi-nginx.yaml
-rwxrwxrwx 1 nari root 1352 Dec 22 08:38 gvis-PersistentVol-ubun.yaml
-rwxrwxrwx 1 nari root 12 Dec 22 08:38 kubernetes.txt
drwxrwxrwx 1 nari root 4096 Dec 22 08:38 log
-rwxrwxrwx 1 nari root 280 Dec 22 08:38 mariadb-txt-configmap.yaml
drwxrwxrwx 1 nari root 4096 Dec 22 08:41 nariDockerDat
drwxrwxrwx 1 nari root 4096 Dec 22 08:38 script
-rwxrwxrwx 1 nari root 839 Dec 22 08:38 sv-django-pod.yaml
-rwxrwxrwx 1 nari root 211 Dec 22 08:38 sv-django-service.yaml
-rwxrwxrwx 1 nari root 1003 Dec 22 08:38 sv-https-portal-pod.yaml
-rwxrwxrwx 1 nari root 287 Dec 22 08:38 sv-https-portal-service.yaml
-rwxrwxrwx 1 nari root 1899 Dec 22 08:38 sv-mariadb-pod.yaml
-rwxrwxrwx 1 nari root 214 Dec 22 08:38 sv-mariadb-service.yaml
root@kubelinux:~#
scriptのフォルダあるから、クラスタ操作する運用スクリプトが使える。
logのフォルダもあるんやけど、tailしたらわけわかめなエラー出るやんけ!!
tail: cannot determine location of 'kube.log'. reverting to polling: Input/output error
ログちゃんと見せられへんのか。ちゃんと表示できんのは困る。
アカン、この方法やめ。
smb共有をマウントする
vmwareの共有機能使うのやめて、smbマウント使う。
昔にcentos使ってたときwindowsのフォルダを共有させてマウント利用させることがあったなぁ。
なんかのモジュール入れてmount使ったらええはず。
ubuntuでどうやるんやろか。説明されてる方がおられた。
作者さんありがとう。
cifs-utilsをaptしてから、マウントしたらええらしい。
root@kubelinux:~# mount -t cifs -o username=nari,password=XXXXXXXX //192.168.1.40/kubernetes /microk8s
root@kubelinux:~# ls
snap
root@kubelinux:~# dff
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 57G 8.2G 46G 16% /
/dev/sda2 2.0G 72M 1.8G 4% /boot
//192.168.1.40/kubernetes 466G 250G 217G 54% /microk8s ⭐️smbマウントして見えとる
root@kubelinux:~#
いけそうやね。
さっきvmwareの共有マウントで使ったvmware-shared-folders.service
って定義を名前変更して使えば、OS起動したときにマウントしてくれる。
root@kubelinux:/microk8s/script# mv /etc/systemd/system/vmware-shared-folders.service /etc/systemd/system/gvis-smb-folders.service ⭐️名前変える
root@kubelinux:/microk8s/script# vi /etc/systemd/system/gvis-smb-folders.service ⭐️定義変える
root@kubelinux:/microk8s/script# cat /etc/systemd/system/gvis-smb-folders.service
[Unit]
Description=gvis Shared Folders Mount
[Service]
Type=forking
ExecStart=mount -t cifs -o username=nari,password=xxxx //192.168.1.40/kubernetes /microk8s ⭐️認証とマウントポイント書いとく
[Install]
WantedBy=multi-user.target
root@kubelinux:/microk8s/script#
root@kubelinux:/microk8s/script# systemctl daemon-reload ⭐️サービス定義をデーモンとして認識させる
root@kubelinux:/microk8s/script# systemctl enable gvis-smb-folders.service ⭐️サービス有効化
Created symlink /etc/systemd/system/multi-user.target.wants/gvis-smb-folders.service → /etc/systemd/system/gvis-smb-folders.service.
root@kubelinux:/microk8s/script# systemctl status gvis-smb-folders.service
○ gvis-smb-folders.service - gvis Shared Folders Mount
Loaded: loaded (/etc/systemd/system/gvis-smb-folders.service; enabled; preset: enabled)
Active: inactive (dead)
root@kubelinux:/microk8s/script#
マウントできたし、tailできるか確認してみると、変なエラーなくなってた。
root@kubelinux:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 990M 1.4M 989M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 57G 8.2G 46G 16% /
tmpfs 4.9G 0 4.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 2.0G 72M 1.8G 4% /boot
tmpfs 990M 12K 990M 1% /run/user/1000
//192.168.1.40/kubernetes 466G 250G 217G 54% /microk8s
root@kubelinux:~#
システム起動の速度速くなった
UTMのときの起動直後はこんな感じやった。
vmwareの中のx86linux起動でかかってる時間は3.8倍速くなった。
前のと比べて、x86ネイティブになったんやから、そら速いわな。
root@kubelinux:~# systemd-analyze
Startup finished in 2.865s (kernel) + 3.071s (userspace) = 5.937s ⭐️UTMで23秒やったのがが5.9秒になって3.8倍速くなった。
graphical.target reached after 3.055s in userspace.
root@kubelinux:~# cat /run/systemd/resolve/resolv.conf | grep name
nameserver 172.16.17.15
nameserver 8.8.8.8
root@kubelinux:~# ip route
default via 192.168.1.1 dev ens32 proto static
192.168.1.0/24 dev ens32 proto kernel scope link src 192.168.1.119
root@kubelinux:~#
クラスタ作成
運用スクリプト作っててよかった。
クラスタ作ったらブラウザでコンソールにトークン入力してログインしてみる。
おお、コンフィグマップもpvもちゃんとできとる。
標準出力はこうなってた。
root@kubelinux:/microk8s/kubernetes/script# sh ./300_kubeClusterRecreate.sh
--- kube Data save ready ? ---(y/N):y
--- kube Recreate cluster ready ? ---(y/N):y
/microk8s/kubernetes/log/kube.log
snap "microk8s" is not installed
usermod: group 'snap_microk8s' does not exist
Infer repository core for addon registry
Infer repository core for addon hostpath-storage
Infer repository core for addon hostpath-storage
Infer repository core for addon host-access
persistentvolume/gvis-pv-mariadb created
persistentvolumeclaim/gvis-pv-mariadb-claim created
persistentvolume/gvis-pv-mariadbconf created
persistentvolumeclaim/gvis-pv-mariadbconf-claim created
persistentvolume/gvis-pv-django-sslcerts created
persistentvolumeclaim/gvis-pv-django-sslcerts-claim created
persistentvolume/gvis-pv-django-uwsgi-nginx created
persistentvolumeclaim/gvis-pv-django-uwsgi-nginx-claim created
persistentvolume/gvis-pv-ubun created
persistentvolumeclaim/gvis-pv-ubun-claim created
configmap/sv-mariadb-txt created
service/sv-django created
service/sv-https-portal created
service/sv-mariadb created
NAME STATUS ROLES AGE VERSION
kubelinux Ready <none> 20s v1.32.0
root@kubelinux:/microk8s/kubernetes/script# Checking if Dashboard is running.
Infer repository core for addon dashboard
Infer repository core for addon metrics-server
Waiting for Dashboard to come up.
Trying to get token from microk8s-dashboard-token
Waiting for secret token (attempt 0)
Dashboard will be available at https://127.0.0.1:10443
Use the following token to login:
吐かれたログはこんなん。1分かからず作り終わってるんやね。
root@kubelinux:/microk8s/log# tail -f kube.log
---Recreate start---
-------- 2024-12-24_04:42:30 --------
microk8s removed
-------- 2024-12-24_04:42:56 --------
microk8s (1.32/stable) v1.32.0 from Canonical** installed
Enabling default storage class.
WARNING: Hostpath storage is not suitable for production environments.
A hostpath volume can grow beyond the size limit set in the volume claim manifest.
deployment.apps/hostpath-provisioner created
storageclass.storage.k8s.io/microk8s-hostpath created
serviceaccount/microk8s-hostpath created
clusterrole.rbac.authorization.k8s.io/microk8s-hostpath created
clusterrolebinding.rbac.authorization.k8s.io/microk8s-hostpath created
Storage will be available soon.
namespace/container-registry created
persistentvolumeclaim/registry-claim created
deployment.apps/registry created
service/registry created
configmap/local-registry-hosting configured
The registry will be created with the size of 30Gi.
Default storage class will be used.
Addon core/hostpath-storage is already enabled
Setting 10.0.1.1 as host-access
Host-access is enabled
-------- kubernetes cluster created --------
-------- 2024-12-24_04:43:34 --------
エイリアス定義もきいとるやん。
root@kubelinux:~# alias | grep kube
alias kubectl='microk8s kubectl'
root@kubelinux:~# kubectl get nodes,services
NAME STATUS ROLES AGE VERSION
node/kubelinux Ready <none> 15m v1.32.0
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 15m
service/sv-django ClusterIP 10.152.183.88 <none> 38080/TCP 14m
service/sv-https-portal ClusterIP 10.152.183.41 <none> 30080/TCP,30443/TCP 14m
service/sv-mariadb ClusterIP 10.152.183.247 <none> 13306/TCP 14m
root@kubelinux:~#
エイリアスはsshでコマンドライン使ってるときだけ有効やから、運用スクリプトの中はmicrok8s kubectl
って書かなアカン。
dockerイメージをインポート
teratermマクロ少し書き換えてdockerイメージの元ファイルをx86のkubernetes環境へscpコピーさせる。
コピー終わってgunzipする。
UTMの中のubuntuとは違って、共有フォルダ直接読み込めるのでイメージをインポートする。
このインポートやってる間はcpuもディスクI/Oもまぁまぁ食う。
maridbのデータコピーまで、M4のx86エミュレートに比べて半分ぐらいの10分ぐらいで終わる。
コピーしたらPod作らせる。
コマンドライン結果は長いけどteratermマクロで動くのは一瞬。楽ですなぁ。
永続化領域のコピー
mariadbのデータから流し込んでった。
永続化領域に定義したmax_allowed_packet
が生きててデータ入ってくれてる。
静止画じゃ表現できんけど、応答速度速くなってる。
djangoのアプリケーションコンテナもちゃんと流し込む。
x86のホストを作ったけど、macで作ったときのホスト名とIPをそのまま設定したから、settings.pyの定義変更せずにそのまま使った。
kubernetesのコンソール見ると、ちゃんとPod動いとる。
フォワーディング
mariadbとxrdpとdjangoコンテナをフォワーディングする。
windows側からデータベース接続だけ確認してみる。
ちゃんとパラメータ渡ってるし業務データあるやん。
djangoアプリからデータベース読めてる。
djangoの管理コンソールも認証できてるから、管理データベースもOK。
ネットワークの速度もdocker環境とほぼ同じで動いたから、x86のkubernetes環境できたな。
mac側はx86エミュレーションのlinuxはこれから捨てる。
GUIのコンテナ環境ないから、rancherのdocker/kubernetes環境でも作ってみよっかな。