docker ビルド時のレイヤー上限は 125

docker ビルド時のレイヤー上限は 125 (暫定) という話。終わり。 動作確認 OS は Ubuntu 、docker は 20.10.2 を利用する。 # docker --version Docker version 20.10.2, build 20.10.2-0ubuntu1~20.04.2 以下のようなファイルを用意してイメージをビルドす…

kubernetes CRI とは

k8s

概要 CRI(Container Runtime Interface) は、kubelet(kubernetes のコンポーネント) がコンテナランタイムを操作するためのインタフェース。 コンテナランタイムは kubelet からの命令を受けて、イメージを取得したりコンテナを実行するもの。メジャーなコン…

containerd のイメージ取得はどのように動作するか?

次のコマンドがどのように動作するかを調査する。 # crictl pull alpine Image is up to date for sha256:6dbb9cc54074106d46d4ccb330f2a40a682d49dda5f4844962b7dce9fe44aaec # crictl images IMAGE TAG IMAGE ID SIZE docker.io/library/alpine latest 6db…

containerd をデバッグする手順のメモ

containerd はコンテナランタイムのひとつ。CRI に準拠しており、Kubernetes のコンテナランタイムとして利用できる。 仕事で containerd の調査ができそうな気配があるので(あるかな?)、containerd を動作確認しつつ調査できるようにデバッグ環境を整える。…

よくわかる man の読み方

man の man を読んでください。以上。

nmstate 宣言的なネットワーク管理

この記事は Linux Advent Calendar 2020 の 12 日目です。RHEL 8.2 で Tech Preview として紹介されていた nmstate を軽く調査しました。 検証環境 CentOS 8 と nmstate-0.2.10 を利用する。 # cat /etc/redhat-release CentOS Linux release 8.2.2004 (Core…

NetworkManager の仕組み

Linuxその2 Advent Calendar 2020 の 9 日目です。 この記事は、普段ググりながら適当に使っている NetworkManager について、どういう仕組みなんだっけ?を調べなおすものです。 検証環境 CentOS 8 を利用する。 # cat /etc/redhat-release CentOS Linux re…

glibc に感謝せよ

この記事はいくつかの言語のランタイムで glibc が利用されていることを確認し、glibc に感謝するものです。 Python3 Python3 の処理系は CPython。 # python3 -VV Python 3.6.8 (default, Nov 21 2019, 19:31:34) [GCC 8.3.1 20190507 (Red Hat 8.3.1-4)] …

TCP/UDP のスループットと RTT の関係性をざっくり理解する

次のような環境を用意し、TCP/UDP のスループットと RTT の関係性を検証する。 検証結果 次の検証結果から、TCP のスループットは RTT が増えると低下することがわかる。なお、これは CUBIC における検証結果なので、輻輳制御アルゴリズムが異なると厳密には…

ファイルがディスクに書き込まれるまで

ファイルがディスクに書き込まれるまでの道のりをまとめた。 stdio buffer バッファリングのモード 性能 バッファサイズのデフォルトについて 注意点 ページキャッシュ 性能 RAID コントローラキャッシュ ディスクキャッシュ 最後に stdio buffer write(2) …

Linux ポート番号と種類

ウェルノウンポートとかエフェメラルポートとかの単語は IPA の NW を勉強したときの知識としては知っているものの、正直よくわからん状態だったので調べました。 ポート番号の定義 ポート番号とその利用用途は IANA が管理している。Internet Assigned Numb…

Linux Tracepoint とは何か?

Tracepoint とは何か? カーネルに埋め込まれたイベントに処理を追加する仕組み。 disabled のときはハンドラが実行されない。 enabledのときはハンドラが実行される。 分岐処理のコストが余分にかかるが、アセンブリレベルで最適化されている。 すでにカー…

taskset と cgroup は何が違うのか

taskset と cgroupは、あるプロセスが利用可能な CPU コアを制限できる技術。どんな違いがあるのかを調べた。なお、本記事の cgroup は cgroup v1 のこと。 taskset は sched_setaffinity システムコールを利用したコマンドラインツール。sched_setaffinity …

SYSCALL_DEFINE マクロは何をしてるのか

はじめに SYSCALL_DEFINE はシステムコールを定義するためのマクロ。引数の数によって SYSCALL_DEFINE0 から SYSCALL_DEFINE6 まであり、例えば次のように利用される。変数の型と名前が引数に別々に取られて独特な形で面食らうが、関数定義とは異なるので仕…

Uprobes の概要と使い方

Uprobes とは 以前に Kprobes を調べたので(Kprobes の概要と使い方 - SIerだけど技術やりたいブログ)、そのユーザ空間版である Uprobes について調べた。まあ大体一緒。 Uprobes はユーザ空間のアプリケーションに処理を差し込むための仕組み。自身が開発し…

Kprobes の概要と使い方

