2024/09/29(日)bhyveでk8s - #1 fedoracoreos

参考情報

参考情報をみてやるだけ、ではある。 https://docs.freebsd.org/en/books/handbook/virtualization/#virtualization-host-bhyve https://forums.freebsd.org/threads/hints-for-installing-fedora-in-bhyve.80257/

目論見

  • 管理ノードを3台で構築する。
  • ワーカーノードを2台くらい作る。
  • なんか乗せる。

余力で

  • bhyve で node のスケーリングってできる?
  • ignition を 動的に作成できないか
    • 人の手で構築するのはナウくない気がする

やってみるとクラウド環境って便利。自動化とかスケーリングとか当たり前にある前提だけどローカルにそれらはない。kind とか minikube 使わずコントロールプレーン側を触ってみるのが目的なので不便は承知。

作業

bhyve 環境は出来ている前提

Fedora CoreOs の準備

Live DVD をダウンロードしておく https://fedoraproject.org/

ディスクを作る

散らからないように階層を掘ってボリュームを作る。例では k8s という階層にまとめた。

sudo zfs create  -o mountpoint=none stor/k8s
sudo zfs create -V 16G stor/k8s/coreos01
sudo zfs create -V 16G stor/k8s/coreos02
sudo zfs create -V 16G stor/k8s/coreos03

ネットワークインタフェース作成

bridge インターフェースはbhyve環境として準備されている前提。

sudo ifconfig tap create
sudo ifconfig bridge addm tap0

ignition ファイルを作る

  • fedoraCoreOSは初期設定を ignition ファイルで指定するらしい
  • yaml で書いて、butane というツールで json に変換するらしい
  • なぜ変換を介在させるのかはよくわからない
  • テンプレートエンジンを持っているとか器用なことができるわけではない

ファイルを用意

  • ssh 公開鍵を置く
    • 2つあるのはbhyveホストと普段の生活環境PCの分
  • IP アドレスを指定する
    • DHCP側でIPアドレスを固定できるならその方が楽かも
    • hostname って NetworkNodemanager の設定で指定できないの?
  • ファイルは http で公開する
    • 署名付き S3 とか
    • ローカルHTTPサーバとか
variant: fcos
version: 1.5.0
passwd:
  users:
    - name: core
      ssh_authorized_keys:
        - ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAGbIdk/TcXdtEmKo7MgQGmhOKmaZgxGG8YXzWUP84yx1yI44YOlGUgSez4aR5JoJ40XdoyNJY6eJyN== BSD
        - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5A mac
storage:
  files:
    - path: /etc/NetworkManager/system-connections/enp0s2.nmconnection
      mode: 0600
      contents:
        inline: |
          [connection]
          id=enp0s2
          type=ethernet
          interface-name=enp0s2
          [ipv4]
          dns=192.168.3.1
          gateway=192.168.3.1
          address1=192.168.1.1/22
          method=manual

このファイルを butane で ign ファイルに変換する。適当に Linux VM を用意して実行する。

https://docs.fedoraproject.org/en-US/fedora-coreos/producing-ign/#_via_a_container_with_podman_or_docker

インストーラーの起動

こんな具合のスクリプトを使って Fedoracoreos のLiveDVDを起動する。 fbufのパスワードが指定してあるのは、指定なしだと接続できなかったため。mac の 画面共有アプリのせいなのかどうなのかは未確認。

while ループに入れているのは、ゲストOSの再起動時にも bhyve が終了してしまうので。bhyve の戻り値はゲストの終了の仕方によって決まっていて、再起動のときは 0 が返る。

CoreOS は自動で更新して自動で再起動するが、bhyveコマンドをループさせておかないとこのタイミングでVMが終了してしまう。

while [ $? -eq 0 ]; do
bhyve -A -H -P -c 2 -m 2048M \
  -s 0:0,hostbridge \
  -s 1:0,lpc \
  -s 2:0,virtio-net,tap0 \
  -s 3:0,virtio-blk,/dev/zvol/stor/k8s/coreos01 \
  -s 4:0,ahci-cd,/pub/ISO/Linux/FedoraCoreos/fedora-coreos-39.20231119.3.0-live.x86_64.iso \
  -s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait,password=pass \
  -s 30,xhci,tablet \
  -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
  fedoracore01
