<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Infrastructure on Ingenboy.inc</title>
    <link>https://blog.ingenboy.com/categories/infrastructure/</link>
    <description>Recent content in Infrastructure on Ingenboy.inc</description>
    <image>
      <title>Ingenboy.inc</title>
      <url>https://blog.ingenboy.com/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://blog.ingenboy.com/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.152.2</generator>
    <language>en</language>
    <lastBuildDate>Sun, 18 Aug 2024 14:37:23 +0900</lastBuildDate>
    <atom:link href="https://blog.ingenboy.com/categories/infrastructure/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Learn_k8s_4</title>
      <link>https://blog.ingenboy.com/post/learn_k8s_4/</link>
      <pubDate>Sun, 18 Aug 2024 14:37:23 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_k8s_4/</guid>
      <description>&lt;p&gt;大人気K8Sシリーズ。
今回でなんと第４回目
まずは、過去の振り返りをやっていきましょう。&lt;/p&gt;
&lt;h1 id=&#34;振り返り&#34;&gt;振り返り&lt;/h1&gt;
&lt;p&gt;過去の奮闘記録。
&lt;a href=&#34;https://blog.ingenboy.com/post/learn_k8s/&#34;&gt;構築日記その１&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.ingenboy.com/post/learn_k8s_2/&#34;&gt;構築日記その２&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.ingenboy.com/post/learn_k8s_3/&#34;&gt;構築日記その3&lt;/a&gt;
第１回目と第二回目はインフラ構築を頑張っていた感じです。引っ越しとかあって、K8Sの勉強は飛び飛びになっている感じでね。
そして、第３回にして、やっと色々とインフラ構築をスムーズにできて、さまざまな概念についても理解できてきた、という感じです。
はい、サービスね。これが大事な概念だった。POD間で通信をするためには、Serviceが必要だったのではないか？とね。ServiceでPODをcoreDNSに登録することができる。
そして、基本的に一つのサービス内での通信はしない。サービス間の通信はあるが。なので、docker composeのようにはいかないという話だな。&lt;/p&gt;
&lt;p&gt;そして、今回の第４回目では、K8Sの使い方をもっと詳しく理解していきましょう、という回になっています。
具体的には、「つくって、こわして、直して学ぶkubernetes入門」という本に従って色々と進めていきたいと思っています。はい。
そして、第５回目に、私が開発した競馬システムをついにデプロイする、という感じに持っていきたいと思っています。よろしくお願いします。&lt;/p&gt;
&lt;h1 id=&#34;まずはharborにログインしておく&#34;&gt;まずは、harborにログインしておく&lt;/h1&gt;
&lt;p&gt;の前にロボットアカウントを作らないといけない感じ？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker login 100.64.1.61:20080 -u username -p password server
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;nerdctlを使っているのでbuildを使うためにbuildkitをインストールする必要がある&#34;&gt;nerdctlを使っているので、buildを使うためにbuildkitをインストールする必要がある。&lt;/h1&gt;
&lt;p&gt;しかも、buildkitdというのを走らせておく必要がある。&lt;/p&gt;
&lt;h1 id=&#34;テストでgoで簡易サーバを作って走らせる&#34;&gt;テストでgoで簡易サーバを作って走らせる&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package main

import (
        &amp;#34;fmt&amp;#34;
        &amp;#34;log&amp;#34;
        &amp;#34;net/http&amp;#34;
)