Kprobes とは Kprobes は実行中のカーネルに処理を差し込むための仕組み。おもにカーネルのデバッグやパフォーマンス解析に利用される。カーネル内のデータをいじれるため、テストのために障害注入するという使い方もできる。Kprobes を直接利用することは少…

Linux の挙動を変更する 4 つの方法

Linux カーネルの挙動を変更する次の 4 つの方法について整理する。 名称 概要 設定変更を反映するタイミング カーネルコンフィグ コンパイル時の設定 再ビルド ブートパラメータ カーネル起動時の設定 再起動 モジュールパラメータ モジュールロード時の設…

Linux カーネル ソースコードのマクロを展開する

やりたいこと カーネルのソースコードを読んでいると、まあまあな頻度でマクロに遭遇する。 core_param(pause_on_oops, pause_on_oops, int, 0644); 簡単なマクロならそのまま読めるが、マクロの定義中にマクロが使われてたりする。 #define core_param(name…

Linux プロセス管理を理解したい

プロセスについて学習したことをまとめました。間違いあればコメントください。 検証環境 プロセスとは プロセス空間 プログラムはどのように動作するか タイムシェアリング どうやって実行するプロセスを切り替えるか? いつプロセスを切り替えるか? どの…

認定Kubernetes管理者(CKA)に ほぼ満点 で合格しました

認定Kubernetes管理者 (CKA) に ほぼ満点 で合格しました。 スコアは 98% でした。これはつまり、 Kubernetes 完全に理解した(入門した) という事ですね? この記事は 認定Kubernetes管理者(CKA) の概要と勉強方法を共有します。 認定Kubernetes管理者(CKA) …

PostgreSQL Isolation について

DB

トランザクションのACID特性のうち、Isolation(隔離性)について整理する。 検証環境 Isolationとは? Isolation Level Snapshot Isolationとは? Write Skew Read Only Skew PostgreSQLにおける実現手段 ANSIとの対応 実装の詳細 追加/更新/削除の挙動 Isolati…

iptables で [unsupported revision] が出る

問題 kube-proxy が設定したルールを iptables コマンドで表示すると、[unsupported revision] になる。 ]# iptables -nL -t nat Chain KUBE-SEP-AAJZQ5YHVGUCPI77 (1 references) target prot opt source destination KUBE-MARK-MASQ all -- 10.200.192.87 …

Kubernetes ログを読んで理解する kube-proxy の仕組み

kube-proxy は各ノードで動作するネットワークプロキシ。Service の仕組みの一部(ClusterIP や NodePort など)を実現し、クラスタ内部または外部から Pod にアクセスできるように制御する。 参考 Kubernetes Components 参考 Kubernetes Service Service は …

Kubernetes コンテナ名を y にすると実行できなくて困った(YAML の Boolean の話)

k8s

環境 Kubernetes 1.15 ]# kubectl version Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:54Z", GoVersion:"go1.…

linux /proc/kallsyms をコードから理解する

検証環境 CentOS 8.1 を利用する。 ]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) ]# uname -a Linux localhost.localdomain 4.18.0-147.3.1.el8_1.x86_64 #1 SMP Fri Jan 3 23:55:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux /proc/ka…

k8s Persistent Volumes の ReadWriteOnce は単一 Pod からのアクセスに絞るための設定じゃない

k8s

kubernates 1.17。 $ kubectl version Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.2", GitCommit:"59603c6e503c87169aea6106f57b9f242f64df89", GitTreeState:"clean", BuildDate:"2020-01-18T23:30:10Z", GoVersion:"go1.13.5…

k8s ConfigMap で設定を Pod から分離できる( nginx の設定を ConfigMap で管理する)

k8s

ConfigMap は Pod の外から設定データ(環境変数やファイル)を注入するための仕組み。設定を Pod と分離して管理できることに価値がある。 ConfigMap はキーとバリューで構成されていて、複数の方法で作成できる。また、複数の方法で Pod に設定データを注入…

kubernetes kubectl で Pod 内の指定したコンテナにアクセスする方法

k8s

Pod は k8s のデプロイ可能な最小単位。複数のコンテナから成り立つ。kubectl exec -it [pod名] [command]だと、デフォルトのコンテナに接続されてしまう。 $ kubectl exec -it samplepod /bin/sh Defaulting container name to busybox1. Use 'kubectl desc…

Linux メモリ管理 徹底入門(カーネル編)

メモリ管理は、Linux カーネルのコアな機能です。この機能を理解することで、サーバの統計情報の意味がわかるようになったり、トラブル解析ができるようになります。 この記事では、Linux カーネルのメモリ管理について勉強したことを基礎からまとめます。 …

Linux debuginfo って何?

debuginfo は、デバッグ情報が入っているリポジトリ。 検証環境 デバッグ情報とは何か 補足 デバッグ情報の付与のしかた デバッグ情報の効果を確かめる デバッグ情報の中身を見てみる デバッグ情報の問題点 debuginfo gdb での使い方 gdb はどのようにデバッ…