done

mac では 画面共有 (Screen Sharing.app) で VNC 接続できる。とりあえずは Installing CoreOS on Bare Metal に従ってインストールする。

https://docs.fedoraproject.org/en-US/fedora-coreos/bare-metal/

起動したらインストーラーコマンドを実行する。

sudo coreos-installer install /dev/vda \
--ignition-url https://s3.ap-northeast-1.amazonaws.com/ign.teak.jp/k8smaster01.ign?response-content-disposition=inline&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAkaDmFwLW5vcnRoZWFzdC0xIkcwRQIh...

この後に続く kubeadm とかの設定が面倒そうだなぁ、と思っている。

2024/09/23(月)bhyve で Ubuntu24

久しぶりなのと土台の bhyve 環境もなくなっていたのでおさらいを兼ねて。

bridge と tap を作成する。

%sudo ifconfig bridge create
%sudo ifconfig tap create
%sudo ifconfig bridge0 addm tap0

/etc/rc.conf.d/bhyve_bridge0.conf をこんな感じ?

cloned_interfaces="bridge0"
autobridge_interfaces="bridge0"
autobridge_bridge0="tap* em0"

ISOイメージを手に入れて

%ls /pub/ISO/Linux/Ubuntu/ubuntu-24.04.1-live-server-amd64.iso

ディスクを作って

%sudo zfs create -V 16G stor/bhyve/ubuntu24

bhyve 起動コマンドをファイルに書く fbuf(Frame Buffer) デバイスを定義しているので 5900/TCP に VNC でつなげばコンソールが見える。

bhyve -A -H -P -c 2 -m 2048M \
  -s 0:0,hostbridge \
  -s 2:0,virtio-net,tap0 \
  -s 3:0,virtio-blk,/dev/zvol/stor/bhyve/ubuntu24 \
  -s 4:0,ahci-cd,/pub/ISO/Linux/Ubuntu/ubuntu-24.04.1-live-server-amd64.iso \
  -s 29,fbuf,tcp=0.0.0.0:5900,w=1024,h=800,wait,password=ubuntu \
  -s 30,xhci,tablet \
  -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
  ubuntu24

起動

%sudo sh /common/bhyve/ubuntu.sh                                                     
fbuf frame buffer base: 0x151812a00000 [sz 16777216]

我が家は mac なので 画面共有(Screen Sharing)

スクリーンショット 2024-09-23 9.34.46.png
で接続する。bhyve 側でVNCのパスワードを設定しておかないとうまく動かないっぽい。

スクリーンショット 2024-09-23 9.32.34.png

OpenSSH の有効化と docker ランタイムのインストールだけいじって、後は既定値。 sshはパスワード認証いけるらしい。

#PasswordAuthentication yes

nmdm を使ったシリアルコンソールがうまく動かないのはなんでだ。

2024/09/21(土)股関節は反る

痛いとかばって変な動きになるのと、理解が間違えていたかも。股関節はちょっとかがむような姿勢なのかな?と思っていたんだけどガッツリ伸ばした方がいいというか伸ばさないとダメみたい。接地のときにも伸びたまま。衝撃を吸収するためにかがんでしまったりしがちだけどそれはダメっぽい。

体を反らしすぎたり反り腰はダメというけど、どっちかというと前かがみの方が禁忌。わかんなければ反ってしまっていい。動きが小さくなるくらいなら足が流れるほうが万倍マシなのと同じ理屈。

多分。

2024/09/19(木)IPv6対応してみた

AWSで動いています。絵に描きたい所ですが、 IGW - ALB - EC2 というよくある構成。

  • VPCにIPv6アドレスを追加する
    • AWS Managed を選ぶ
  • パブリックサブネットの「IPv6 CIDR を編集」で IPv6 を割り当てる
    • 64bitが最小単位のようなので、64bit割り当てる
    • プライベートサブネットにはIPv6なくていいと思う...
  • ルートテーブルで IPv6のデフォルトルート ::0 を IGW に向ける
    • IGWはすでにDualStack
  • ALB のネットワークマッピングで「IPアドレスタイプの編集」を選んでDualstack構成にする
    • ALB の設定を変更できるようになるまで時間が掛かった
  • ALBのインバウンドセキュリティグループを変更して任意のIPv6アドレスからの接続を許可する
  • Route53で AAAA レコードを登録する。ALB への ALIAS レコードでよい。

