激安中華miniPCでKubernetesクラスタを構築する

Akira Ueno
この記事は whywaita Advent Calendar 2023 7 日目の記事です。 前日は k_enoki さんの記事 でした。 whywaita さんといえば、インフラエンジニアのイメージがあります。 今どきのインフラエンジニアといえば、Kubernetes ですよね。そこで、今回は Kubernetes の勉強を兼ねて、自宅で Kubernetes を動かすための環境を構築してみました。 お金はあまりかけたくないが、クラウドでやっても面白くないので、激安中華 miniPC を使います。 今回の環境 Amazon で Beelink EQ12 x 3 台とBeelink S12 Pro x 1 台を購入しました。これを Kubernetes クラスタとして構築します。 スペックは CPU: Alder Lake 4 コア、メモリ: 16GB、SSD: 500GB NVME です。 これで 1 台 3 万円弱でした。激安ですね。 3 台の EQ12 は ワーカーノード、1 台の S12 Pro はコントロールプレーンとします。 OS のインストール まずは OS をインストールします。今回は Ubuntu Server 22.04 LTS をインストールしました。 PXE などでかっこよく自動インストールしたかったのですが、設定が大変そうだったので、手動で USB メモリを使ってインストールしました。

gcloudのフィルタについて

Akira Ueno
フィルタ可能なキーを探す ドキュメント gcloud <サブコマンド> --format=yaml --limit=1 フィルタ gcloud <サブコマンド> --filter="<key>=<value>" keyに.や/が含まれる場合はシングルクオートで囲む。 複数フィルタ ドキュメント gcloud <サブコマンド> --filter="<key1>=<value1> AND <key2>=<value2>"

Lock Gnome Screen via SSH

Akira Ueno
Overview I want to lock gnome-session(Desktop) with a user logged in via ssh. Script Save below script and execute it. There are two key points at line 10. 1. gnome-screensaver-command -l Execute gnome-screensaver-command as GNOME logged in user. 2. DBUS_SESSION_BUS_ADDRESS Set dbus environment varibale to execute gnome-screensaver-command. Reference https://askubuntu.com/questions/7776/how-do-i-lock-the-desktop-screen-via-command-line https://askubuntu.com/questions/707984/lock-screen-with-gnome-screensaver-command-as-root-from-etc-pm-sleep-d-script

Growiの管理者パスワードを手動で変更する

Akira Ueno
概要 Growiのログインパスワードを忘れてしまい、パスワードを変更しようとしたが自身が管理者だったためログインしてユーザのパスワードを変更することができない状況に陥った。 MongoDBに保存されているパスワードのハッシュ値を手動で書き換えることで解決した。 手順 環境変数PASSWORD_SEEDを確認 docker-composeを用いている場合はdocker-compse.ymlに書かれているので、その値を使う。 ここではchangemeとする。 設定したいパスワードを決める ここではpassword024とする。 パスワードのハッシュ値を計算する growiのコードを参考に計算する。 node > const hasher = crypto.createHash('sha256'); undefined > hasher.update('changeme' + 'password024'); // 'PASSWORD_SEEDの値' + '設定したいパスワード' Hash { _options: undefined, [Symbol(kHandle)]: BaseObject {}, [Symbol(kState)]: { [Symbol(kFinalized)]: false } } > hasher.digest('hex'); 'f2206eee5a5669a1028b4e4cf2c511056f6d5b576b7c05524b7750199bd64ce4' // パスワードのハッシュ値 MongoDBのパスワードのハッシュ値を書き換える growiデータベースのusersコレクションの当該ドキュメントを書き換える。 mongo growi > db.users.find({email: "[email protected]"}); // パスワードを変更したいユーザのメールアドレスを指定 { "_id" : ObjectId(...略 > db.users.update({email: "[email protected]"}, {$set: {password: "f2206eee5a5669a1028b4e4cf2c511056f6d5b576b7c05524b7750199bd64ce4"}}); // 変更する WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) updateの際に$setを指定しないと元のドキュメントのpassword以外のフィールドが全て削除されてしまうので注意。 docker-composeを用いている場合はdocker-compose exec mongo mongo growiとかでMongoDBへログイン出来るかと思う。

CloudflareのDNSを利用しているドメインの証明書をcertbotで発行する

Akira Ueno
概要 Cloudflare の DNS を利用しているドメインの証明書を certbot で発行する。 ワイルドカード証明書を発行する場合、certbot を使い DNS 認証(DNS-01)で DNS レコードを手で修正していたが、Cloudflare の API を利用すれば自動化できる。さらにcertbot-dns-cloudflareというプラグインにより簡単に設定できるので紹介する。 API トークンの取得と設定 Cloudflare のMy ProfileのAPIトークン>トークンを作成する>ゾーン DNS を編集するを選択し API トークンを発行する。 以下は設定例。 発行した API トークンを含むクレデンシャルファイルを適当な場所に作成する。 $ sudo mkdir /etc/letsencrypt/cloudflare $ sudo vim /etc/letsencrypt/cloudflare/akky.me.ini dns_cloudflare_api_token=<発行したAPIトークン> $ sudo chmod 700 /etc/letsencrypt/cloudflare $ sudo chmod 600 /etc/letsencrypt/cloudflare/akky.me.ini certbot のインストール 公式の手順に従う。 今回は Web サーバが Nginx,OS が Debian buster なので snap を使ってインストールする手順が表示された。 sudo apt install snapd # snapが入ってなければ sudo snap install core; sudo snap refresh core sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot プラグインのインストール certbot-dns-cloudflareプラグインをインストールする。

正規表現でマッチしたグループを複数抽出する

Akira Ueno
概要 正規表現でマッチしたグループを複数抽出する場合はsedを使うと良い.グループが1つの場合はgrepでも-oPと\Kで抽出できるが,グループが複数あるとできない. コード i番目のグループ(()で囲まれた部分)を\iで置換する. sed -r 's/<正規表現>/\i/g 例 vncのポート番号とpidを抽出する例 sed $ ss -ltp | grep vnc LISTEN 0 5 0.0.0.0:5901 0.0.0.0:* users:(("Xtigervnc",pid=3193,fd=7)) LISTEN 0 5 0.0.0.0:5902 0.0.0.0:* users:(("Xtigervnc",pid=4404,fd=7)) LISTEN 0 5 0.0.0.0:5903 0.0.0.0:* users:(("Xtigervnc",pid=4453,fd=7)) LISTEN 0 5 [::]:5901 [::]:* users:(("Xtigervnc",pid=3193,fd=8)) LISTEN 0 5 [::]:5902 [::]:* users:(("Xtigervnc",pid=4404,fd=8)) LISTEN 0 5 [::]:5903 [::]:* users:(("Xtigervnc",pid=4453,fd=8)) $ ss -ltp | grep vnc | sed -r 's/^.*:([0-9]+).*pid=([0-9]+).*$/\1 \2/' | sort -u 5901 3193 5902 4404 5903 4453 うまくいく.