【自分用】作成物のまとめ(2022/4/12更新)
- 本記事で行うこと
- モチベーション
- サマリ
- 作成物
- 自宅kubernetes環境 (rancher/rke2)
- 資産設計シミュレーションWebアプリ
- Slack Botで家電操作
- 家電操作Webアプリ(Flask Nature Remo)
- Slackもどき (Websocket勉強用)
- 家電操作Webアプリ v2 (Vue Nature Remo)
- 家電操作モバイル向けWebアプリ v3 (Vue Nature Remo PWA)
- ファイルアップローダー (fiber-file-uploader)
- Web時計 ランダム英語表示 (english-web-clock)
- container buildツール (build-ops-container)
- 資産設計シミュレーションWebアプリ (vue.js版, 追加開発中)
- Web Terminal (プロトタイプ作成, 追加開発中)
- その他画面なし
- 読み方登録
- 感想
本記事で行うこと
- いままで趣味で作成したものを振り返る
- あくまでも仕事で作成したものは含まない
- 自分の記録用
モチベーション
- 今まで趣味でなにを作ったのかをまとめて見たくなったため。
- 後で見返して、今後の設計に活かすため。
サマリ
ページ内リンク | 技術スタック | git |
---|---|---|
自宅kubernetes環境 (rancher/rke2) | kubernetes, rancher, rke2, dnsmasq, nginx ingress controller, istio, Longhorn, prometheus, ansible | ※非公開repo https://github.com/n-guitar/private-server-ansible https://github.com/n-guitar/private-cluster |
資産設計シミュレーションWebアプリ | Python3, Django3, sqlite, Bootstrap, chartjs2 | ※非公開repo https://github.com/n-guitar/personal_finance |
Slack Botで家電操作 | Python3, slackbot | ※非公開repo https://github.com/n-guitar/family-bot |
家電操作Webアプリ(Flask Nature Remo) | Python3, Flask, javascript | https://github.com/n-guitar/flask-natuer-remo |
Slackもどき (Websocket勉強用) | Python3, Django3, Websocket | https://github.com/n-guitar/django-webchat/tree/webchat-chat-room-design |
家電操作Webアプリ v2 (Vue Nature Remo) | vue.js2,vuex3, vuetify2 | https://github.com/n-guitar/vue-natuer-remo |
家電操作モバイル向けWebアプリ v3 (Vue Nature Remo PWA) | vue.js2,vuex3, vuetify2, PWA | ※非公開repo https://github.com/n-guitar/vue-natuer-remo-pwa |
ファイルアップローダー (fiber-file-uploader) | vue.js2, golang, fiber | https://github.com/n-guitar/fiber-file-uploader |
Web時計 ランダム英語表示 (english-web-clock) | vue.js2, nuxt.js2, Bootstrap4, v-calendar, dayjs | ※非公開repo https://github.com/n-guitar/english-web-clock |
container buildツール (build-ops-container) | Frontend: vue.js2, nuxt.js2, vuetify Backend: golang, fiber, sqlite, gorm, img |
※非公開repo https://github.com/n-guitar/build-ops-container-ui https://github.com/n-guitar/build-ops-container |
資産設計シミュレーションWebアプリ (vue.js版, 追加開発中) | Frontend: vue2, nuxt.js2, vuetify, apexcharts Backend: python3, fastapi, pydantic, sqlalchemy |
※非公開repo https://github.com/n-guitar/private_fp_ui https://github.com/n-guitar/private_fp_api |
Web Terminal (プロトタイプ作成, 追加開発中) | Frontend: vue.js2, xterm.js Backend: python3, fastapi, websocket, paramiko ※vue3, typescriptで本格開発予定 |
※非公開repo |
作成物
自宅kubernetes環境 (rancher/rke2)
構成イメージ
利用ステータス
アプリ実行環境として運用中技術スタック
kubernetes, rancher, rke2, dnsmasq, nginx ingress controller, istio, Longhorn, prometheus, ansible機能・こだわり
code-serverやjupiter notebookを使うことデプロイしておくことで、低スペックのchromebookからもお風呂で開発できるようになった。
private registryの許可設定をして、自作containerをpull/runできるようにしている。
wildcard dns、nginx ingress controllerを利用し、自己証明をPC/iPhoneにインストールすることでurlベースアクセス&tls/sslを実現
マシンスペック節約のため、軽量なkubernetesディストーションのrke2を採用。
rancher自体はdockerを利用しているが、rke2ではdockerは利用していない。モチベーション・感想
Cloudでも良かったのだが、なんとなくお金を払うのが嫌で自宅で基盤を用意することにした。
実は停電や予期せぬ障害で何度か作成し直していて、最終的に今の軽量なRKE2に落ち着いた。
自作アプリをすぐに家庭内に展開できるのでそれなりに満足している。
普通に仕事と同じく、家庭の基盤も障害復旧やメンテナンス、定期バックアップなどの運用している。
ちなみにUPSを購入し、停電は怖くなくなった。
資産設計シミュレーションWebアプリ
画面イメージ
利用ステータス
稼働停止
後にvue.jsで再作成したため。機能・こだわり
プラス資産・マイナス資産と資産推移をグラフで表現し、視覚的にマイナスになってしまうところがすぐに分かるようにしたところ
chartjsで表示できるように、配列の0埋め、プラス資産の繰越計算結果の配列の作成
シンプルにするために1テーブルで実現技術スタック
Python3, Django3, sqlite, Bootstrap, chartjs2モチベーション・感想
自分の家庭の資産設計シミュレーションを行いたかったため作成した。
おそらくこれがDjangoで作成した後にちゃんと使ってた最初のWebアプリケーションだと思う。
確か会社の(STEP休暇)長期休暇中に
Slack Botで家電操作
画面イメージ
利用ステータス
稼働停止
正直あまり使わなかったため。機能・こだわり
NatureRemoのApiを、Slack bot経由で実行する。
正規表現で曖昧な言葉でも反応してくれる。技術スタック
Python3, slackbot
https://github.com/scrapinghub/slackbotモチベーション・感想
リモートの打ち合わせ中に声を出さずにエアコンや照明をコントロールしたかった。
かなり簡単に実装できるため、別用の用途でまた使って見るかもしれない。
家電操作Webアプリ(Flask Nature Remo)
- 画面イメージ
利用ステータス
稼働停止
後にvue.jsで再作成したため。技術スタック
Python3, Flask, javascript機能・こだわり
NatureRemoのApiを、Webアプリ経由で実行する。
Top画面をアップロードして変更できる
css,Javascript部分はフレームワークを使わず一からすべて書いた。モチベーション・感想
タブの切り替え部分は苦労したのを覚えているが、こうやって実現しているんだというのがわかった気がする。
iPadからでも反応するように、window.ontouchstart ? 'touchstart' : 'click';を記載しないと行けないのかということに初めて気がついた。
CSSを全部書くのはかなり大変だった記憶。
Slackもどき (Websocket勉強用)
画面のイメージ
利用ステータス
稼働停止
勉強用のため。技術スタック
Python3, Django3, Websocket機能・こだわり
任意のチャンネルにメッセージをブロードキャストする。
django channelsを使わずに実装。モチベーション・感想
作成当時、djangoがまだ非同期(ASGI)に対応したばかりで、実装例が英語圏のサイトでもほとんどなかったと思う。
ASGIってそもそも何?からWebsocket仕様まで詳しくなったきっかけだと思う。
家電操作Webアプリ v2 (Vue Nature Remo)
画面のイメージ
利用ステータス
PWA版と併用して利用中技術スタック
vue.js2,vuex3, vuetify2機能・こだわり
基本的にはFlask版と同じ機能
Tokenを起動時ではなく、起動後に画面から設定する方式(LocalStorage or Vuex.Storeに保存)に変更モチベーション・感想
Flask版では起動時に環境変数として、Tokenの設定が必要であったが画面から設定できるようにしてみた。
BrowserのCookie、LocalStorageの仕組みについて学んだと思う。
LocalStorage保存モードはセキュアではないが、家庭内だけ利用ということでOKとし、最低限画面上から削除も同時にできるようにした。
子コンポーネントから設定したTokenを親やその他のコンポーネントから利用する作りであり、createdイベントのときにLocalStorageやstoreからいちいち取得してくる仕様になっている。親で取得して、propsで渡せばよかったと正直思っており作りが微妙・・・。
この反省は、PWA版の設計に取り入れることとした。
家電操作モバイル向けWebアプリ v3 (Vue Nature Remo PWA)
- 画面のイメージ
利用ステータス
Web版と併用して利用中技術スタック
vue.js2,vuex3, vuetify2, PWA機能・こだわり
PWA(Progressive Web Apps)の技術を使い、嫁さんにアプリインストールさせることなく家電操作機能を提供。
機能はWeb版とほぼ同じだが、一括で照明を消す機能を追加。モチベーション・感想
アプリインストールなく嫁さんにアプリ機能を提供したかった。
今でも利用してくれて嬉しい。
ほぼすべてのアプリは自宅のkubernetes上で稼働しているのだが、kubernetesが障害中でもPWAとして機能していてPWAすげーと思った。
PWAの実装例が当時あまりなくて、service-workerって何やねんって思ってた。
※ここまで記載
ファイルアップローダー (fiber-file-uploader)
画面のイメージ
利用ステータス
利用中。技術スタック
vuejs2, golang, fiber
https://github.com/gofiber/fiber機能・こだわり
特定のディレクトリに、複数のファイルを同時にアップロードする。モチベーション・感想
自宅サーバに手元のMacからファイルの移動を行いたかったため。
golangのfiberのwebフレームワークを使ってみたかったため。
FlontendからFormで複数同時にfiber側で受け取り方法を模索した気がする。
fiberがかなり使いやすかったので、後にBackendとしてたまに使うことになる。
Front画面はvue.js2だがあえて、CDNから持ってきてindex.htmlのみのファイルとした。
Web時計 ランダム英語表示 (english-web-clock)
画面のイメージ
利用ステータス
利用中。技術スタック
vue.js2, nuxt.js2, Bootstrap4, v-calendar, dayjs機能・こだわり
時計を表示。
一定間隔ごとに表示する英文を更新。モチベーション・感想
nuxt.jsを使ってみたかった。
手元のタブレットで時間を表示したかった。
英語を常に見る習慣をつけて置きたかった。
nuxt.jsはrouterとか設定する必要がなくて便利だなーと思った。
このとき初めてプラグインやモジュールをどうやってnuxt.jsに追加するかを調べた気がする。
container buildツール (build-ops-container)
画面のイメージ
利用ステータス
停止中。
そんなに利用頻度が高くなく、ほぼ使っていないので停止中とした。技術スタック
Frontend: vue.js2, nuxt.js2, vuetify
Backend: golang, fiber, sqlite, gorm, img機能・こだわり
FrontendからBackendのAPIを実行し、DBの登録、gitコマンド、imgコマンドを実行する。
container内部から実行することを想定し、containerないからgit clone&container build&container registry登録を行う。モチベーション・感想
手元がM1 Macでkubernetes環境がIntel環境だったため、M1 Macでbuildしたcontainerイメージをpushしてしまうと、kubernetes上で動作しないため、じゃぁWeb画面でポチッと押すだけでregistryへの登録までやろうというのが発端。
Racnher付属の機能でbuild機能があるのだが、rancher.yamlなるものをgithubに登録したくなかったので作成。
Jenkins等使おうと思ったが、使う機能は限られているので、作って見ようと思った。
alpine linux containerからprivate registryにpushするまでそこそこハマった気がする。
imgを使った理由はdockerをalpineかにdocker in dockerみたいな感じでインストールしたくなかった。
golang経由でdbを更新するのを久しぶりに行った気がする。
gormを使うことで、起動時にtableを作成してくれるのは便利だなーと思った記憶がある。
資産設計シミュレーションWebアプリ (vue.js版, 追加開発中)
- 画面のイメージ
利用ステータス
利用中。
追加開発中。技術スタック
Frontend: vue2, nuxt.js2, vuetify, apexcharts
Backend: python3, fastapi, pydantic, sqlalchemy機能・こだわり
基本機能はDjango版と同じ。
グラフ上のクリックイベントを拾って右側に詳細を表示する。モチベーション・感想
fastapiの公式チュートリアルをAdvancedも含めて一度全部やってみたのだが、かなり使いやすくメインのBackendではfastapiにしようとなり、とりあえず開発してみようと思ったのがきっかけ。
Djangoよりかっこよくしたかったのだけれども、あまりかっこよくならなくてUIの難しさも知った気がする。(デザイナーってすごい)
chartjs→apexchartsに変更している。これはchartjsがnuxt.jsでうまく動作しなかったからに起因する。
gitのissue上で、対応が間に合っていないのを知り、OSSの資金面・開発斜面での難しさを思い知った。
jsの世界で貢献できる余裕がなく・・・申し訳ない気持ちになった。
Web Terminal (プロトタイプ作成, 追加開発中)
- 画面のイメージ
利用ステータス
開発中。技術スタック
Frontend: vue.js2, xterm.js
Backend: python3, fastapi, websocket, paramiko
このタイミングでvue3, typescriptに置き換えを検討中。機能・こだわり
web browserでserverにssh接続し、対話型で操作する。モチベーション・感想
Frontend(websocket) → Backend(websocket) → ssh → serverで処理する部分が結構ハマった。
そうしても、sshの部分でsocket通信の部分でblockingしてしまい、コマンド結果を正しく画面に返せなかった。
このblocking部分をどうやって突破するか一週間位かかったと思う。
最終的に、threading + asyncioで突破することができたけど、ここまで来るのが長かった。
実はtornadoで実装している例はgithub上に行く使ったが、絶対に使わずいこうと決めていた。
実はこれを開発するために、websocketを学んでいた部分はある。
メイン機能の実装ができたので、今後このアプリをメインに開発していく。
その他画面なし
JOB実行ツール
任意のコマンドをWeb上からリモートで実行するツール。
Python, Django, paramikoで実装。
kubernetesのcronjobで十分だったため、ボツ
読み方登録
用語の読み方、意味を登録・投票するwebアプリケーション
Python, Django,実装。
vueかreactで作り直すかもしれない。
感想
- 2022/4/12時点の感想
golang, python, javascript, java, Django, flask, fastapi, SpringBoot, Fiber, vue.js, react.js, nuxt.jsあたりを主に個人開発で使ってきたが、現時点ではnuxt.js + fastapiが最も早く開発ができそう。
react.jsはhooksが出てきてから開発しやすくなったが、基本的に複雑な処理はBackendに寄せる方針なので、JSX記法の恩恵をあまり受けないなぁという印象のためvue.jsをメインとした。
現時点の仕事では、インフラディレクション業務やSRE的な業務、マネジメント系が多いので、FrontendもBackendも書くことがほぼ0ではあるが、結果的に仕事にも活用できている。
単純に自分や家庭で使うものを開発して、それを活用もしているのでテクノロジーで便利になっているのを実感できてとても楽しい。
【RKE2/rancher2.6.1】rancherからRKE2クラスターを構築する(Tech Preview - RKE2 Cluster Provisioning)
本記事で行うこと
本記事で行わないこと
- rancherの構築 ※rancherの構築は以下を参照ください。
モチベーション
- 自宅サーバが増えたので、single構成だったk3sからControlPlane、Worker、rancher、dns serverの4台構成で、改めてkubernetes環境を作りたかったため。
- せっかくなのでRKE2を使ってみたかったため。
環境
- 基本構成は以下の通り。
種別 | HW | OS | CPU | MEM |
---|---|---|---|---|
DNS | raspberry pi 3 model b+ | Ubuntu 20.04.3 LTS | Cortex-A53 4コア | 1GB |
rancher server (2.6.1) | GMK NucBox | Ubuntu 20.04.3 LTS | IntelJ4125 4コア | 8GB |
control plane, etcd, worker | GMK NucBox | Ubuntu 20.04.3 LTS | IntelJ4125 4コア | 8GB |
worker | nuc 11世代 (NUC11PABi3) | Ubuntu 20.04.3 LTS | Core i3-1115G4 2コア(4スレッド) | 32GB(カスタマイズ) |
RKE2とは
- Kubernetesのディストーションの一つで、RKEとk3sの長所をそれぞれ組み合わせたようなもの。
- 米国連邦政府部門内のセキュリティとコンプライアンスに焦点をあてて作られているようです。
- 最近のkubernetesもそうですが、dockerに依存せず、Containerを扱えます。
アーキテクチャ
- RKE2のアーキテクチャは以下のとおりです。
- くわえて、rancher側のアーキテクチャが以下の通りで、RKE2側にrancherと通信するCluster AgentのPodがデプロイされます。
- このCluster AgentからrancherのDNSを引ける必要があるので注意が必要です。
- 詳しくは公式ドキュメントを参照ください。
RKE2 - Rancher's Next Generation Kubernetes Distribution
rancherからRKE2クラスターの雛形作成
RKE2/K3s
のtoggleを選択すると、Use existing nodes and create a cluster using RKE2/K3s
のTech Previewが選択できるようになります。- Customを選択します。
Cluster Configuration
- Clusterの初期設定をします。
Basics
- RKE2のバージョン、NWプラグイン、セキュリティを選択します。
- NWプラグインはcanalを使いたいのでcanalにします。
CISは使ってみたいので、v1.6を選択します。System Services
はすべて利用したいのでデフォルトとします。
- 追記
- CISの基準を満たしていないと、Cluster Provisioningに失敗します。
- なのでCISをOFFにしてProvisioningします。
- NWプラグインについては以下のブログがわかりやすいです。
Comparing Kubernetes Networking Providers
- CIS v1.6については以下を参照ください。
CIS 1.6 Self-Assessment Guide - RKE2 - Rancher's Next Generation Kubernetes Distribution
- Basicsはそれぞれ、以下の選択肢を選べます。
Member Roles
- デフォルトとしますが、rancher側でユーザを作成してClusterへのアクセスレベルを設定できます。
Add-On Config
- デフォルトとします
Agent Environment Vars
- デフォルトとします
etcd
- デフォルトとします
- ここでetcdのバックアップ世代、時間を選択できますが、後から変更可能です。
Labels & Annotations
- デフォルトとします
Networking
- デフォルトとします
Registries
- デフォルトとします
- Pull images for Rancher from public DockerHub
Upgrade Strategy
- デフォルトとします
Advanced
- デフォルトとします
RKE2クラスターのプロビジョニング
- 雛形が完成していれば以下の通りになっています。
クラスターへの追加
- クラスター名を選択して、Registrationを開きます。
- Node Roleにチェックをします。
- 今回は自己証明書を利用しているので
Insecure: Select this to skip TLS verification if your server has a self-signed certificate.
にチェックを入れます。 - 出来上がったコマンドをコピーして、それぞれ参加させたいOS上で実行します。
- Provisioning状態でしばらく待ちます。
- 10~20分くらいすれば以下のようにActiveになります。
EXPLORE CLUSTER
から構築した、Clusterが有効化されていれば完了です。
- 最終的にworkerを加えて以下になりました。
- この環境を今後、自宅のアプリの実行基盤として利用していきます。
うまく行かないとき
- Provisioning状態からActiveにならないときの確認方法です。
RKE2プロセスの起動確認
- RKE2プロセスはsystemdで起動されているのでstatusを見ます。
# Control Planeの場合 $ sudo systemctl status rke2-server.service # Workerの場合 $ sudo systemctl status rke2-agent.service
RKE2プロセスのログ確認
# Control Planeの場合 $ sudo journalctl -u rke2-server -f # Workerの場合 $ sudo journalctl -u rke2-agent -f
kubernetesリソースの確認
- rke2のデプロイはうまく行っているが、rancherと疎通できないときはkubectlでdeploymentの状態を確認します。
- cattle-system namespaceのリソースがうまく起動できていないときは、なにかエラーが発生しています。
$ sudo export KUBECONFIG=/etc/rancher/rke2/rke2.yaml $ sudo kubectl get nodes NAME STATUS ROLES AGE VERSION nucbox-002-hkm Ready control-plane,etcd,master,worker 40m v1.21.5+rke2r2 $ sudo kubectl kubectl get all -n cattle-system NAME READY STATUS RESTARTS AGE pod/cattle-cluster-agent-78767b885c-5ttn8 1/1 Running 5 38m pod/system-upgrade-controller-679575c7b4-7j8vv 1/1 Running 0 17m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/cattle-cluster-agent ClusterIP 10.43.57.9 <none> 80/TCP,443/TCP 42m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/cattle-cluster-agent 1/1 1 1 42m deployment.apps/system-upgrade-controller 1/1 1 1 17m NAME DESIRED CURRENT READY AGE replicaset.apps/cattle-cluster-agent-75979cf449 0 0 0 41m replicaset.apps/cattle-cluster-agent-78767b885c 1 1 1 38m replicaset.apps/system-upgrade-controller-679575c7b4 1 1 1 17m $ sudo kubectl logs cattle-cluster-agent-78767b885c-5ttn8 -n cattle-system
後書き
- スペックのいいマシンでVM環境を作っても良かったのですが、消費電力と設置場所が小さい事という自分の要件があり、mini pcで自宅環境を整えました。
- DNS serverをubuntuからうまく見れなくて少しハマりました。。。
- また、Clusterの設定内容によってはデプロイが失敗することもあり、エラーを取り除くのにも数時間かかってしまいました。。
- もともとk3s環境で作った環境をすべて削除して今回のRKE2環境に作り直すので、しばらく掛かりそう・・・です。
まずprivate registry環境を作るところから初めて、その後build環境を整えます。
以上、rancherからRKE2クラスターを構築する(Tech Preview - RKE2 Cluster Provisioning)でした。
【rancher:2.6.1/docker】dockerを使用して単一ノードにRancherをインストールする(自己証明書とデータの永続化とバックアップ)
本記事で行うこと
- dockerを使用して単一ノードにRancherをインストールする
- 自己証明書を使って、Rancherをインストールする
- rancherのデータの永続化を行う
- rancherのデータのバックアップとリストアを行い
本記事で行わないこと
- 自己証明書の発行 ※以下記事で実施しています。
【OpenSSL(LibreSSL)】OpenSSL(LibreSSL)を利用して自己証明書の作成(pem形式) - haku-maiのブログ
モチベーション
- k3s上にhelmでrancherをdeployし使っていたが、自宅サーバが増えたので、別serverに分離したかった。
- rancher2.6が出たので、使ってみたかった。
環境
- HW GMKTEC NucBox 以下参考です。
$ cat /etc/os-release |grep VERSION VERSION="20.04.3 LTS (Focal Fossa)" VERSION_ID="20.04" VERSION_CODENAME=focal
参考サイト
- 公式マニュアル
- 自己証明書を利用してインストール
Rancher Docs: Installing Rancher on a Single Node Using Docker
- データの永続化
Rancher Docs: Advanced Options for Docker Installs
dockerでrancherを起動、自己証明書、データの永続化
以下のように実行するだけです。
各証明書は適当なディレクトリに配置し、
/etc/rancher/ssl/
にbindさせてください。- また中間証明書がない場合は、
cert.pem
とcacert.pem
は同じで大丈夫です。 - データの永続化をする場合はcontainerの
/var/lib/rancher
をホストOS側にbindすればOKです。
docker run -d --restart=unless-stopped \ --name rancher-hkm \ --hostname rancher-hkm \ -p 80:80 -p 443:443 \ -v /var/lib/cert_directory/rancher.hkm.home/cert.pem:/etc/rancher/ssl/cert.pem \ -v /var/lib/cert_directory/rancher.hkm.home/key.pem:/etc/rancher/ssl/key.pem \ -v /var/lib/cert_directory/rancher.hkm.home/cert.pem:/etc/rancher/ssl/cacerts.pem \ -v /var/lib/rancher:/var/lib/rancher \ --privileged \ rancher/rancher:v2.6.1
webアクセス
- 以下のように作成した自己証明書をmacにインストールすればでなくなります。
- 初回ログイン時は、以下のように初期パスワードを必要とします。
- 画面に従って、logから抽出しログインします。
$ docker logs rancher-hkm 2>&1 | grep "Bootstrap Password:" 2021/10/13 09:33:13 [INFO] Bootstrap Password: XXXXXXX
その後、以下のようにパスワードを設定することで、次回からid:admin、PASSWORD:設定したパスワードでログインできるようになります。
ログイン画面になります。
バックアップとリストア
- バックアップを行うには、rancherを停止して、
/var/lib/rancher
を保存していけば問題ありません。
バックアップのテスト用のdeployment作成
リストアできるか試したいため、簡易的に画面からdeploymentを作成します。
左上のハンバーガーメニューから、
EXPLORE CLUSTER
のlocalを選択
- Workload -> Deploymentsの画面から、右上のCreateを選択
- NameとContainer Inageだけ設定してCreateします。
- backupでフィルターすると以下の状態です。
rancherの停止とバックアップ
- rancherを停止し、
/var/lib/rancher
のバックアップをします
rancherの停止
- 以下のコマンドでdocker Containerを停止します。
$ docker ps --filter name=rancher-hkm CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05f3a1f54ae7 rancher/rancher:v2.6.1 "entrypoint.sh" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp rancher-hkm $ docker stop rancher-hkm rancher-hkm $ docker ps --filter name=rancher-hkm CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES $ docker ps -a --filter name=rancher-hkm CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05f3a1f54ae7 rancher/rancher:v2.6.1 "entrypoint.sh" 2 hours ago Exited (1) 6 seconds ago rancher-hkm
/var/lib/rancher
のバックアップ
tarで
/var/lib/rancher
を別ディレクトリに固めます。初期状態
$ ls -l /var/lib/rancher/ 合計 1464 drwxr-xr-x 5 root root 4096 10月 17 01:21 k3s -rw-r--r-- 1 root root 1486050 10月 17 13:48 k3s.log drwx------ 6 root root 4096 10月 17 01:28 management-state
- 他のストレージにバックアップすべきですが簡易的にバックアップ用のディレクトリ
/var/lib/rancher_backup
を作成します。 /var/lib/rancher_backup
にバックアップファイルを格納します
$ sudo mkdir /var/lib/rancher_backup $ ls -l /var/lib/rancher_backup 合計 0 $ sudo tar -C /var/lib/rancher -pzcvf /var/lib/rancher_backup/rancher_backup_$(date +%Y%m%d%H%M%S).tar.gz ./ $ ls -lh /var/lib/rancher_backup 合計 426M -rw-r--r-- 1 root root 426M 10月 17 14:37 rancher_backup_20211017143633.tar.gz
/var/lib/rancher
の削除とリストア
/var/lib/rancher
の削除
- 少し怖いですがバックアップをとったので
/var/lib/rancher
を綺麗サッパリ削除します。
$ ls -l /var/lib/rancher 合計 1464 drwxr-xr-x 5 root root 4096 10月 17 01:21 k3s -rw-r--r-- 1 root root 1486050 10月 17 13:48 k3s.log drwx------ 6 root root 4096 10月 17 01:28 management-state $ sudo rm -rf /var/lib/rancher/* $ ls -l /var/lib/rancher 合計 0
/var/lib/rancher
のリストア
- 取得したバックアップファイルを
/var/lib/rancher
に戻します。
$ ls -lh /var/lib/rancher_backup 合計 426M -rw-r--r-- 1 root root 426M 10月 17 14:28 rancher_backup_20211017143633.tar.gz $ sudo tar -pzxvf /var/lib/rancher_backup/rancher_backup_20211017143633.tar.gz -C /var/lib/rancher $ ls -l /var/lib/rancher 合計 1460 drwxr-xr-x 5 root root 4096 10月 17 01:21 k3s -rw-r--r-- 1 root root 1486050 10月 17 13:48 k3s.log drwx------ 6 root root 4096 10月 17 01:28 management-state
rancherの起動と確認
- 以下のコマンドでdocker Containerを起動します。
$ docker start rancher-hkm rancher-hkm $ docker ps --filter name=rancher-hkm CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05f3a1f54ae7 rancher/rancher:v2.6.1 "entrypoint.sh" 3 hours ago Up 16 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp rancher-hkm
- 起動したら画面から先程、確認用に用意したdeploymentを確認します。
- 問題なくバックアップできていますね!
- 以上、dockerを使用して単一ノードにRancherをインストールする(自己証明書とデータの永続化とバックアップ)でした。
【ansible/awx:19.4.0】ubuntu:20.04.2にansible awx:19.4.0をdockerでインストールする
- 本記事で行うこと
- 本記事で行わないこと
- モチベーション
- 環境
- 参考サイト
- 前提条件
- git clone
- docker imageの作成
- awxの実行
- UIをクリーンアップして構築する
- 管理ユーザの作成
- ロゴの変更
- サーバにpingするまで
- 余談
本記事で行うこと
- ubuntu:20.04.2にansible awxをバージョン指定で19.4.0をdockerでインストールし、ログインまで行う
本記事で行わないこと
- docker/docker composeのインストール
- python3のインストール
- gitのインストール
- ansible のインストール
モチベーション
- RKE2の検証時に、自宅サーバ設定を何度もやり直すことになり手動が面倒になったため。
- awxを数年ぶりに触って見たくなったため。
環境
HW
GMKTEC NucBox以下参考です。 【ubuntu 20.04/GMK NucBox】windows10を削除してubuntu 20.04をUSBからインストールする - haku-maiのブログ
$ cat /etc/os-release |grep VERSION VERSION="20.04.3 LTS (Focal Fossa)" VERSION_ID="20.04" VERSION_CODENAME=focal
- docker/docker-compose
$ docker --version Docker version 20.10.7, build f0df350 $ docker-compose --version docker-compose version 1.26.0, build d4451659
$ python3 --version Python 3.8.10
- ansible
$ ansible --version ansible 2.9.6 config file = /etc/ansible/ansible.cfg configured module search path = ['/home/haku-mai/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible executable location = /usr/bin/ansible python version = 3.8.10 (default, Sep 28 2021, 16:10:42) [GCC 9.3.0]
参考サイト
- ansible/awxのgithub
- dockerを利用したawxのインストール手順
awx/README.md at devel · ansible/awx · GitHub
前提条件
- docker/docker-composeがインストールされていること
- python3がインストールされていること
- gitがインストールされていること
- ansibleがインストールされていること
git clone
- まずAWXのモジュールを持ってきます。
- 最新のHEADは安定していないので、Brunch指定でcloneします。
- 2021/10/15時点の最新は以下ですので、本記事は以下のバージョンを利用します。
Release 19.4.0 · ansible/awx · GitHub
$ git clone -b 19.4.0 https://github.com/ansible/awx.git cd awx/ $ ls -l 合計 140 -rw-rw-r-- 1 haku-mai haku-mai 2556 10月 15 09:21 API_STANDARDS.md -rw-rw-r-- 1 haku-mai haku-mai 303 10月 15 09:21 CHANGELOG.md -rw-rw-r-- 1 haku-mai haku-mai 9149 10月 15 09:21 CONTRIBUTING.md -rw-rw-r-- 1 haku-mai haku-mai 385 10月 15 09:21 DATA_MIGRATION.md -rw-rw-r-- 1 haku-mai haku-mai 1620 10月 15 09:21 DCO_1_1.md -rw-rw-r-- 1 haku-mai haku-mai 2265 10月 15 09:21 INSTALL.md -rw-rw-r-- 1 haku-mai haku-mai 5137 10月 15 09:21 ISSUES.md -rw-rw-r-- 1 haku-mai haku-mai 9304 10月 15 09:21 LICENSE.md -rw-rw-r-- 1 haku-mai haku-mai 1095 10月 15 09:21 MANIFEST.in -rw-rw-r-- 1 haku-mai haku-mai 19736 10月 15 09:21 Makefile -rw-rw-r-- 1 haku-mai haku-mai 3240 10月 15 09:21 README.md -rw-rw-r-- 1 haku-mai haku-mai 7 10月 15 09:21 VERSION drwxrwxr-x 12 haku-mai haku-mai 4096 10月 15 09:21 awx drwxrwxr-x 8 haku-mai haku-mai 4096 10月 15 09:21 awx_collection drwxrwxr-x 4 haku-mai haku-mai 4096 10月 15 09:21 awxkit drwxrwxr-x 2 haku-mai haku-mai 4096 10月 15 09:21 config drwxrwxr-x 10 haku-mai haku-mai 4096 10月 15 09:21 docs -rwxrwxr-x 1 haku-mai haku-mai 149 10月 15 09:21 manage.py -rwxrwxr-x 1 haku-mai haku-mai 265 10月 15 09:21 pre-commit.sh -rw-rw-r-- 1 haku-mai haku-mai 103 10月 15 09:21 pyproject.toml -rw-rw-r-- 1 haku-mai haku-mai 521 10月 15 09:21 pytest.ini drwxrwxr-x 2 haku-mai haku-mai 4096 10月 15 09:21 requirements -rwxrwxr-x 1 haku-mai haku-mai 5700 10月 15 09:21 setup.py drwxrwxr-x 13 haku-mai haku-mai 4096 10月 15 09:21 tools -rw-rw-r-- 1 haku-mai haku-mai 313 10月 15 09:21 tox.ini
docker imageの作成
- makeコマンドで作成します。
# バージョン固定 $ export DEVEL_IMAGE_NAME=quay.io/awx/awx_devel:19.4.0 # Makefileがあるディレクトリで $ ls -l Makefile -rw-rw-r-- 1 haku-mai haku-mai 19736 10月 15 09:21 Makefile $ make docker-compose-build $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/awx/awx_devel 19.4.0 c5566c6146d9 6 minutes ago 2.09GB
- 余談ですが実際にはMakefileには以下のように記載されていて、これを実行しているだけです。
# Base development image build docker-compose-build: ansible-playbook tools/ansible/dockerfile.yml -e build_dev=True DOCKER_BUILDKIT=1 docker build -t $(DEVEL_IMAGE_NAME) \ --build-arg BUILDKIT_INLINE_CACHE=1 \ --cache-from=$(DEV_DOCKER_TAG_BASE)/awx_devel:$(COMPOSE_TAG) .
awxの実行
テスト実行
- makefileを見るとテストコマンドがあったので一度実行します。
$ COMPOSE_TAG=19.4.0 make docker-compose-runtest
すべてPASSEDになったため実行します
※このタイミングで他のdocker imagesがpullされます。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/awx/awx_devel 19.4.0 c5566c6146d9 13 hours ago 2.09GB postgres 12 fd694ed1533c 3 days ago 371MB redis latest 7faaec683238 3 days ago 113MB quay.io/project-receptor/receptor latest ac55a9332b22 3 months ago 313MB
実行
- バージョン指定、デタッチドモードで起動しますが、マニュアル通り19.4.0で実行すると怒られます。
$ COMPOSE_TAG=19.4.0 COMPOSE_UP_OPTS=-d make docker-compose make: *** 'docker-compose' に必要なターゲット 'docker-auth' を make するルールがありません. 中止.
- これはMakefileからdocker-authが削除されているにも関わらず、コマンドの引数として設定されているからになります。
- 2021/10/15時点では以下のcommitで修正されていますが、このときの最新のtagの19.4.0にはこの修正が含まれていません。
Fix docker-compose targets · ansible/awx@57c9b14 · GitHub
- Makefileを修正して再実行します。
- docker-auth部分を削除します。
Makefileの修正
docker-compose: docker-auth awx/projects docker-compose-sources docker-compose -f tools/docker-compose/_sources/docker-compose.yml $(COMPOSE_OPTS) up $(COMPOSE_UP_OPTS) --remove-orphans # ↓ docker-compose: awx/projects docker-compose-sources docker-compose -f tools/docker-compose/_sources/docker-compose.yml $(COMPOSE_OPTS) up $(COMPOSE_UP_OPTS) --remove-orphans
再実行
$ COMPOSE_TAG=19.4.0 COMPOSE_UP_OPTS=-d make docker-compose $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 782c9236f1ec quay.io/awx/awx_devel:devel "/entrypoint.sh rece…" 5 minutes ago Up 5 minutes 22/tcp, 8013/tcp, 8043/tcp, 8080/tcp tools_receptor_1 b22a5a71fc92 quay.io/awx/awx_devel:devel "/entrypoint.sh rece…" 5 minutes ago Up 5 minutes 22/tcp, 8013/tcp, 8043/tcp, 8080/tcp tools_receptor_2 51d0fd4cfa94 quay.io/project-receptor/receptor:latest "/usr/bin/dumb-init …" 5 minutes ago Up 5 minutes 0.0.0.0:5555->5555/tcp, :::5555->5555/tcp, 7323/tcp tools_receptor_hop 832940d3fc45 quay.io/awx/awx_devel:19.4.0 "/entrypoint.sh laun…" 5 minutes ago Up 5 minutes 0.0.0.0:2222->2222/tcp, :::2222->2222/tcp, 0.0.0.0:6899->6899/tcp, :::6899->6899/tcp, 0.0.0.0:7899-7999->7899-7999/tcp, :::7899-7999->7899-7999/tcp, 0.0.0.0:8013->8013/tcp, :::8013->8013/tcp, 0.0.0.0:8043->8043/tcp, :::8043->8043/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 22/tcp, 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp tools_awx_1 3bc2e00c9029 postgres:12 "docker-entrypoint.s…" 27 minutes ago Up 27 minutes 5432/tcp tools_postgres_1 05398afb1d6b redis:latest "redis-server /usr/l…" 27 minutes ago Up 27 minutes 6379/tcp tools_redis_1
UIをクリーンアップして構築する
- UIを利用できるように以下コマンドを実行します。
$ docker exec tools_awx_1 make clean-ui ui-devel
*ここまで完了したら、webアクセスできます。 * 証明書がないためブラウザによっては、アクセス拒否されて、400エラーになったりします。 * 私はsafafiで接続しました。
- httpはこちら
- むちゃくちゃ・・・ダサい!!!
- 昔は中二感あったロゴだったはずなのですが・・・
管理ユーザの作成
- ログイン用の管理ユーザを作成します。
$ docker exec -ti tools_awx_1 awx-manage createsuperuser Username (leave blank to use 'awx'): haku-mai Email address: Password: Password (again): Superuser created successfully.
- 作成したユーザでログインします。
- アイコンダサすぎないですか?
ロゴの変更
- あまりにもロゴがダサいで変更します。
- ちゃんと変更機能がありました。
- とても残念なことに、認証画面しか変わりませんでした・・・
- なんか3週くらいして、かっこよく見えてきたのでもうこれで良しとします。
*正直UIが数年前と結構変わっていて、少し検証が必要です。
サーバにpingするまで
guthub repoの作成
- 適当なrepoを作成し、サンプルでplaybookを作ります。
--- - name: sample hosts: nucbox-002-hkm gather_facts: no collections: - ansible.builtin tasks: - name: 疎通チェック ping:
トークンの作成
- Settings -> Developer settings -> personal access tokens から作成します。
- repoの読み取りのみで問題ありません。
- ここで取得したトークンを認証情報で設定します。
- ※このトークンは絶対に外部に流出させないように!
認証情報の登録
github
- ソースコントロールが正解。少しハマりました。
OSログイン情報
- テストなのでパスワード認証にしてきます。
- SSH公開鍵認証が良いと思います。
プロジェクトの登録
- プロジェクトというのは論理的なplaybookのコレクションみたいなもので、今回はgitrepoにあるplaybookをひっぱてくる場所みたいなものです。
- 登録後、成功になっていればOKです。
インベントリーの登録
- インベントリーを作り、ホストを登録していきます。
ホストの登録
- ホスト名をgithubに登録した
hosts: nucbox-002-hkm
に合わせます。
--- ansible_host: 192.168.XXX.XXX
テスト実行
- アドホックコマンドでShellを実行してみます。
- 問題なく実行できました。
テンプレートの作成
- github repoに作成したplaybookを実行します。
- 追加から新規ジョブテンプレートの追加
- JOB名、インベントリー、プロジェクト、実行環境、Playbook、認証情報を選択します。
- Playbookはgithubからcloneした値が出てきます。
- 保存して、起動を押します。
- 無事pingが成功しました。
- 以上ubuntu:20.04.2にansible awx:19.4.0をdockerでインストールするでした。
余談
以前のバージョンについて
- 以前のバージョンは中二感丸出しのロゴが使われてました。
- これから
- これになったので超びっくりしました。
- ui_nextという形でAWX 16.0.0 から変更になったようです。
- 前のほうが好きだったけど、この謎のキャラクタを好きになろうと思います。
2020年のAWXの世界を少しだけ覗いちゃう - 赤帽エンジニアブログ
docker-compose.yamlについて
- 実行するdocker-compose.yamlは少し微妙です。
- バージョン指定したのに、awx/awx_devel:devel箇所があります。
- 修正して実行しても良かったのですが、まぁいいかなと割り切りました。
$ cat tools/docker-compose/_sources/docker-compose.yml --- version: '2.1' services: # Primary AWX Development Container awx_1: user: "1000" image: "quay.io/awx/awx_devel:19.4.0" container_name: tools_awx_1 hostname: awx_1 command: launch_awx.sh environment: OS: " Operating System: Ubuntu 20.04.3 LTS" SDB_HOST: 0.0.0.0 SDB_PORT: 7899 AWX_GROUP_QUEUES: tower MAIN_NODE_TYPE: "${MAIN_NODE_TYPE:-hybrid}" RECEPTORCTL_SOCKET: /var/run/awx-receptor/receptor.sock RUN_MIGRATIONS: 1 links: - postgres - redis_1 working_dir: "/awx_devel" volumes: - "../../../:/awx_devel" - "../../docker-compose/supervisor.conf:/etc/supervisord.conf" - "../../docker-compose/_sources/database.py:/etc/tower/conf.d/database.py" - "../../docker-compose/_sources/websocket_secret.py:/etc/tower/conf.d/websocket_secret.py" - "../../docker-compose/_sources/local_settings.py:/etc/tower/conf.d/local_settings.py" - "../../docker-compose/_sources/SECRET_KEY:/etc/tower/SECRET_KEY" - "../../docker-compose/_sources/receptor/receptor-awx-1.conf:/etc/receptor/receptor.conf" # - "../../docker-compose/_sources/certs:/etc/receptor/certs" # TODO: optionally generate certs - "/sys/fs/cgroup:/sys/fs/cgroup" - "~/.kube/config:/var/lib/awx/.kube/config" - "redis_socket_1:/var/run/redis/:rw" privileged: true tty: true ports: - "7899-7999:7899-7999" # sdb-listen - "6899:6899" - "8080:8080" # unused but mapped for debugging - "8888:8888" # jupyter notebook - "8013:8013" # http - "8043:8043" # https - "2222:2222" # receptor foo node redis_1: image: redis:latest container_name: tools_redis_1 volumes: - "../../redis/redis.conf:/usr/local/etc/redis/redis.conf" - "redis_socket_1:/var/run/redis/:rw" entrypoint: ["redis-server"] command: ["/usr/local/etc/redis/redis.conf"] # A useful container that simply passes through log messages to the console # helpful for testing awx/tower logging # logstash: # build: # context: ./docker-compose # dockerfile: Dockerfile-logstash postgres: image: postgres:12 container_name: tools_postgres_1 environment: POSTGRES_HOST_AUTH_METHOD: trust POSTGRES_USER: awx POSTGRES_DB: awx POSTGRES_PASSWORD: vEUithzhAYIeRdMQGfVI volumes: - "awx_db:/var/lib/postgresql/data" receptor-hop: image: quay.io/project-receptor/receptor:latest user: root container_name: tools_receptor_hop hostname: receptor-hop command: 'receptor --config /etc/receptor/receptor.conf' links: - awx_1 ports: - "5555:5555" volumes: - "../../docker-compose/_sources/receptor/receptor-hop.conf:/etc/receptor/receptor.conf" receptor-1: image: quay.io/awx/awx_devel:devel user: "1000" container_name: tools_receptor_1 hostname: receptor-1 command: 'receptor --config /etc/receptor/receptor.conf' environment: RECEPTORCTL_SOCKET: /var/run/awx-receptor/receptor.sock links: - receptor-hop volumes: - "../../docker-compose/_sources/receptor/receptor-worker-1.conf:/etc/receptor/receptor.conf" - "/sys/fs/cgroup:/sys/fs/cgroup" privileged: true receptor-2: image: quay.io/awx/awx_devel:devel user: "1000" container_name: tools_receptor_2 hostname: receptor-2 command: 'receptor --config /etc/receptor/receptor.conf' environment: RECEPTORCTL_SOCKET: /var/run/awx-receptor/receptor.sock links: - receptor-hop volumes: - "../../docker-compose/_sources/receptor/receptor-worker-2.conf:/etc/receptor/receptor.conf" - "/sys/fs/cgroup:/sys/fs/cgroup" privileged: true volumes: awx_db: name: tools_awx_db redis_socket_1: name: tools_redis_socket_1
- 価格: 4150 円
- 楽天で詳細を見る
【OpenSSL(LibreSSL)】OpenSSL(LibreSSL)を利用して自己証明書の作成(pem形式)
本記事で行うこと
- OpenSSLで自己証明書の作成し、pem形式それぞれ行う。
モチベーション
- いつも忘れるので自分のメモ用に記録しておきたかったため。
- 自宅kubernetes上のdocker registry、Ingressに設定するサーバ証明書を作成したかったため。
- 自宅rancher server用に設定するサーバ証明書を作成したかったため。
環境
証明書を作成する環境 * M1 Macbook Air
$ sw_vers ProductName: macOS ProductVersion: 11.1 BuildVersion: 20C69 $ uname -m arm64 $ openssl version LibreSSL 2.8.3
※LibreSSLとは
秘密鍵の作成
$ openssl genrsa -aes128 -out encrypted.key.pem 2048 $ ls -l ./encrypted.key.pem -rw-r--r-- 1 haku-mai staff 1766 10 12 21:49 ./encrypted.key.pem
暗号化されない鍵ファイル作成
- serverに配置する用のものです。
$ openssl rsa -in encrypted.key.pem -out key.pem
証明書署名要求(CSR)の作成
- 以下の項目を
-subj
にセットして作成します。
C = 2文字の国名 ST = 都道府県 L = 地域 O = 組織名 OU = 組織単位名 CN = コモンネーム
- コモンネームはワイルドカードで利用したいので
*.hkm.home
とします。
$ openssl req -new -key key.pem -out csr.pem -subj "/C=JP/ST=Tokyo/L=chiyodaku/O=haku-mai/CN=*.hkm.home" Enter pass phrase for key.pem: $ ls -l ./csr.pem -rw-r--r-- 1 haku-mai staff 985 10 12 22:05 ./csr.pem
自己署名証明書作成
- 今回は複数ドメインの証明書を作成したいのでSAN(Subject Alternative Name)を作成し、自己証明書を作成します。
$ echo "subjectAltName = DNS:rancher.hkm.home, DNS:*.hkm.home" > san.txt $ openssl x509 -req -days 365 -in csr.pem -signkey key.pem -out cert.pem -extfile san.txt Signature ok subject=/C=JP/ST=Tokyo/L=chiyodaku/O=haku-mai/CN=*.hkm.home Getting Private key Enter pass phrase for key.pem:
- 以上となります。
中間証明書は自宅環境では不要とします。
ちなみにRFC 2818でSANがないとエラーになります。実際以前docker registryにSANなしで作成した自己証明書を使い、kubernetesのpod内からプログラムでアクセスしたところ以下のようなエラーが出てアクセスできませんでした。
Error: creating registry client failed: Get "https://docker-registry.svc.cluster.local/v2/": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0
【docker/dnsmasq】docker containerでdnsmasqを起動しワイルドカードDNSを構築する
本記事で行うこと
モチベーション
- 自宅kubernetesでingressを利用しているため、ワイルドカードDNSを構築したい
- メンバー検証用にワイルドカードDNSを構築したい
- bindがやや設定が多いので、最も簡単にワイルドカードDNSを構築したい
git repo
- 参考ように以下repoを用意しています。 github.com
動作確認済環境
- M1 Macbook Air
$ sw_vers ProductName: macOS ProductVersion: 11.1 BuildVersion: 20C69 $ uname -m arm64
- Intel macbook pro 2019
$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H15 $ uname -m x86_64
- raspberry pi 3 model b+ ubuntu
$ uname -a Linux ubuntu-pi 5.11.0-1008-raspi #8-Ubuntu SMP PREEMPT Thu May 6 17:46:38 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 21.04 Release: 21.04 Codename: hirsute
- Docker Engine
- Version: 20.10.6
dnsmasq
dnsmasqとは
- 小規模向けのDNSで、あまりDNSの知識がない人でも簡易的に構築可能です。
- dnsmasqを入れたサーバの/etc/hostsに書くだけでも、DNSサーバとして動作します。
- 今回はワイルドカードDNSを構築したいため、専用のconfファイルを使います。
- ロゴはなんだかやらしい・・・
dnsmasq.confの準備
- 以下のようにconfファイルを作成します。
.wc.haku-mai
のように.
を先頭に書くことでその部分がワイルドカードになります。127.0.0.1
の部分がどのドメインで返してほしいIPアドレスになります。test001.haku-mai
のようにフルドメインで書けばそのFQDNが返ります。.wc.haku-mai
、test001.haku-mai
をどちらを先に書いても、想定通り動作します。- ドメインを追加したい場合は、confファイルを編集して、docker containerを再作成すれば良いので簡単です。
dnsmasq.conf
port=53 address=/test001.haku-mai/127.0.0.2 address=/.wc.haku-mai/127.0.0.1 log-facility=/var/log/dnsmasq.log
dnsmasq docker image (Dockerfile)の準備
Dockerfile
- 軽量のalpine linuxを使いdnsmasqをインストールします。
- alpineのバージョンは固定しなくても最新のものであれば動作します。
Dockerfile
FROM alpine:3.13.2 RUN apk update && \ apk upgrade && \ apk add bash dnsmasq && \ rm -rf /var/cache/apk/* && \ mkdir -p /etc/default/ && \ echo -e "ENABLED=1\nIGNORE_RESOLVCONF=yes" > /etc/default/dnsmasq CMD ["dnsmasq","--no-daemon"]
image build
- Dockerfileと同じディレクトリでbuild
- tag名はおすきなものを
$ docker build -t dnsmasq:sample .
dnsmasq docker containerの起動
- 作成した、
dnsmasq.conf
をContainerの/etc/dnsmasq.conf
にbindして、NET_ADMIN権限を付けて起動します。
$ docker run -d -p 53:53/tcp -p 53:53/udp --cap-add=NET_ADMIN \ -v $PWD/dnsmasq.conf:/etc/dnsmasq.conf \ --name dnsmasq dnsmasq:sample
動作確認
単一ドメイン
- 想定通り設定したIPが返ってくることがわかります。
nslookup
$ nslookup test001.haku-mai 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 Name: test001.haku-mai Address: 127.0.0.2
dig
$ dig test001.haku-mai @127.0.0.1 ; <<>> DiG 9.10.6 <<>> test001.haku-mai @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47722 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;test001.haku-mai. IN A ;; ANSWER SECTION: test001.haku-mai. 0 IN A 127.0.0.2 ;; Query time: 6 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sun Oct 10 15:38:37 JST 2021 ;; MSG SIZE rcvd: 61
ワイルドカードドメイン
- ワイルドカード部分に何を入れても想定通り設定したIPが返ってくることがわかります。
nslookup
$ nslookup yakiniku.wc.haku-mai 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 Name: yakiniku.wc.haku-mai Address: 127.0.0.1 $ nslookup tabetai.wc.haku-mai 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 Name: tabetai.wc.haku-mai Address: 127.0.0.1
dig
$ dig yakiniku.wc.haku-mai @127.0.0.1 ; <<>> DiG 9.10.6 <<>> yakiniku.wc.haku-mai @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51347 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;yakiniku.wc.haku-mai. IN A ;; ANSWER SECTION: yakiniku.wc.haku-mai. 0 IN A 127.0.0.1 ;; Query time: 6 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sun Oct 10 15:41:44 JST 2021 ;; MSG SIZE rcvd: 65 $ dig tabetai.wc.haku-mai @127.0.0.1 ; <<>> DiG 9.10.6 <<>> tabetai.wc.haku-mai @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49729 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;tabetai.wc.haku-mai. IN A ;; ANSWER SECTION: tabetai.wc.haku-mai. 0 IN A 127.0.0.1 ;; Query time: 5 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sun Oct 10 15:42:00 JST 2021 ;; MSG SIZE rcvd: 64
別の端末(Macなど)から→DNSサーバにアクセスする場合
- 例えば、自宅プライベートアドレス帯の192.168.XXX.XXXが割り振られているサーバで動作させての場合、
127.0.0.1
の部分を動作させているIPアドレスを指定します。
$ nslookup test001.haku-mai 192.168.XXX.XXX $ dig yakiniku.wc.haku-mai @192.168.XXX.XXX
Mac で DNS を記載する場合の例
*「ネットワークの環境設定を開く」-> 「Wi-Fi」 -> 「詳細」 -> 「DNS」タブから DNSサーバのIP(例:192.168.XXX.XXX)を追加
既存で書いてあるDNSは消すとgoogkeとかにアクセスできなくなるので注意してください。
間違えてけしちゃった場合は、今回追加したものも全部一度消してしまえば戻ります。(自宅ルーターに設定してあるものが入ります)
- DNS キャッシュクリア
$ sudo killall -HUP mDNSResponder
iPhone で DNS を記載する場合の例
*「設定」-> 「Wi-Fi」 -> 接続中のwifiの「infoマーク」 -> 「DNSを構成」-> 「手動」に切り替えて DNSサーバのIP(例:192.168.XXX.XXX)を追加
実際にiPhone(safari)で自作のWEBアプリにアクセスするためには、SSL証明書が必要になります。※自己証明でも個別でプロファイルをインストールすることで可能
(自己証明書の作成&インストールはどこかで書きます)
あとがき
- 自宅環境ではraspberry piをDNSサーバとして使っており、自宅PC/スマホにはraspberry piをDNSサーバとして見れるように追加しています。
- ここまで準備しておくと、kubernetesでIngressを楽に使うことができます。
- 自宅では様々な自作アプリをkubernetes上で動作させていて、半年近く立っていますが、何も問題なく動作しています。
- DNSってちょっとハードルあるように感じますが、簡易的に動かすにはdnsmasqで十分だと感じました。
- スペックが上がっているraspberry pi 4がほしいです。
【userLAnd】余っているAndoroidのスマートフォンを利用してLinuxサーバとして利用する。(root化不要)
本記事で行うこと
モチベーション
- 普段自宅用アプリケーションはRaspberry Piをサーバーとして利用しているが、他のサーバーマシンがほしかった。
- 使わなくなった(高価な・・・)Andoroid端末がもったいないので活用したかった。
- userLAndは疑似rootのprootで動作させるため、Andoroid端末のroot化不要であり、最も簡単なLinuxサーバー化だと思ったから。
環境
- M1 Macbook Air
$ sw_vers ProductName: macOS ProductVersion: 11.1 BuildVersion: 20C69
項目 | バージョン・名称 |
---|---|
Android | 9 |
kernel | 4.4.148 |
機種名 | Xperia XZ1 Compact SO-02K |
※古い端末はセキュリティアップデートができない事が多いので、自宅用で利用するようにしてください。
userLAndのインストール
Google PlayストアでuserLAndをインストールしアプリを開く。
対応しているLinuxサーバーは表示されているものが対応している。
公式sourceは以下レポジトリとなる。
2021/2/3時点でメンテナンスが2020/6で止まっているのが気になる・・・。
GitHub - CypherpunkArmory/UserLAnd: Main UserLAnd Repository
ubuntuサーバのインストール
ubuntuアイコンをタップし、username,password,VNCpasswordを設定。
※VNCを利用しなくてもVNCpasswordは必須。
sshを選択肢するとインストールが始めるので数分待つ。
インストールが完了すると、コンソールが開くので先程設定したusername,passwordを入力するとログインできる。
IPアドレスは自宅のルーターからDHCPしたもの。固定化したい場合はルーター側で割当を固定する。
※プライベートアドレスなので隠す必要はないのですが癖で・・・
ubuntuサーバへMacOSからsshログイン
macから先程確認したIPとユーザでsshログインします。
デフォルトではssh portは2020になっているため指定します。
$ ssh hakumai@192.168.XXX.XXX -p 2022 The authenticity of host '[192.168.XXX.XXX]:2022 ([192.168.XXX.XXX]:2022)' can't be established. ECDSA key fingerprint is SHA256:x906JFzoV+84iIp6vo4OGYeYSWai1Df4lcstHq7GsG4. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '[192.168.XXX.XXX]:2022' (ECDSA) to the list of known hosts. hakumai@192.168.XXX.XXX's password: hakumai@localhost:~$ id uid=2000(hakumai) gid=2000(hakumai) groups=2000(hakumai)
無事MacOSからログインすることができました。