このページにあるリファレンスアーキテクチャの通りに作れば基本の構成は問題なさそう。 https://aws.amazon.com/jp/vpc/ipv6/

ログだとこんな感じでソースIPがIPv6になった。

172.16.0.137 - - [19/Sep/2024:01:28:56 +0000] "GET /adiary3/0887?edit HTTP/1.1" 200 46276 "https://mohi.teak.jp/adiary3/0887" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" "2409:10:2c20:6100:5cab:d03c:ffd1:ba43"

2024/09/16(月)宝くじで暮らそう

すっごく昔に、Loto6 を買うときの参考用に単純に 1~43の乱数を生成する perl スクリプトを書いた。何度か購入して1000円くらいあたった気がする。乱数生成器がメルセンヌ・ツイスターなのがこだわり(割とどうでもいい)。多分、普通に買うのと当選率は変わらない。

その後出現率とかを加味したコードも書いてみた。書いてはみたものの、出現データをみるというほどバラツキがない。例えば出現頻度が高い数字一覧のなかで出現頻度が低い数字は 50回あたり 4〜5回。出現頻度が低い数字の一覧の中で頻度が高い数字は 7回とかある。中央値がだいたい7回あたりなんじゃないかと思われる。平均回数は 50 x 6 / 43 =6.97 なのでまぁ、平均と中央値の差もほぼなさそうだ。今出てる出現頻度の偏りはただの偶然ぽい。

なので、出現確率を加味しても多分普通に買うのと当選率は変わらない。

#! /bin/perl
use Math::Random::MT qw(rand srand);
use POSIX qw(floor ceil);

# from https://takarakuji.rakuten.co.jp/data/loto/loto6/numbers_frequency/
# 2024/09/17
my %appear = ('1' => 4,
              '2' => 8,
              '3' => 8,
              '4' => 8,
              '5' => 12,
              '6' => 8,
              '7' => 10,
              '8' => 5,
              '9' => 7,
              '10' => 7,
              '11' => 8,
              '12' => 3,
              '13' => 3,
              '14' => 6,
              '15' => 5,
              '16' => 5,
              '17' => 4,
              '18' => 12,
              '19' => 9,
              '20' => 5,
              '21' => 7,
              '22' => 7,
              '23' => 11,
              '24' => 9,
              '25' => 9,
              '26' => 5,
              '27' => 6,
              '28' => 6,
              '29' => 13,
              '30' => 9,
              '31' => 5,
              '32' => 4,
              '33' => 11,
              '34' => 6,
              '35' => 4,
              '36' => 10,
              '37' => 8,
              '38' => 5,
              '39' => 4,
              '40' => 7,
              '41' => 7,
              '42' => 8,
              '43' => 4,
             );

# 各数字を出現回数だけ格納した配列を作る
my @ar;
while (my ($key, $value) = each(%appear)) {
  my $i = 0;
  # valueの数だけ配列に数字を加える
  while ($i < $value) {
    push @ar, $key;
    $i++;
  }
}

# 配列から要素を取り出していく
my @res; # result

# 乱数の初期化
srand time^$$;

my $i = 0;
while ($i < 6) {
  # 配列の要素数内で乱数を取る
  my $num = floor(rand $#ar);
  # 乱数を添字として数値を取り出す
  my $hit = @ar[$num];
  push @res, $hit;
  # 取り出した要素と同じ数値をを配列から全て削除
  @ar = grep $_ ne $hit, @ar;

  $i++;
}

#表示
@res = sort { $a <=> $b } @res;
$, = ' ';
$\ = "\n";
print @res;

データの用意をスクレイピングとかで自動化できたらいいね。あと、せっかくだから習作として Rust とかで書けばよかったね。