🐟

なんちゃっておうち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サーバーへインストールする準備をします。

  1. balenaEtcherを入手
    公式サイト: https://etcher.balena.io/

  2. ダウンロードした .dmg を開き、アプリをApplicationsにコピー
    Ubuntu ISOは https://jp.ubuntu.com/download から入手

  3. USBを準備
    4GB以上のUSBをMacに挿す

  4. Etcherで書き込み

    • balenaEtcherを起動
    • 「Flash from file」をクリック → ダウンロードしたISOを選択
    • 「Select target」でUSBを選択
    • 「Flash!」をクリック
    • 管理者パスワードを入力
    • 数分待って完了

Ubuntuをサーバーへインストール

  1. UbuntuをインストールしたUSBをM720qに挿す
  2. 電源を入れてLenovoロゴが表示されるのでF12キーを連打(裏コマンドっぽくて好き笑)
  3. Boot Menuで「USB HDD」を選ぶ
  4. 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を組み合わせ、外部公開も試す予定です。

AI Shift Tech Blog

Discussion