Master_DNS

DNSはrequestとresponseが同じ系形式のUDPパケットでやり取りされるプロトコルである。 で、実はdigがdnsプロトコルのパケット内容を忠実に再現しているのです。だから、これマスターするDNSがほぼ分かったということになります。 関連ドキュメント ハンズオンの ハンズオンを紹介しているやつ rfsの読み方を説明している資料 ルートDNSの場所 digコマンドでの遊び方 digでの遊び方 dnsの全体像 dig関連 digの基本的なオプション +noedns : tcpで問い合わせ +norec : 非再起問い合わせを強制する。 qr : queryレスポンス rd : recursion desired : 再起問い合わせ要求。(Set by the sender of the request if the server should attempt to resolve the query recursively if it does not have an answer readily available.) ra : recursion available : 再起問い合わせ対応が可能か?(Set by the server to indicate whether or not recursive queries are allowed.) 基本的に、名前解決と言ったら8.8.8.8などのDNSキャッシュサーバが再起問い合わが実行して返してくれる。 しかし、権威DNSは再起問い合わせができないからね。 rdがついてもraがなかったら非再起問い合わせができないということになります。いくつかみてみましょうか? いくつかDNSレコードを送ってみましょうか? dig @1.1.1.1 +norec blog.ingenboy.com ; <<>> DiG 9.18.28-0ubuntu0.24.04.1-Ubuntu <<>> @1.1.1.1 +norec blog.ingenboy.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 21079 ;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;blog.ingenboy.com. IN A ;; Query time: 1 msec ;; SERVER: 1.1.1.1#53(1.1.1.1) (UDP) ;; WHEN: Thu Aug 22 09:05:47 JST 2024 ;; MSG SIZE rcvd: 46 +norecをつけたのでDNSサーバは非再起問い合わせで名前解決ができません。そのため、answer sectionがないわけですね。 つまり、名前解決できなかったわけです。それにもかかわらずGot answerって書いているのはタチが悪いよね。 ...

August 4, 2024 · 4 min · 757 words · Me

Telegraf + InfluxDBでシステムモニタリング

参考文献 Telegraf grafana prometheus 最終成果物 influx_dbのダッシュボード 背景 業務でnginxの運用に携わっているのだが、nginxのrpsやレスポンスステータスごとの返却数など、どうやってモニタリングしているのか気になっていた。telegrafを使っていたのはわかったんだけど、実際にどうやってデータを取って、それをどうやってデータサーバで保存して、可視化をしていたのか、非常に気になっていたのです。それが今日解決しました。Telegraf、grafana、そして、prometheus,結構使えそうです。この記事では、メトリクスを可視化するためのツールを揃えていこうと思います。 Telegrafの概要 Telegraf is an agent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data. 他にもTelegrafこういう感じのTelegrafの説明もあります。僕はこっちの方が好きだった Telegraf, a server-based agent, collects and sends metrics and events from databases, systems, and IoT sensors. Written in Go, Telegraf compiles into a single binary with no external dependencies–requiring very minimal memory. らしいですね。 collecting and writingなので、データをどこからか取ってきて、どこかに送るというわけです。そうです、inputとoutputを決められるわけですね。それも膨大な数のInputとoutputがあります。正直これは驚きました。こんなにあるんかとね。すごいです。ちょっと使えそうなinputとoutputを何個かpickupしておきたいと思います。 input Apache Input Plugin BIND 9 Nameserver Statistics Input Plugin Ceph Storage Input Plugin CGroup Input Plugin Conntrack Input Plugin CouchDB Input Plugin CPU Input Plugin Disk Input Plugin DNS Query Input Plugin Docker Input Plugin Kernel Input Plugin Kubernetes Input Plugin Lustre Input Plugin MySQL Input Plugin Nginx Input Plugin って感じで本当になんでもある。これはえぐい。 16. nvidia-smi 17. postgres 18. proxmox 19. prometheus ...

August 1, 2024 · 7 min · 1380 words · Me

2024Aug_TODO