func main() {
        http.HandleFunc(&amp;#34;/&amp;#34;,func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w,&amp;#34;Hellow, wordl!&amp;#34;)
        })

        log.Println(&amp;#34;starting server on port 8880&amp;#34;)
        err := http.ListenAndServe(&amp;#34;:8880&amp;#34;, nil)
        if err != nil {
                log.Fatal(err)
        }

}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;dockerfile&#34;&gt;dockerfile&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;FROM golang:1.23 AS builder
WORKDIR /app
COPY . .
ENV CGO_ENABLED=0
RUN go mod tidy
RUN go build -o hello .

FROM scratch
COPY --from=builder /app/hello /hello
ENTRYPOINT [&amp;#34;/hello&amp;#34;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;go.modを入れるのを忘れずに。
go mod init github.com/hogehoge とかで問題ない。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Learn_k8s_3</title>
      <link>https://blog.ingenboy.com/post/learn_k8s_3/</link>
      <pubDate>Sat, 27 Jul 2024 22:21:28 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_k8s_3/</guid>
      <description>&lt;h1 id=&#34;k8s構築日記その３&#34;&gt;k8s構築日記その３。&lt;/h1&gt;
&lt;p&gt;過去の奮闘記録。
&lt;a href=&#34;https://blog.ingenboy.com/post/learn_k8s/&#34;&gt;構築日記その１&lt;/a&gt;
&lt;a href=&#34;https://blog.ingenboy.com/post/learn_k8s_2/&#34;&gt;構築日記その２&lt;/a&gt;
実は今まで一回もK8S上でアプリを動かしたことがないという。
これは正直恥ずかしいですね。構築はしたが、動かせはしていないという話だな。勿体無い！！
ってことで、今回は、K8S構築日記その３ということで、構築日記その１と構築日記その２を振り返りつつ、
ちゃんとアプリをクラスタ上で動かせるようにしたいと思います。はい。動かすアプリは、そうです、例の競馬アプリです。
そして、外部に公開して、しかも、インターネットから見えるようにしたいと思う。これができるとまじで最高だぜへへ。&lt;/p&gt;
&lt;h1 id=&#34;まずは構築から昔の俺が残してくれた手順に従って構築をやります&#34;&gt;まずは構築から昔の俺が残してくれた手順に従って構築をやります。&lt;/h1&gt;
&lt;h2 id=&#34;クラスター情報&#34;&gt;クラスター情報&lt;/h2&gt;
&lt;p&gt;master : controle plane
gamma : worker
zeta : worker&lt;/p&gt;
&lt;p&gt;でやりたいと思います。ちなみにマスターのosはraspbianです。&lt;/p&gt;
&lt;h2 id=&#34;バージョン情報&#34;&gt;バージョン情報&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://containerd.io/releases/&#34;&gt;このサイト&lt;/a&gt;
を参考にバージョンを決めた。
k8s (kubelet : kubeadm) : 1.27
containerd : 1.7.0 + なので、1.7.2でインストールする。
&lt;a href=&#34;https://github.com/containerd/containerd/releases/download/v1.7.20/cri-containerd-cni-1.7.20-linux-arm64.tar.gz&#34;&gt;containerdのarmバイナリ&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;k8sを導入するまとめ&#34;&gt;k8sを導入するまとめ&lt;/h1&gt;
&lt;h2 id=&#34;1-containerdを導入&#34;&gt;1. containerdを導入。&lt;/h2&gt;
&lt;p&gt;k8sのv1.25以降は、コンテナエンジンにdockerエンジンを使えません。(理由は、dockerがcriを満たしていないから)。criを満たしてるcontainerdをインストールする必要があります。
containerdのインストールは、githubのリポジトリからできます。同時に、runcとcniもインストールしてださい。
ちなみに、cniは、container network interfaceで、まあ、コンテナのネットワークを操るためのapiですね。
で、そのapiを操るのが、cniプラグイン。で、cniプラグインには、calicoだったり、flannelだったりがあるわけですね。で、プラグインには、3種類のモードがあって、オーバーレイと、ルーティングと、アンダーレイですね。オーバレイを使うことで、別のホスト上にいるコンテナ同士が同じセグメントにいるようになります。&lt;/p&gt;
&lt;p&gt;で、だけど、/etc/cni/net.dにはデフォルトのやつ、おかなくて結構です。まったく問題ありませんので、お気になさらず。ということで。
ちなみに、これにはruncも入っているので安心してインストール/ダウンロードしてください。全く問題ないです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wget https://github.com/containerd/containerd/releases/download/v1.7.20/cri-containerd-cni-1.7.20-linux-arm64.tar.gz
mkdir containerd_dir
mv cri-containerd-cni containerd_dir
tar xvfz cri
sudo mkdir /etc/containerd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;必要なものを必要なディレクトリに置いてくれるように以下のスクリプトを実行&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash

# Define the paths to your installation directories
CONTAINERD_BIN_DIR=&amp;#34;/usr/local/bin&amp;#34;
CONTAINERD_SBIN_DIR=&amp;#34;/usr/local/sbin&amp;#34;
CONTAINERD_ETC_DIR=&amp;#34;/etc/containerd&amp;#34;
CONTAINERD_SYSTEMD_DIR=&amp;#34;/etc/systemd/system&amp;#34;
CONTAINERD_OPT_DIR=&amp;#34;/opt/&amp;#34;

# Define the source directory where you extracted the Containerd files
SOURCE_DIR=&amp;#34;/home/ray/containerd_dir&amp;#34;

# Move binary files to /usr/local/bin
cp -r &amp;#34;$SOURCE_DIR/usr/local/bin/&amp;#34;* &amp;#34;$CONTAINERD_BIN_DIR/&amp;#34;

# Move sbin files to /usr/local/sbin
cp -r &amp;#34;$SOURCE_DIR/usr/local/sbin/&amp;#34;* &amp;#34;$CONTAINERD_SBIN_DIR/&amp;#34;

# Move etc files to /etc/containerd
cp -r &amp;#34;$SOURCE_DIR/etc/&amp;#34;* &amp;#34;$CONTAINERD_ETC_DIR/&amp;#34;

# Move systemd service file to /etc/systemd/system
cp &amp;#34;$SOURCE_DIR/etc/systemd/system/containerd.service&amp;#34; &amp;#34;$CONTAINERD_SYSTEMD_DIR/&amp;#34;

# move cni and other utils to opt
cp -r &amp;#34;$SOURCE_DIR/opt/containerd&amp;#34; &amp;#34;CONTAINERD_OPT_DIR&amp;#34; 
cp -r &amp;#34;$SOURCE_DIR/opt/cni&amp;#34; &amp;#34;CONTAINERD_OPT_DIR&amp;#34; 

# Reload systemd to recognize the new service
systemctl daemon-reload
echo &amp;#34;Containerd installed successfully.&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;nerdctlも一緒にいんすとる&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmoxサーバ爆誕</title>
      <link>https://blog.ingenboy.com/post/proxmox/</link>
      <pubDate>Sat, 06 Jul 2024 13:11:18 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/proxmox/</guid>
      <description>&lt;h1 id=&#34;何の記事か&#34;&gt;何の記事か&lt;/h1&gt;
&lt;p&gt;Proxmoxという仮想マシン専用のマシンを立てる方法。そして遊んでみる。&lt;/p&gt;
&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;p&gt;[proxmoxのインストール方法] (&lt;a href=&#34;https://qiita.com/C_Kenta/items/70ecb32495fce9e1de52&#34;&gt;https://qiita.com/C_Kenta/items/70ecb32495fce9e1de52&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/stLuciano/items/49652543192f2402e7c8&#34;&gt;proxmoxを使ってできること&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;proxmoxとは何か&#34;&gt;Proxmoxとは何か&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;ProxmoxはDebianベースの仮想化プラットフォームです。操作はすべてWeb インターフェースで行うことができ、仮想マシンやLinuxコンテナを簡単に作成することができます。バックアップを簡単に作成でき、修復も非常に容易です。ハードウェアパススルーも可能で、USBカメラ、マウス、キーボードなどのデバイスをVMに渡すことができます。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;ひところ&#34;&gt;ひところ&lt;/h2&gt;
&lt;p&gt;えぐい&lt;/p&gt;
&lt;h1 id=&#34;立てる&#34;&gt;立てる&lt;/h1&gt;
&lt;p&gt;手順&lt;/p&gt;
&lt;h2 id=&#34;公式から&#34;&gt;公式から&lt;/h2&gt;
&lt;p&gt;proxmoxのisoを持ってくる。以上。&lt;/p&gt;
&lt;h2 id=&#34;インストール時の注意点&#34;&gt;インストール時の注意点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;最新のをインストールしようとしたら、waitinig for /dev fully populated
的なのが出てきたけど、それは一個前のどの手段でインストールするかのところでeを押して、カーネルのブートパラメータにnomodesetをつけると解消された。よろぴく&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実はVMてハードウェアの動きをソフトウェアでエミュレートする方法と、
もう一つKVMってのがあってね、KVMの方が圧倒的に速いわけですよ。んでね、
KVM hardware virtualizationってのをOFFにすると、ソフトウェアでエミュレートになる。しかし、これは遅いからKVM hardware virtualizationはONにした方がいい。しかし、ONにするにはBIOSでKVMをonにする設定を施さないといけない。それはリモートからではできないって話だな。乙。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;BIOSのKVM VirtualizationをOFFにしたままUbuntuを走らせようとしたらこう怒られました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;KVM virtualisation configured, but not available. Either disable in VM configuration or enable in BIOS.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;advanced setting -&amp;gt; CPU Configuration -&amp;gt; SVM Mode -Enable &amp;gt; Save &amp;amp; reset
これをやらないと勝ちで遅すぎて話にならなかった。すべてが遅すぎる。
マジで、CPUの動きをエミュレートする仮想化は、KVMと比べて10倍遅かった。えぐい。&lt;/p&gt;
&lt;h1 id=&#34;gpuのパススルー&#34;&gt;GPUのパススルー&lt;/h1&gt;
&lt;p&gt;これが結構面倒くさい。
VM上でOllama立ててllmを動かそうとしているんだけど、なかなかうまくいかない。
これはchatgptから得た回答だから、確証はないんだけど、参考にしてほしい。
chatgpt曰く、やらないといけないことは二つ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enabling IOMMU&lt;/li&gt;
&lt;li&gt;Enabling VFIO&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;enabling-iommu&#34;&gt;Enabling IOMMU&lt;/h2&gt;
&lt;p&gt;これは何をやっているかだけど、&lt;/p&gt;</description>
    </item>
    <item>
      <title>KVM_server_and_ansible</title>
      <link>https://blog.ingenboy.com/post/kvm_server_and_ansible/</link>
      <pubDate>Sat, 06 Jul 2024 12:11:18 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/kvm_server_and_ansible/</guid>
      <description>&lt;h1 id=&#34;何の記事か&#34;&gt;何の記事か&lt;/h1&gt;
&lt;p&gt;LinuxサーバでKVMを使った仮想マシン (VM)を立てられるようにし、
&lt;a href=&#34;https://github.com/kimchi-project/kimchi&#34;&gt;KIMCH&lt;/a&gt; を使い、webコンソールからVMを立てられるようにし、さらにansibleでVMにインフラのデプロイ、そしてネットワークなどをいじる記事&lt;/p&gt;
&lt;h1 id=&#34;雑談&#34;&gt;雑談&lt;/h1&gt;
&lt;p&gt;はい、完全に分離された自宅ネットワークでしたが、openVPNを使ったsite2site接続により、外からアクセスできるようになってしまった。これがマジで恐ろしい話や。
再びコンピュータを勉強する気力がわいてきたって話だ。頑張るぞい。&lt;/p&gt;
&lt;p&gt;dkong上で動かそうと思う。自宅ネットワークでのdkongのipアドレスは
100.64.1.70や。VPNを使えばいつでもアクセスが可能になる。さらにインターネット上のhugo_serverのnginxでvpnをとおしてプロキシすることもできるので、実質インターネットに接しているdkongってわけだ。ネットワークえぐい。&lt;/p&gt;
&lt;h1 id=&#34;インストール手順&#34;&gt;インストール手順&lt;/h1&gt;
&lt;p&gt;基本的には&lt;a href=&#34;https://github.com/kimchi-project/kimchi&#34;&gt;KIMCH&lt;/a&gt;ここに書いてある通りに進めれば問題ない。&lt;/p&gt;
&lt;h2 id=&#34;1-wokのインストール&#34;&gt;1. Wokのインストール&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kimchi-project/wok/#getting-started&#34;&gt;Wokとは&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;wokのリポジトリをクローン&#34;&gt;Wokのリポジトリをクローン&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/kimchi-project/wok.git
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;wok依存ライブラリやランタイムなどをインストール&#34;&gt;wok依存ライブラリやランタイムなどをインストール&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install -y python3-pip

sudo -H pip3 install -r requirements-dev.txt

sudo apt install -y gcc make autoconf automake git python3-pip python3-requests python3-mock gettext pkgconf xsltproc python3-dev pep8 pyflakes3 python3-yaml

sudo apt install -y systemd logrotate python3-psutil python3-ldap python3-lxml python3-websockify python3-jsonschema openssl nginx python3-cherrypy3 python3-cheetah python3-pam python3-m2crypto gettext python3-openssl
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;wokをビルド-and-install&#34;&gt;Wokをビルド and install&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo ./autogen.sh --system
make
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;wokを起動&#34;&gt;wokを起動&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo python3 src/wokd
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;wokにブラウザでアクセス&#34;&gt;wokにブラウザでアクセス&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://100.64.1.70:8001/login.html
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;初期パスワードを入力してログイン&#34;&gt;初期パスワードを入力してログイン&lt;/h3&gt;
&lt;p&gt;これ、ログインクレデンシャル、システムのとおんなじなのがすごい。びっくり！&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slurmクラスタ構築日記</title>
      <link>https://blog.ingenboy.com/post/learn_slurm/</link>
      <pubDate>Mon, 16 Jan 2023 23:59:40 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_slurm/</guid>
      <description>&lt;h1 id=&#34;hpcといえばslurmだよね&#34;&gt;HPCといえばSlurmだよね&lt;/h1&gt;
&lt;p&gt;ラズパイが腐るほどあるので、Slurmクラスタを作る。流れとしては、Slurmの全体像を理解してから、実際にSlurmをインストールして、クラスタを構築。んで、MPIジョブを投入できたら最高ですね。&lt;/p&gt;
&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://slurm.schedmd.com/&#34;&gt;slurm公式&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;slurmの全体像&#34;&gt;Slurmの全体像&lt;/h1&gt;
&lt;p&gt;クラスタを使って並列分散処理をしたいとき、どうするか？例えばMPIを使ってなにかを計算したいとき、どうするか?直接mpirunをすればいいよね？簡単だ。うん。ユーザがおれ一人で他の人がクラスタを使わない前提であれば直接実行していいよね。しかし、HPCシステムってのは基本的にはいろんな人に使われるんですよ。そんな時にいろんな人が同時にMPIのジョブを実行すると何が起こるか？
まあ、これは予想だけど、基本的に1つのMPIプロセスに対して1つのコアが割り当てられるので、コア数を超えるプロセスが割り当てられそうなときは、mpirunの実行が失敗すると思うんですよ。&lt;/p&gt;
&lt;p&gt;このようなリソース競合によるジョブの実行失敗などを防いだり、その他、リソースのマネジメントをするのがリソースマネジメントシステム(RMS)だよね。SlurmもRMSなわけだ。いろいろなRMSがあるわけで、その中でもSlurmの特徴が三つある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ある一定期間、ユーザが計算資源（ノード）を占有することを許す&lt;/li&gt;
&lt;li&gt;各ノードに対して、ジョブのスタート、実行、監視を可能にする&lt;/li&gt;
&lt;li&gt;待ち行列内のpending jobに対して、恣意的な実行を可能にする&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;slurmのアーキテクチャ&#34;&gt;slurmのアーキテクチャ&lt;/h2&gt;
&lt;p&gt;各ノードでslurmdデーモンが動いている。そして、マネジメントノード（マスターノード）ではslurmctldデーモンが動いている。ユーザはクライアントアプリを使って、slurmctldにアクセスし、ジョブのサブミットや、状態の確認ができる。&lt;/p&gt;
&lt;h1 id=&#34;slurmのインストール&#34;&gt;Slurmのインストール&lt;/h1&gt;
&lt;h2 id=&#34;参考文献-1&#34;&gt;参考文献&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/evakichi/items/265c218362b200c3bc3d&#34;&gt;文献1&lt;/a&gt;
&lt;a href=&#34;https://glmdev.medium.com/building-a-raspberry-pi-cluster-784f0df9afbd&#34;&gt;文献２(一番参考になった資料)&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;前提&#34;&gt;前提&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;ノード間でuidが同じユーザが作られていること
これは、最初にラズパイの設定をするときにユーザ名を一律に決めておくことで解決できる。&lt;/li&gt;
&lt;li&gt;ノード間でシステムの時刻が一致している事
これは、raspi-configのロケール設定でAsia/Tokyoを選ぶことで解決できる&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;マスターノードのあるディレクトリをnfsとして外部にエクスポートしておくといろいろとらく&#34;&gt;マスターノードのあるディレクトリをnfsとして外部にエクスポートしておくといろいろとらく&lt;/h2&gt;
&lt;h2 id=&#34;マスターノードスレーブノードのホスト名を決めておく&#34;&gt;マスターノード、スレーブノードのホスト名を決めておく&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/etc/hosts
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;マスターノードの設定&#34;&gt;マスターノードの設定&lt;/h1&gt;
&lt;h1 id=&#34;リポジトリからのインストール&#34;&gt;リポジトリからのインストール&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install slurm-wlm -y
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;slurmの設定&#34;&gt;Slurmの設定&lt;/h2&gt;
&lt;p&gt;設定ファイルの場所は&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/etc/slurm/slurm.conf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この場所に、デフォルトの設定ファイルを持ってくる&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cp /usr/share/doc/slurm-client/examples/slurm.conf.simple.gz .
gzip -d slurm.conf.simple.gz
mv slurm.conf.simple slurm.conf
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;設定ファイルslurmconfの内容は厳密にかかないとだめ&#34;&gt;設定ファイル(slurm.conf)の内容は厳密にかかないとだめ&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SlurmctldHost=node01(&amp;lt;ip addr of node01&amp;gt;)
# e.g.: node01(192.168.1.14)
# actual : zeta(172.20.2.1)
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SelectType=select/cons_res
SelectTypeParameters=CR_Core
...
...
ClusterName=glmdev
...
...
NodeName=zeta NodeAddr=172.20.2.1 CPUs=4 Sockets=1 CoresPerSocket=4 State=UNKNOWN
NodeName=slave1 NodeAddr=172.20.2.3 CPUs=4 Sockets=1 CoresPerSocket=4
State=UNKNOWN
NodeName=slave2 NodeAddr=172.20.2.4 CPUs=4 Sockets=1 CoresPerSocket=4
State=UNKNOWN
NodeName=slave3 NodeAddr=172.20.2.5 CPUs=4 Sockets=1 CoresPerSocket=4
State=UNKNOWN
NodeName=slave4 NodeAddr=172.20.2.6 CPUs=4 Sockets=1 CoresPerSocket=4
State=UNKNOWN
PartitionName=mycluster Nodes=slave[1-4] Default=YES MaxTime=INFINITE
State=UP
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;cgroup関係の設定ファイルをつくる&#34;&gt;cgroup関係の設定ファイルをつくる&lt;/h2&gt;
&lt;p&gt;/etc/slurm/cgroup.confに&lt;/p&gt;</description>
    </item>
    <item>
      <title>k8sクラスタの環境構築</title>
      <link>https://blog.ingenboy.com/post/learn_k8s/</link>
      <pubDate>Tue, 27 Dec 2022 21:11:31 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_k8s/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;k8sという技術が注目を浴びている。web業界での近年の大きな変化としてはアプリケーションアーキテクチャの変化が挙げられる。従来は、アプリケーションを構成するソフトはモノリシック(一枚板)であった。つまり、アプリケーションは、一つのソースコードで1プロセスで動いているような感じだった。しかし、このモノリシックなアーキテクチャではソースコードが複雑で、変更が加えにくい等の問題があった。チームで開発する際も、メンバーみんなが同じソースコードをつかってビルドをする必要がある等、いろいろと面倒なことが多かったと思う。そこで、近年はアプリ開発にはマイクロサービスアーキテクチャが採用されている。マイクロサービスアーキテクチャは、小さなコンポーネントの集合が全体として一つのアプリケーションを構成しているようなアーキテクチャである。&lt;/p&gt;
&lt;p&gt;自分も意図せずして、開発してきたアプリはマイクロアーキテクチャにしていたが、こちらの方が各コンポーネントの役割をきちんと明確化して進められるので、開発を分担できるのと、変更を加えるとき、役割がコンポーネントに分かれているので、各コンポーネントの中身だけを変えればよく、管理が簡単になると思われる。つまり、APIだけそろえておけば、後は中身はなんだっていいということだ。
これによって、アジャイル開発が非常に簡単になると思われる。
そして、このコンポーネントをひとつひとつをコンテナ化するってのも近年の大きな流れっぽい。そして、コンテナ化されたコンポーネント（マイクロサービス）をうまく協調させるのが
コンテナオーケストレーションツールってはなしだ。
コンポーネントを協調させる、と書いたが、具体的には(k8sの機能は非常に多いので、俺が理解できる、かつ、大事そうなものだけをピックアップする)、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;コンテナのスケジューリング&lt;/li&gt;
&lt;li&gt;スケーリング/オートスケーリング&lt;/li&gt;
&lt;li&gt;障害時のセルフヒーリング&lt;/li&gt;
&lt;li&gt;ロードバランシング&lt;/li&gt;
&lt;li&gt;ワークロードの管理
とかがある。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一方、HPC分野でもK8Sを活用しようという試みがある。これはどういうことか？実は僕もよくわかっていません。k8sをスケジューラに使おうっていう話ぽい。そして、slurmと比較して、k8sが何なのかってのを調べてるみたいですね。
参考資料を少し上げておきます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.slideshare.net/pfi/kubecon-cloudnativecon-europe-2022-recap-batchhpcscheduler-kubernetes-meetup-tokyo-51-k8sjp&#34;&gt;ref1&lt;/a&gt;
&lt;a href=&#34;https://www.slideshare.net/pfi/pfnmldlkubernetes-devopsdays-tokyo-2021&#34;&gt;ref2&lt;/a&gt;
&lt;a href=&#34;https://www.slideshare.net/pfi/pfn-ml-ml-on-kubernetes-pfn-2&#34;&gt;ref3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これは研究室の仲間と一緒に調べていくことにして、僕は僕で、web業界で使われているk8sがどんなものなのかに焦点を合わせて勉強していきたいと思う。
そして、実際にk8s上で去年開発したアプリを動かしてみる、というのを最終目標にしたいです。せっかくあのアプリはマイクロサービスアーキテクチャになっているからね。インターフェースは全部rest化されているし。&lt;/p&gt;
&lt;h2 id=&#34;物理クラスタの構築&#34;&gt;物理クラスタの構築&lt;/h2&gt;
&lt;p&gt;実験環境はラズパイクラスタです。
まあ、自宅lan内にマスターノードを1台置いて、その下にあらたなネットワークを作って、マスターノードでnatした。
あと、サブネットワークでipを固定した。
詳しくは、別の記事に書いてあるのでそっちを見てくれるとありがたい。&lt;/p&gt;
&lt;h2 id=&#34;k8sの基本的なコンポーネント&#34;&gt;k8sの基本的なコンポーネント&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=X48VuDVv0do&#34;&gt;参考動画&lt;/a&gt;
&lt;a href=&#34;https://qiita.com/ryu-yama/items/2e23342fd0f37e43a925&#34;&gt;基本用語説明&lt;/a&gt;
dbと連携させたjsアプリを題材に、k8sのコンポーネントを説明していくよ！&lt;/p&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;cluster
k8sのリソースを管理する集合体のこと&lt;/li&gt;
&lt;li&gt;node
物理マシン、もしくは仮想マシンのこと。つまり、ホストのこと。
ノードには、master nodeと普通のnodeがある。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;master nodeはkubernetesを管理するため、次の管理コンポーネントを持つ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;kube apiserver:kubernetesのAPIを公開する。kubectlからの操作を受け付ける役割。kubeletからもアクセスを受けるし、他にもいろいろなクライアントがある。これがclusterへのgatewayになる。&lt;/li&gt;
&lt;li&gt;etcd:分散kvs。クラスタのバッキングストアとして使用される。ログとかが記録されている。etcdは分散kvs、ということはetcdを何個か立てることが可能、ということでして、そうするとetcd間で内容の一貫性を保たないといけないわけですね。ということは？お？層です。分散合意アルゴリズムのraftが使われているわけですね。最高です。&lt;/li&gt;
&lt;li&gt;kube scheduler:コンテナを配置する最適なnodeを選択する。ここも研究の対象になりえるところではある。&lt;/li&gt;
&lt;li&gt;kube controller manager: リソースを制御する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;普通のNodeはコンテナ化されたアプリケーションを実際に実行するホスト&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;pod
コンテナの集合体。PodはNodeの中で動作し、一つ以上のコンテナを持つ。
K8sにデプロイするときは、Pod単位で行う。
pod一つでなにか機能を果たす、とかそういう感じでpodにまとめるのだと思われる。
そうだね、1 application per Podというのが基本らしい。
しかし、そのアプリケーションは2つのコンテナから構成されていても問題ない。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;k8sはvirtual networkを提供。各Podはこの仮想ネットワーク上でIPアドレスを持っている。
そして、これが結構大事な概念だんだが、Podは結構簡単に死ぬ。そして、Podが死んだら、新しいPodがデプロイされるのだが、その時にIPアドレスが変わってしまうというのが不便らしい。その時に使うのがServiceらしい。&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;Container
Dockerコンテナのこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ReplicaSet
同一仕様のPodを複数生成する仕組み。
ReplicaSetを複数持っておくことで、一つのReplicaSetが死んでも他のReplicaSetに
処理を移すことでシステムが死んでいる時間をなくす。
後は、ロードバランスもできる。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;データベースは基本的にk8sクラスタの外で管理する。というのも、ステートを考えるのが面倒くさいかららしいです。&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;
&lt;p&gt;Service
Serviceは、Podにアクセスするための経路を定義。
PodのIPアドレスを固定できる。
外部への公開ポイントもここで設定する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deployment
ReplicaSetの上位リソースで、ReplicaSetを管理する。
つまり、
DeploymentがReplicaSetを管理し、ReplicaSetがPodを管理する。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
