なんちゃっておうちKubernetes:環境構築編
自宅サーバー、憧れじゃないですか?
こんにちは。株式会社AI Shiftでサーバーサイドエンジニアをしている @subaru です。
今回は、個人開発アプリのデプロイ先を自宅に作る、いわゆる「おうちKubernetes」の準備として、OSインストールからSSH接続までの手順をまとめます。
「なるべく安くデプロイしたいな」と考えていたタイミングで、関連イベント(K8s Novice / CNCF 10th Anniversary)に参加し、“Kubernetesチョットワカル” になりたい気持ちが高まりました。
おうちKubernetesに個人開発サービスをデプロイする準備として、まずはインストールからSSH接続までの流れを記録します。
本家は(多分)こちら(参考: おうちで「おうち Kubernetes インターン」を実施しました)
機材を揃える
省エネ・安価・小型かつ発熱が少ないPCとして Lenovo ThinkCentre M720q を採用しました。
別PCからSSH接続して運用できるようにします。必要なものは以下です。
- 本体:Lenovo ThinkCentre M720q(詳細はこちら)
- モニター(HDMI対応)
- キーボード
- USBメモリ(8GB以上):Ubuntuインストールメディア用
- LANケーブル(CAT6以上推奨)
- ストレージ:(足りなそうであれば。M720qはSSD:256GB+HDD500GBの構成なので内蔵ストレージのみで十分でした。)
OSをLinuxに変える
購入した Lenovo ThinkCentre M720q には最初 Windows が入っていましたが、個人開発サービスを動かすおうちサーバーとして活用するため、軽量で安定した Ubuntu Server を導入しました。
OSをUSBへダウンロード
別のPCでUbuntu OSをUSBへ焼いて、M720qサーバーへインストールする準備をします。
-
balenaEtcherを入手
公式サイト: https://etcher.balena.io/ -
ダウンロードした .dmg を開き、アプリをApplicationsにコピー
Ubuntu ISOは https://jp.ubuntu.com/download から入手 -
USBを準備
4GB以上のUSBをMacに挿す -
Etcherで書き込み
- balenaEtcherを起動
- 「Flash from file」をクリック → ダウンロードしたISOを選択
- 「Select target」でUSBを選択
- 「Flash!」をクリック
- 管理者パスワードを入力
- 数分待って完了
Ubuntuをサーバーへインストール
- UbuntuをインストールしたUSBをM720qに挿す
- 電源を入れてLenovoロゴが表示されるのでF12キーを連打(裏コマンドっぽくて好き笑)
- Boot Menuで「USB HDD」を選ぶ
- Ubuntuインストーラが起動する
インストーラからの質問には以下のように答えました。
- 言語: English(推奨)
- keyboard配列: US
- インストールディスク: HDDを選択(既存のWindowsを消去)
- ネットワーク
- 表示名・サーバー名・ユーザー名とパスワードを設定
- 「Install OpenSSH server?」は Yes
接続を確認
ネットワーク設定
サーバーにipアドレスを振っていきましょう。
OSインストール中にネットワークをManualで設定していた場合、サーバーにipアドレスを振って置かないと外部PCからサーバーへ接続できません。
固定IPの設定例
/etc/netplan配下に新しくネットワーク設定ファイルを配置し、DHCPがサーバーにIPを割り当てられるようにします。
デフォルトで存在する50-cloud-init.yamlは、サーバーが落ちた場合に記述がデフォルト状態に戻ってしまうので、別のyamlファイルを適当な名前で作成しましょう。
(参考:https://qiita.com/k-keita/items/e7b413df0f7c8c9d00a7#1-ネットワーク設定ファイルを編集)
sudo vim /etc/netplan/99-config.yaml
- 内容を以下のように修正します。
IPアドレスは固定にしておきます。
毎回アドレスが変わると、別PCからログインする際に手間がかかるためです。
network:
version: 2
ethernets:
eno1:
dhcp4: no
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
- 反映
設定内容を反映します。
sudo netplan apply
- 自分のIPを確認
ip a
を打ってみます。先ほど設定したipアドレスが表示されていれば問題なしです。
$ ip a
...
inet 192.168.1.100/24 brd 192.168.1.255 scope global eno1
valid_lft forever preferred_lft forever
...
良さそうです。
別のPCからSSHで接続
Ubuntu Server のインストールとネットワーク設定が完了したら、実際に別のPCからサーバーへログインできるか確認します。
初回接続時にはホスト鍵の確認メッセージが表示されますが、問題なければ「yes」と入力して進めましょう。
✗ ssh your-name@192.168.1.100
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:**********************.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.100' (ED25519) to the list of known hosts.
your-name@192.168.1.100's password:
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-119-generic x86_64)
...
IPv4 address for eno1: 192.168.1.100
...
パッケージ更新とFirewall設定
サーバーに接続できたら、まずは最新の状態にアップデートし、不要な通信を遮断するためにファイアウォールを設定します。
ここでは ufw を利用し、SSHのみを許可することで、LAN内から安全にリモート操作できる環境を整えます。
your-name@your-name-server:~$ sudo apt update && sudo apt upgrade -y
...
your-name@your-name-server:~$ sudo apt install ufw -y
...
your-name@your-name-server:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)
your-name@your-name-server:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
your-name@your-name-server:~$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
公開鍵認証の設定
毎回パスワードを入力するのは面倒で、セキュリティ的にも好ましくありません。
そのため、公開鍵認証を設定して、パスワードなしで安全にログインできるようにします。
- サーバー側で鍵を生成
your-name@your-name-server:~$ ls -al ~/.ssh/
total 8
drwx------ 2 your-name your-name 4096 Sep 6 10:22 .
drwxr-xr-x 6 your-name your-name 4096 Sep 6 11:10 ..
-rw------- 1 your-name your-name 0 Sep 6 10:22 authorized_keys
your-name@your-name-server:~$ ssh-keygen -t ed25519 -C "your-name@server"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/your-name/.ssh/id_ed25519):
...
- 別PCで公開鍵を取得
ssh-copy-id -i ~/.ssh/id_ed25519.pub your-name@192.168.1.100
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/s30764/.ssh/id_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
your-name@192.168.1.100's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -i /Users/s30764/.ssh/id_ed25519 'your-name@192.168.1.100'"
and check to make sure that only the key(s) you wanted were added.
パスワードなしでログインできることを確認
公開鍵認証の設定が完了したら、実際にサーバーへログインしてみましょう。
パスワード入力が不要になっていれば、設定は成功です。
ssh your-name@192.168.1.100
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-119-generic x86_64)
...
IPv4 address for eno1: 192.168.1.100
...
良さそうですね。これで別PCから自宅サーバーへリモートアクセスすることができる環境が整いました。
まとめ
Lenovo M720qにUbuntu Serverを導入し、おうちサーバーとして活用できる環境を構築しました。
Ubuntuは22.04 LTSを選ぶことで安定してインストールでき、DHCPが不安定な場合には固定IPを設定することで安定運用が可能になります。
また、UFWでSSHのみを許可し、公開鍵認証によるパスワードレスログインを導入することで、セキュリティと利便性の両立も実現できました。
おうちKubernetesの構築完了に一歩近づけましたね。
今後はこの環境にCloudflare Tunnelを組み合わせ、外部公開も試す予定です。
Discussion