2024/08/1時点でのタスクリスト 開発関係 nginx + telegraf + grafana + prometheusで、外部から可視化したい!!ここにはめちゃめちゃ技術が詰め込まれていますからね。いいですねーーー! –>結局influxDBとtelegrafを使ってシステムモニタリングすることにした。これは楽しいですね。しかし、血胸知識なんですよね。知恵は使ってない。知恵を振り絞ってこそ楽しいのではないか。 早めにインターネット回線を契約しよう 自宅のraspiでK8Sクラスタを展開してくれ。でtelegrafでk8sのシステムをモニタリングして、可視化しよう。可視化は多分そこまで難しくないと思う。頑張ってくれ!! NISA口座を開設 JC_booking_centerを早く稼働させてくれ、同時にjc_licence_translationを早く作ってくれ。とりあえずは、予約を承って、承った旨をメールで送信し、こちらからもみられるようなシステムが作れるといいかな。はい、そんな感じ。 –> 作らずに解決することにした。 自宅のK8S上にecho-serverを立てて、proxyを複数立てて、さらにvipを立てて、vegetaで負荷試験ができるようにしたい。そして、様々なメトリクスが取れるようにしたい。どうやるんだろうか。 I and shiraki-san decided to develop GSLB using go lang. It is going to be funny Learn DNS (こっちはかなりいい感じで進んでいる。) Learn How to write packer parser using Go on TCP Layer. It is also going to be funny. 例の競馬システムを動かす時が来た。自宅のk8sで動かせるようにmanifestファイルを書いてください。よろぴくお願いしますです。 Go言語でdistributed file systemを作ってくれ!このyoutubeを見てでもいいし、goで分散システムを作ろうって入ってきたあの本でもいい。どっちでもいい。ただ、後者だとk8s上に作った分散システムを展開するので、上のやつとも親和性が高い気がしています。はい。 ISUCONの過去問を解きましょう。今年のISUCONにおそらく白木さんと出ることになります。足を引っ張りたくないので頑張ります。 ーー>isucon14の申し込みが始まったという話です。頑張りましょう。 ...

August 1, 2024 · 1 min · 73 words · Me

リンクレイヤーで使われるネットワークコマンドをまとめる

リンクレイヤー MACアドレスですねー。実際に通信をする相手を指定するときはMACアドレスを指定しますね。 Network deviceがMACアドレスを持っていて、OSはIPとMACの対応表をARPテーブルに持っているんですね。 IPからMACを知ることをARP (address resolution protocol) って言いますね。 脆弱性 正直、ARPは脆弱性まみれに見える。 というのも完全に性善説に基づいているから。 「xxのIPアドレスを持っている機器はどこにありますかーー??」に対して、「おれですー」ってやってくるやつが、本当にそうだと信じてしまう。 だからARP spoofingが簡単にできてしまうということだ。ちょっと実験してみたいよね。 kickthemout LAN内のほかのノードを締め出すツール 実験していましょうか。 sudo apt install git git clone https://github.com/k4m4/kickthemout.git sudo apt install nmap cd kickthemout sudo apt install pip sudo -H pip3 install -r requirements.txt arpspoof こっちの方が簡単だね。 arpspoof

July 29, 2024 · 1 min · 44 words · Me

Learn_k8s_3

k8s構築日記その3。 過去の奮闘記録。 構築日記その1 構築日記その2 実は今まで一回もK8S上でアプリを動かしたことがないという。 これは正直恥ずかしいですね。構築はしたが、動かせはしていないという話だな。勿体無い!! ってことで、今回は、K8S構築日記その3ということで、構築日記その1と構築日記その2を振り返りつつ、 ちゃんとアプリをクラスタ上で動かせるようにしたいと思います。はい。動かすアプリは、そうです、例の競馬アプリです。 そして、外部に公開して、しかも、インターネットから見えるようにしたいと思う。これができるとまじで最高だぜへへ。 まずは構築から昔の俺が残してくれた手順に従って構築をやります。 クラスター情報 master : controle plane gamma : worker zeta : worker でやりたいと思います。ちなみにマスターのosはraspbianです。 バージョン情報 このサイト を参考にバージョンを決めた。 k8s (kubelet : kubeadm) : 1.27 containerd : 1.7.0 + なので、1.7.2でインストールする。 containerdのarmバイナリ k8sを導入するまとめ 1. containerdを導入。 k8sのv1.25以降は、コンテナエンジンにdockerエンジンを使えません。(理由は、dockerがcriを満たしていないから)。criを満たしてるcontainerdをインストールする必要があります。 containerdのインストールは、githubのリポジトリからできます。同時に、runcとcniもインストールしてださい。 ちなみに、cniは、container network interfaceで、まあ、コンテナのネットワークを操るためのapiですね。 で、そのapiを操るのが、cniプラグイン。で、cniプラグインには、calicoだったり、flannelだったりがあるわけですね。で、プラグインには、3種類のモードがあって、オーバーレイと、ルーティングと、アンダーレイですね。オーバレイを使うことで、別のホスト上にいるコンテナ同士が同じセグメントにいるようになります。 で、だけど、/etc/cni/net.dにはデフォルトのやつ、おかなくて結構です。まったく問題ありませんので、お気になさらず。ということで。 ちなみに、これにはruncも入っているので安心してインストール/ダウンロードしてください。全く問題ないです。 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 必要なものを必要なディレクトリに置いてくれるように以下のスクリプトを実行 #!/bin/bash # Define the paths to your installation directories CONTAINERD_BIN_DIR="/usr/local/bin" CONTAINERD_SBIN_DIR="/usr/local/sbin" CONTAINERD_ETC_DIR="/etc/containerd" CONTAINERD_SYSTEMD_DIR="/etc/systemd/system" CONTAINERD_OPT_DIR="/opt/" # Define the source directory where you extracted the Containerd files SOURCE_DIR="/home/ray/containerd_dir" # Move binary files to /usr/local/bin cp -r "$SOURCE_DIR/usr/local/bin/"* "$CONTAINERD_BIN_DIR/" # Move sbin files to /usr/local/sbin cp -r "$SOURCE_DIR/usr/local/sbin/"* "$CONTAINERD_SBIN_DIR/" # Move etc files to /etc/containerd cp -r "$SOURCE_DIR/etc/"* "$CONTAINERD_ETC_DIR/" # Move systemd service file to /etc/systemd/system cp "$SOURCE_DIR/etc/systemd/system/containerd.service" "$CONTAINERD_SYSTEMD_DIR/" # move cni and other utils to opt cp -r "$SOURCE_DIR/opt/containerd" "CONTAINERD_OPT_DIR" cp -r "$SOURCE_DIR/opt/cni" "CONTAINERD_OPT_DIR" # Reload systemd to recognize the new service systemctl daemon-reload echo "Containerd installed successfully." nerdctlも一緒にいんすとる ...

July 27, 2024 · 8 min · 1636 words · Me

ルータ+DHCPサーバ+DNSサーバ+K8Sコントロールプレーン on Raspi 5 with 8GB RAM(下書き)

背景 ついにインフラエンジニアになった。インフラエンジニアになったのであれば、インフラ関係を一通りこなせないと話にならないだろう! というお話です。ということで、クラスタ作って、クラスタがいい感じに運用できるようにいろいろとインフラを構築していこうと思う。 さらに言うと、業務でansibleを使っているので、IaC(インフラストラクチャasコード)を実現したいと思っている。これができればいつでもそのインフラが再現可能になるからね。練習も込みで。 要件 完全に独立したネットワークを構築したいと思っている。そのため、 ルータ が必要。この時、内部ネットワークから外部にアクセスする必要がないよね。だから、natでいいわけだね。 次に、サブネット内でDHCPをしつつ、アドレスの固定を一括で管理したい。 それの実現方法がDHCPを使って、macアドレスとipを対応付けるという方法。 さらに、ネットワーク内で、ipアドレスではなく、ドメイン名でアクセスができるようにしたいので、DNSサーバも立てたい。 最後、K8Sのコントロールプレーンだね。これは作りたい。 K8Sサーバに何を立てるかだけど、とりあえずechoサーバを立てて負荷試験をやってみたい。そうだね。将来的には配信サーバなどを立てられるといいのだけれど 後は、prometheus + graphanaで、負荷を可視化できるとなおいいよね。時系列でどれくらい負荷がかかっているのかが見れると最高だと思います。 各サーバにいちいち入るのは面倒くさいので一括でsshしたいと思っています。これを可能にする方法を岡田さんが考えてくれました。 msshですね。 各物理サーバ(ラズパイ)のハードウェアスペック router : raspi 5. RAM 8G. Storage 128G beta : raspi 4. RAM 1G. Storage 32G delta: raspi4. RAM 4G Storage 64G phi (f): raspi4. RAM 8G. Storage 32G gamma: raspi4. RAM 8G Storage 128G omega: raspi4. RAM 1G storage 32G zeta: raspi4. RAM 8G ここから使える奴だけ選抜する。 router, delta, phi, gamma, zeta の5台。一台は、router + dhcp + dnsの役割を持たせる。 容量的にdeltaがよさそう。そのほかは、k8sクラスタになる。頑張ってくれ。 k8sちゃんと動いてくれ!! ちなみに、 ...

July 27, 2024 · 12 min · 2518 words · Me

Great_ssh

背景 openVPNを使うことでsite2siteルーティングができるようになった。 しかし、そのネットワークに参加するためにはopenVPNで発行されるクライアント証明書が不可欠である。 それが面倒くさいという話だ。 実際のアプリではL7でのやり取りが多いから、L4まで権限は必要ない。 そこで、sshを使ってhttpレイヤーでトンネルを構築しようという話だ。 もうチャットGPUにききますね My Question 手元のラップトップー>踏み台サーバー>webサーバ があったとします。 この時、webサーバの80番ポートでhttp通信を待ち受けているサーバがいます。 手元のラップトップー>webサーバ にアクセスしたいです。 やり方を教えてください。 chatGPTの回答 結論 ssh -L 8080:192.168.1.2:80 user@bastion.example.com 8080はローカルマシンのポート番号 192.168.1.2はWebサーバのIPアドレス 80はWebサーバのポート番号 userは踏み台サーバのユーザー名 bastion.example.comは踏み台サーバのホスト名またはIPアドレスです。 ssh -Lオプションとはなんなのか? これは後で調べます。

July 23, 2024 · 1 min · 29 words · Me

Global_Private_CGN_ip

プライベートIPアドレス Class A: 10.0.0.0 to 10.255.255.255 This range supports a large number of hosts and is often used in very large networks. Class B: 172.16.0.0 to 172.31.255.255 This range is commonly used in medium-sized networks. Class C: 192.168.0.0 to 192.168.255.255 This range is typically used for smaller networks, like home or small business networks. 合計いくつあるのでしょうか? class Aは2^24くらいいけね?つまり? >>> 2**24 16777216 はい、classBは? >>> 16*2**16 1048576 classCは? >>> 2**16 65536 グローバルIPアドレス はい、グローバルIPね。JPNICとか、そのへんによって管理されているやつね。 2^32個ありますね、はい。そこから上のクラスのを抜いていきます 2**32 - 2**24 - 16*2**16 - 2**16 =4277075968 それでも40億箱しているって話ね。しかしだよ。これすごく重要なこと言います。実はまだグローバルに割り当てられていないIPが存在するんです。知ってましたか??(初耳) ...

July 18, 2024 · 1 min · 137 words · Me

Raft

Raftについて 分散システムを勉強するのであれば、必ず必要となる。これだけ覚えておこう。 Replicate And Fault Tolerant Raftの目的 Raftアルゴリズムの目的は、分散システムにおける信頼性の高いリーダー選出とログレプリケーションを通じて、一貫性のある状態を維持することです。具体的には、複数のノードが協調して動作し、一つのノードが故障してもシステム全体としての一貫性と可用性を保つことを目指します。 raft demo site このサイトを見ると、ラフトの動作が詳細までわかることでしょう。 参考文献 youtube 目的を達成する手段 Raftアルゴリズムは、以下の手段を用いて目的を達成します:(これはそのまま、ラフトを開発した研究者のプレゼン(youtubeで見られる)で発表されていたものと同じ) リーダー選出: クラスタ内の一つのノードがリーダーとして選ばれ、他のフォロワーノードに対して命令を発行します。リーダーはクライアントからのリクエストを受け取り、ログにエントリを追加します。 リーダが死んだ際には新たにリーダを選出するようにプロトコルが組まれています ログレプリケーション: リーダーがクライアントからのリクエストを受け取ると、そのリクエストをログに記録し、そのログエントリをフォロワーノードに複製します。フォロワーはリーダーからの指示に従い、同じログを持つことで一貫性を保ちます。 ここは結構大事だけど、クライアントからデータを受け取るのはリーダだけです 安全性の確保: 特定の条件下でのみリーダーが選出されるようにし、ログのコミットが保証されることで、システムの安全性と一貫性を確保します。 例えば、フォロワーの過半数がログエントリを受け取った場合にのみ、そのエントリをコミットと見なします。 また、最新のログ状態を持っているサーバしかリーダになれないようになっています。 リーダーの失敗処理:リーダーが失敗した場合、残りのノードのうち一つが新しいリーダーとして選出されます。この選出プロセスは、タイムアウトと投票を用いて実現されます。 まとめるとこうです。 Leader election Log replication safety では、ここから詳細に写っていこうと思います。 前提知識 エージェント(各サーバの役割) サーバは3つの状態のうちのどれか follower : completely passive. Does no action. But if he doesn’t get heart beat from leader he gets anxious and try to become a leader. He tries to . They expect to get heart beat from leader. candidate: Sends RequestVotes RPCs to get elected as leader. leader: Replicate its log to the followers. Heart beats to maintain its leadershop If candidate or leader discovers higher terms RPC it gets back to follower. ...

July 17, 2024 · 2 min · 244 words · Me

分散システム学習再始動

出会いに感謝 類は友を呼ぶとは言ったものだが、やはり部署が同じ人というのは興味も似てくる。 とはいっても、まさかTiDBやcockroachDBのコントリビュータとお友達になれるとは思わないわけで。 尊敬しかない。自分はあきらめてしまった道を一人で突き進んでいったのだろう。 自分の弱さがふがいない。せっかく先陣を切ってくれた先人がいるのだから、これは後に続こうと思える。 ロールモデルがあると自分も頑張ろうと思えるわけで。こんなところで師匠に出会えるとは、、、最高すぎる。 ということで、もう一度、分散システムに挑んでみようと思う。 とりあえず今日話したことをメモ 今のデータベース、MySQLとかはレプリケーションという技術を使って、一つのデータベースのテーブルを複数のノードにレプリケーションしている。レプリケーションされたデータが存在するノードが読み取り専用になる。マスターと呼ばれるノードは一台で、書き込みはここにだけ行われる。 しかし、これでは書き込み速度がスケールしないという問題点が生じる。そこで、noSQLというやつが出てきたんだよね。しかし、noSQLは整合性を保つのが難しいという課題があったんだよね。 そこで出てきたのがnewSQLというやつだね。tidb等。これを使うとwriteを容易にスケールすることができる。という話だ。 ほほう。なるほど。 ちなみに、俺が大好きなandrew pavloがこんな論文を出している andrew pavlo これによるとnewSQLの必要十分条件は、 NewSQL system’s implementation has to use (1) a lock-free concurrency control scheme and (2) a shared-nothing distributed architecture まじか、これだけでいいのか。 この記事がすごくいい感じに論文をまとめてくれている。 データベースの種類 RDBMS: mysql, postgresqlなど noSQL: cassandra, dynamodb newSQL: TiDB, cochroachDB 自分が過去に書いたデータベース関係の記事を見返したい TiDBについて調べていた時期もありましたねー 流れ まずはraftについてちゃんと理解するのが大事だと思う。実は完全に理解したとはいいがたい。 分散データベースを作るならまずは分散してないデータベースを作れないといけない。ということで、CMUのbustubの講義は受けなおした方がいい。 分散システムを理化するためにデータ志向アプリケーションを読もう。頼んだ。 いきなりだが、TiDBを読み込もう。cochroachDBでもいいと思う。この時にdesign Docsを読むのがいいらしい。 その他の疑問 シャーティングという技術がある。 これは、データを複数のノードに分散して格納することで、検索速度を上げる方法。 RAID0(ストライピング)とはまた別なのね? シャーディング(Sharding) 目的:データを分割して、複数のデータベースサーバに分散させ、スケーラビリティを向上させることです。 特徴: データベース全体を論理的に分割し、それぞれの部分を「シャード」と呼ばれる個別のデータベースに保存します。 各シャードは独立したデータベースとして動作し、特定のデータサブセットを保持します。 シャードは水平分割とも呼ばれ、特定のキー(例:ユーザーID、地域、日時など)に基づいてデータを分割します。 データの分割によって、単一のデータベースサーバにかかる負荷を分散させ、スケーラビリティとパフォーマンスを向上させます。 例: ユーザーIDに基づいて、ユーザーデータをシャードA、シャードB、シャードCに分割する。 ストライピング(Striping) 目的:データを分散してストレージパフォーマンスを向上させることです。主にデータの読み書き速度を向上させるために使用されます。 特徴: 単一のファイルやデータセットを複数のストレージデバイスに均等に分割して保存します。 各ストライプは連続したデータブロックを含み、ストライプ単位で並行して読み書きが行われます。 RAID(Redundant Array of Independent Disks)のコンセプトの一つであり、特にRAID 0が代表的です。 ストライピングは、ディスクI/O性能を向上させるために使用されますが、冗長性やフェールオーバーの機能はありません(特にRAID 0では)。 例: 1GBのファイルを4つのディスクに分割し、各ディスクに256MBずつ書き込む。 まとめ シャーディングは、データベース全体を複数のシャードに分割し、各シャードを異なるサーバに分散させることで、スケーラビリティとパフォーマンスを向上させる手法です。 ストライピングは、データを複数のストレージデバイスに均等に分割して並行して読み書きすることで、ストレージのパフォーマンスを向上させる手法です。 ストライピングとシャーティングの両方を使うことはできますか?

July 16, 2024 · 1 min · 87 words · Me