<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Tomofumi Kondo</title>
    <link>https://blog.tomokon.net/</link>
    <description>Recent content on Tomofumi Kondo</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja-jp</language>
    <lastBuildDate>Sat, 18 Apr 2026 15:21:46 +0900</lastBuildDate><atom:link href="https://blog.tomokon.net/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Grafana の Git Sync でダッシュボードを GitOps 管理する</title>
      <link>https://blog.tomokon.net/posts/grafana-git-sync/</link>
      <pubDate>Sat, 18 Apr 2026 15:21:46 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/grafana-git-sync/</guid>
      
      <description>&lt;h2 id=&#34;1-はじめに&#34;&gt;1. はじめに&lt;/h2&gt;
&lt;p&gt;みなさん、Grafana のダッシュボード管理どうしてますか？&lt;/p&gt;
&lt;p&gt;私は自宅の Kubernetes クラスターで Grafana を動かしており、ダッシュボードを Web UI でポチポチ作ったり、mcp-grafana を使って Claude Code や kagent から作ったりしていました。&lt;/p&gt;
&lt;p&gt;しかし、それではダッシュボードのデータが Grafana 内部のデータベースにしか残らず、PVC を使っていたとしても Kubernetes クラスター自体を作り直した際などには消えてしまいますし、バージョン管理もできないため履歴を追うことも難しいです。
実際に今まで何回も Kubernetes クラスター自体が壊れて作り直しており、その度に同じようなダッシュボードを都度都度作成していました、、、&lt;/p&gt;
&lt;p&gt;そんな中、Grafana v12.4 から &lt;strong&gt;Git Sync&lt;/strong&gt; という機能が使えるようになっていることを知りました。
ダッシュボード設定の JSON を GitHub リポジトリと双方向に同期してくれる機能で、まさに求めていたものです。&lt;/p&gt;
&lt;p&gt;今回は、自宅サーバーの Grafana に Git Sync を導入して、ダッシュボードを GitOps で管理できるようにするまでの手順を紹介します。&lt;/p&gt;
&lt;h2 id=&#34;2-git-sync-とは&#34;&gt;2. Git Sync とは&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://grafana.com/docs/grafana/latest/as-code/observability-as-code/git-sync/key-concepts/&#34;&gt;Git Sync&lt;/a&gt; は、Grafana インスタンスと Git リポジトリの間でダッシュボードを&lt;strong&gt;双方向に同期&lt;/strong&gt;する機能です。
Grafana Cloud だけでなく、OSS 版や Enterprise 版でも利用できます。&lt;/p&gt;
&lt;p&gt;主な特徴はこんな感じです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;双方向同期&lt;/strong&gt;: Web UI での変更は Git にコミットされ、Git への変更は Grafana に反映される
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PR ワークフロー&lt;/strong&gt;: Web UI での変更をブランチにコミットして PR を作成できる（&lt;code&gt;branch&lt;/code&gt; ワークフロー）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直接コミット&lt;/strong&gt;: Web UI での変更を直接メインブランチにコミットもできる（&lt;code&gt;write&lt;/code&gt; ワークフロー）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期同期&lt;/strong&gt;: 設定した間隔（例: 60秒）で自動的に同期される&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;従来のプロビジョニング（&lt;code&gt;provisioning/dashboards/&lt;/code&gt; にファイルを配置する方法）との大きな違いは、Git → Grafana の一方向ではなく、&lt;strong&gt;Grafana → Git の方向も同期される&lt;/strong&gt;点です。
Web UI で気軽にダッシュボードを編集しつつ、その変更が自動的に Git に記録されるのはとても便利です。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Tomofumi Kondo</title>
      <link>https://blog.tomokon.net/pages/about/</link>
      <pubDate>Sat, 04 Apr 2026 22:14:32 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/pages/about/</guid>
      
      <description>&lt;h2 id=&#34;プロフィール&#34;&gt;プロフィール&lt;/h2&gt;
&lt;p&gt;プライベートクラウド・ソフトウェアエンジニア&lt;/p&gt;
&lt;p&gt;誕生日：2000/03/14
居住地：東京/日本&lt;/p&gt;
&lt;h2 id=&#34;スキル&#34;&gt;スキル&lt;/h2&gt;
&lt;h3 id=&#34;得意&#34;&gt;得意&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OpenStack
&lt;ul&gt;
&lt;li&gt;Nova, Neutron, Cinder, Glance, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;li&gt;TCP/IP&lt;/li&gt;
&lt;li&gt;OVS&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Ansible&lt;/li&gt;
&lt;li&gt;NeoVim&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;経験あり&#34;&gt;経験あり&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;QEMU/KVM&lt;/li&gt;
&lt;li&gt;Terraform&lt;/li&gt;
&lt;li&gt;Prometheus&lt;/li&gt;
&lt;li&gt;VictoriaMetrics&lt;/li&gt;
&lt;li&gt;Grafana&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;Google Cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;経歴&#34;&gt;経歴&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2024/04 - 現在：株式会社サイバーエージェント
&lt;ul&gt;
&lt;li&gt;プライベートクラウドの主にIaaS基盤の開発・運用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2022/04 - 2024/03：東北大学情報科学研究科（修士卒）
&lt;ul&gt;
&lt;li&gt;消費電力を考慮したネットワークコントローラの配置最適化に関する研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2022/12 - 2024/03：株式会社サイバーエージェント
&lt;ul&gt;
&lt;li&gt;内定者バイト&lt;/li&gt;
&lt;li&gt;異なるタイプのボリューム間のボリュームリタイプシステムの開発&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2022/09 - 2022/09：合同会社DMM.com
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;動画配信サーバの構築。IPMIからのRAIDの設定やOSインストール、動画配信ミドルウェアの構築など。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2022/08 - 2022/09：サイボウズ株式会社
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;オンプレミスでKubernetesクラスタを管理しているNecoチームにて2週間のインターンに参加し、カスタムコントローラ開発に取り組んだ。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2022/08 - 2022/08：株式会社アカツキゲームス
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;課金管理基盤の開発・運用改善。Go、GCP。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2022/07 - 2022/07：ピクシブ株式会社
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;AWSで構築されているWebサービスのインフラ改善。特にDevOpsやIaC周り。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2022/06 - 2022/06：株式会社マネーフォワード
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;あらかじめ登録したタイムスケジュールを元にDeploymentのreplicasを切り替えるカスタムコントローラ・Admission Webhookの開発&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2022/05 - 2022/06：株式会社サイバーエージェント
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;プライベートクラウドで利用しているOpenStackのネットワークコンポーネントであるNeutronのバグ修正&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2021/10 - 2022/03：株式会社ギフティ
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;Ruby on Railsを用いたWebアプリケーションに対する機能の修正や追加を行った。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2021/11 - 2021/12：株式会社リクルート
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;社内横断のエンジニアリングチームにて、社内の各サービスチームで使われるコンテナアプリケーションのCI/CD標準化に取り組んだ。
AWS ECSやCode seriesを用いたコンテナアプリケーションとそのCI/CDパイプライン構築をするに当たって、セキュリティ（ネットワークやIAMの権限）や可用性、コスト、クロスアカウントでの運用など、プロダクションレベルで必要なクラウドインフラ設計に取り組むことができた。また、インフラリソースを記述するTerraformのディレクトリ設計のベストプラクティスについても考え、実践することができた。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2021/09 - 2021/09：Wantedly, Inc.
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;3週間のサマーインターンで、Custom ControllerやOIDC認証を利用したKubernetesのapiserverでの認証方式の移行や、開発者にKubernetesへのアクセス権限を管理するCLIツールのサブコマンド開発等をした。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2021/05 - 2021/05：株式会社ギフティ
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;1週間のインターンで、Ruby on Railsを用いたLINE Bot開発に取り組んだ。
企画から開発までのサイクルを短い期間で回し、最終日に開発したボットを用いたプレゼンテーションを行った。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2020/09 - 2020/09：株式会社VOYAGE GROUP
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;2日間、VOYAGEのインターン担当のエンジニアさんが扮する社内の顧客への聞き取りを行い、顧客が本当に求めていることを見極めてサービスの仕様を考え、プロトタイプを作成した。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2020/08 - 2020/08：楽天株式会社
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;2週間のハッカソン形式のチーム開発インターンで、サービスの企画から開発を一貫して行い、最後に英語でのプレゼンテーションを行なった。
主にDocker / Herokuを用いた開発・デプロイ先環境の構築と、Flask（Python）を用いたバックエンドのAPIの設計・実装を担当した。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2020/06 - 2020/06：株式会社サイバーエージェント
&lt;ul&gt;
&lt;li&gt;インターン&lt;/li&gt;
&lt;li&gt;2日間の日程で、インターン用に用意された架空Webサービスのパフォーマンスチューニングをコンテスト形式で行なった。
主にRDB周りのチューニングを行い、クエリログからボトルネックを判断し、DBの修正（設計やインデックス等）や、アプリケーション側の修正（N + 1の解消等）を行なった。また、Nginx等のDB以外のミドルウェアのチューニングも行った。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2018/06 - 2024/03：ウェルプレイス株式会社
&lt;ul&gt;
&lt;li&gt;アルバイト&lt;/li&gt;
&lt;li&gt;独自の物件検索・管理システムを持つ自社サイトの開発・運用や、社内ネットワークの管理等をしている。&lt;/li&gt;
&lt;li&gt;【自社HP】
&lt;ul&gt;
&lt;li&gt;PHP, Laravel, Javascript, MySQL&lt;/li&gt;
&lt;li&gt;GitHub ActionsとDeployerを用いたCI/CDの構築&lt;/li&gt;
&lt;li&gt;VirtualBox、Vagrant、Dockerを用いた開発環境の構築&lt;/li&gt;
&lt;li&gt;さくらインターネットを利用した本番環境の構築&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;【その他】
&lt;ul&gt;
&lt;li&gt;自社のAccess/Excelデータベースのメンテナンス。&lt;/li&gt;
&lt;li&gt;社内機器(ルータ/NAS等)の管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;contact&#34;&gt;Contact&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://x.com/tomokon_0314&#34;&gt;X(Twitter)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/TOMOFUMI-KONDO&#34;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Email: &lt;a href=&#34;mailto:ugax2kontomo0314@gmail.com&#34;&gt;ugax2kontomo0314@gmail.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      
    </item>
    
    <item>
      <title>OVN-Kubernetes のノード再起動後にネットワーク断になる</title>
      <link>https://blog.tomokon.net/posts/ovn-kubernetes-delete-transient-ports/</link>
      <pubDate>Sat, 04 Apr 2026 21:28:11 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/ovn-kubernetes-delete-transient-ports/</guid>
      
      <description>&lt;h2 id=&#34;1-はじめに&#34;&gt;1. はじめに&lt;/h2&gt;
&lt;p&gt;みなさん、自宅 Kubernetes クラスタ運用してますか？&lt;/p&gt;
&lt;p&gt;今回は、自宅サーバーで動かしている &lt;strong&gt;OVN-Kubernetes&lt;/strong&gt;（Helm デプロイ）の環境で、&lt;strong&gt;ノードを再起動すると外部疎通が完全に断になる&lt;/strong&gt;というなかなか厄介な問題に遭遇したので、原因の深掘りと解決までの記録をお話しします。&lt;/p&gt;
&lt;p&gt;OVN-Kubernetes のセットアップについては&lt;a href=&#34;https://blog.tomokon.net/posts/kubeadm-ovn-kubernetes/&#34;&gt;こちらの記事&lt;/a&gt;で紹介しているので、興味があればぜひ読んでみてください。&lt;/p&gt;
&lt;h2 id=&#34;2-ovn-kubernetes-のブリッジ構成&#34;&gt;2. OVN-Kubernetes のブリッジ構成&lt;/h2&gt;
&lt;h3 id=&#34;nictobridge-の仕組み&#34;&gt;NicToBridge の仕組み&lt;/h3&gt;
&lt;p&gt;OVN-Kubernetes は、ノードの物理 NIC（例: &lt;code&gt;eth0&lt;/code&gt;）を OVS ブリッジ（&lt;code&gt;breth0&lt;/code&gt;）に組み込んで使います。
この処理を行うのが &lt;code&gt;NicToBridge()&lt;/code&gt; 関数です。&lt;/p&gt;
&lt;p&gt;やっていることをざっくりまとめると：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;OVS ブリッジ &lt;code&gt;breth0&lt;/code&gt; を作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eth0&lt;/code&gt; を &lt;code&gt;breth0&lt;/code&gt; のポートとして追加&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eth0&lt;/code&gt; に &lt;code&gt;other-config:transient=true&lt;/code&gt; を設定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eth0&lt;/code&gt; の IP アドレスとルートを &lt;code&gt;breth0&lt;/code&gt; に移行&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// go-controller/pkg/util/nicstobridge.go (NicToBridge)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;RunOVSVsctl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;--may-exist&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;add-br&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;br-set-external-id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;bridge-id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;br-set-external-id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;bridge-uplink&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;iface&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;set&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;bridge&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;fail-mode=standalone&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Sprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;other_config:hwaddr=%s&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ifaceLink&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Attrs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;HardwareAddr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;--may-exist&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;add-port&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;iface&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;set&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;iface&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;other-config:transient=true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでポイントになるのが &lt;strong&gt;&lt;code&gt;other-config:transient=true&lt;/code&gt;&lt;/strong&gt; です。
これは「このポートは一時的なものなので、OVS 再起動時に削除してよい」というマーカーです。&lt;/p&gt;
&lt;h3 id=&#34;正常な再起動フロー&#34;&gt;正常な再起動フロー&lt;/h3&gt;
&lt;p&gt;正常に機能する場合、以下のような流れでノード再起動後もネットワークが復旧します。&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  sequenceDiagram
    participant OVS as ovsdb-server
    participant NIC as eth0
    participant BR as breth0
    participant OVN as ovnkube-node

    Note over OVS: ノード再起動
    OVS-&amp;gt;&amp;gt;OVS: --delete-transient-ports で起動
    OVS-&amp;gt;&amp;gt;NIC: transient ポート(eth0)を削除
    Note over NIC: eth0 がブリッジから外れる
    NIC-&amp;gt;&amp;gt;NIC: systemd-networkd が IP を設定
    Note over NIC: eth0 経由で外部疎通が復旧
    OVN-&amp;gt;&amp;gt;OVN: API server に到達可能
    OVN-&amp;gt;&amp;gt;BR: NicToBridge() で eth0 を再接続
    Note over BR: breth0 に IP を移行して通常運用に復帰
&lt;/pre&gt;

&lt;h2 id=&#34;3-発生した問題&#34;&gt;3. 発生した問題&lt;/h2&gt;
&lt;p&gt;さて、ここからが本題です。
実際にノードを再起動すると、&lt;strong&gt;外部疎通が完全に断になってしまいました&lt;/strong&gt;。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>cert-manager と Cloudflare DNS で Envoy Gateway の証明書を自動管理する</title>
      <link>https://blog.tomokon.net/posts/envoy-gateway-cert-manager/</link>
      <pubDate>Thu, 02 Apr 2026 23:11:28 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/envoy-gateway-cert-manager/</guid>
      
      <description>&lt;h2 id=&#34;1-はじめに&#34;&gt;1. はじめに&lt;/h2&gt;
&lt;p&gt;みなさん、Kubernetes クラスターの証明書管理してますか？&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.tomokon.net/posts/envoy-gateway-argocd-https/&#34;&gt;前回の記事&lt;/a&gt;では、Envoy Gateway を使って argocd-server に HTTPS でアクセスする環境を構築しました。
その際、証明書は Ansible で自己署名の CA/Server 証明書を作成して Kubernetes Secret に登録するという方法を取っていたのですが、
記事の最後に「もしかしたら cert-manager とかを使った方が楽だったかもしれませんが、終わってから気づきました&amp;hellip;」と書いていました。&lt;/p&gt;
&lt;p&gt;というわけで今回は、&lt;strong&gt;cert-manager&lt;/strong&gt; を使って &lt;strong&gt;Let&amp;rsquo;s Encrypt&lt;/strong&gt; の証明書を &lt;strong&gt;Cloudflare DNS01 チャレンジ&lt;/strong&gt; で自動発行・更新する方法を紹介します。
これにより、自己署名証明書からの脱却と、証明書の自動更新を実現します。&lt;/p&gt;
&lt;h2 id=&#34;2-cert-manager-について&#34;&gt;2. cert-manager について&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://cert-manager.io/&#34;&gt;cert-manager&lt;/a&gt; は、Kubernetes クラスター内で TLS 証明書の発行・更新を自動化してくれるツールです。
Let&amp;rsquo;s Encrypt などの ACME 対応の CA（認証局）と連携して、証明書のライフサイクルを自動で管理してくれます。&lt;/p&gt;
&lt;p&gt;証明書の発行には ACME プロトコルを使用しますが、ドメインの所有を証明するためのチャレンジ方法がいくつかあります。
今回は &lt;strong&gt;DNS01 チャレンジ&lt;/strong&gt; を使います。
DNS01 チャレンジは、ドメインの DNS レコードに特定の TXT レコードを追加することでドメインの所有を証明する方法です。&lt;/p&gt;
&lt;h2 id=&#34;3-前提環境&#34;&gt;3. 前提環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes クラスター&lt;/strong&gt;: 自宅サーバー上の環境（kubeadm + OVN-Kubernetes）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Envoy Gateway&lt;/strong&gt;: v1.5.0（&lt;a href=&#34;https://blog.tomokon.net/posts/envoy-gateway-argocd-https/&#34;&gt;前回の記事&lt;/a&gt;でインストール済み）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ドメイン管理&lt;/strong&gt;: Cloudflare（&lt;code&gt;home.tomokon.net&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cert-manager&lt;/strong&gt;: v1.18.2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Envoy Gateway の GatewayClass や Gateway リソースは前回の記事で作成済みの前提で進めます。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>GMKtec ミニPCでProxmoxクラスターを構築</title>
      <link>https://blog.tomokon.net/posts/proxmox-cluster-setup/</link>
      <pubDate>Sun, 05 Oct 2025 14:16:28 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/proxmox-cluster-setup/</guid>
      
      <description>&lt;p&gt;先日、GMKtecのミニPC（M7 Ryzen 7 PRO 6850H）を購入して、既存のProxmoxサーバと組み合わせて2台構成のクラスターを構築しました。&lt;/p&gt;
&lt;p&gt;今回はその過程を、購入したミニPCのハードウェアの紹介から、Proxmoxのインストール、クラスター構築、そして既存VMのライブマイグレーションまで紹介しようと思います。&lt;/p&gt;
&lt;h2 id=&#34;1-新規ハードウェアの紹介&#34;&gt;1. 新規ハードウェアの紹介&lt;/h2&gt;
&lt;p&gt;今回購入したのは、&lt;a href=&#34;https://www.gmktec.com/ja/products/amd-ryzen-7-pro-6850h-mini-pc-nucbox-m7&#34;&gt;GMKtecのM7 Ryzen 7 PRO 6850H&lt;/a&gt;です。
楽天市場でセールがやっていたので購入しました。（セールで買うのがデフォルトみたいな感じですが）&lt;/p&gt;
&lt;p&gt;スペックは大体こんな感じです：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;: AMD Ryzen 7 PRO 6850H (8コア/16スレッド)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RAM&lt;/strong&gt;: 32GB DDR5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: 1TB NVMe SSD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network&lt;/strong&gt;: 2.5Gb Ethernet × 2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それでは早速開封していきましょう。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.tomokon.net/images/gmktec-m7-box.jpg&#34;
    alt=&#34;GMKtec M7の箱&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;コンパクトなパッケージに入っています。箱はちょっと凹んでいましたが、中身は綺麗です。付属品は電源アダプタとHDMI/USBケーブル類。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.tomokon.net/images/gmktec-m7-unboxing.jpg&#34;
    alt=&#34;GMKtec M7の開封&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;筐体を開けてボードを確認してみました。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.tomokon.net/images/gmktec-m7-board.jpg&#34;
    alt=&#34;GMKtec M7のボード&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;コンパクトにまとまっていて、NVMeスロットが2つ（1つは空きスロット）、SO-DIMMスロットが2つ（16GB x2）あります。
SSDは最大4TBまで、メモリは最大64GBまで増設可能らしいので、足りなくなったら換装もできます。&lt;/p&gt;
&lt;p&gt;ではProxmoxをインストール、、、といきたい所ですが、その前にBIOS設定だけ少しいじります。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.tomokon.net/images/gmktec-m7-bios-performance.jpg&#34;
    alt=&#34;BIOSのパフォーマンス設定&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;CPU Power Modeを &amp;ldquo;Performance&amp;rdquo; に設定して、電力効率や静音よりもパフォーマンスを優先する構成にしました。&lt;/p&gt;
&lt;h2 id=&#34;2-proxmoxのインストール&#34;&gt;2. Proxmoxのインストール&lt;/h2&gt;
&lt;p&gt;続いて、Proxmox VEをインストールしていきます。&lt;/p&gt;
&lt;p&gt;執筆時点の最新バージョンは 9.0 でしたが、既存のProxmox Nodeが8.4で動いていたため、合わせて8.4をインストールします。
&lt;a href=&#34;https://pve.proxmox.com/pve-docs/chapter-pve-installation.html&#34;&gt;Proxmoxの公式ドキュメント&lt;/a&gt;を参考にして、
&lt;a href=&#34;https://www.proxmox.com/en/downloads/proxmox-virtual-environment/iso&#34;&gt;こちらのページ&lt;/a&gt;
からProxmox VE 8.4のISOイメージをダウンロードしました。&lt;/p&gt;
&lt;p&gt;次に、&lt;a href=&#34;https://zenn.dev/phoepsilonix/articles/iso-image-writer&#34;&gt;Zennの記事&lt;/a&gt;を参考にして、&lt;a href=&#34;https://etcher.balena.io/#download-etcher&#34;&gt;balenaEtcher&lt;/a&gt;を使用してISOイメージをUSBメモリに書き込みます。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.tomokon.net/images/balena-etcher-write.jpg&#34;
    alt=&#34;balenaEtcherでのISO書き込み&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;書き込んだUSBメモリをミニPCに刺して、Proxmoxインストーラーを起動します。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.tomokon.net/images/proxmox-installer-boot.jpg&#34;
    alt=&#34;Proxmoxインストーラー起動画面&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;ひとまず memtest を実行しておきます。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Cloud Operator Days Tokyo 2025で登壇しました</title>
      <link>https://blog.tomokon.net/posts/cloud-operator-days-tokyo-2025/</link>
      <pubDate>Sun, 21 Sep 2025 19:44:31 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/cloud-operator-days-tokyo-2025/</guid>
      
      <description>&lt;p&gt;先日、「&lt;a href=&#34;https://cloudopsdays.com/closing/&#34;&gt;Cloud Operator Days Tokyo (CODT) 2025&lt;/a&gt;」というイベントで、「Goで作る！ストレージ筐体間での安全なCinder volume移行システムの開発と運用」というタイトルで登壇してきました。&lt;/p&gt;
&lt;p&gt;CODT はクラウド運用に携わる人たちのためのカンファレンスで、「オペレーターに光を当てる」をテーマに、SREやクラウドインフラ、AI活用などの幅広いトピックについて多くの発表がありました。&lt;/p&gt;
&lt;p&gt;今回の発表では、OpenStackのCinder Volumeを安全に移行するシステムについてお話しました。&lt;/p&gt;
&lt;p&gt;発表で使用したスライド資料公開しているため、興味がある方はぜひご覧ください：&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://speakerdeck.com/tomokon/godezuo-ru-sutorezikuang-ti-jian-denoan-quan-nacinder-volumeyi-xing-sisutemunokai-fa-toyun-yong&#34;&gt;Goで作るストレージ拡張体験で安全なCinder Volume移行システムの開発と運用&lt;/a&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Envoy Gateway を使って argocd-server に HTTPS でアクセスする</title>
      <link>https://blog.tomokon.net/posts/envoy-gateway-argocd-https/</link>
      <pubDate>Sun, 07 Sep 2025 23:22:48 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/envoy-gateway-argocd-https/</guid>
      
      <description>&lt;h2 id=&#34;1-はじめに&#34;&gt;1. はじめに&lt;/h2&gt;
&lt;p&gt;今回は、自宅の Kubernetes クラスターで、Kubernetes の Gateway API 実装の一つである &lt;strong&gt;Envoy Gateway&lt;/strong&gt; を使って、
&lt;strong&gt;argocd-server&lt;/strong&gt; に HTTPS でアクセスできるようにするまでの手順を紹介します。&lt;/p&gt;
&lt;p&gt;Argo CD のドキュメントには
&lt;a href=&#34;https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/&#34;&gt;Ingress Configuration&lt;/a&gt;
のページはあるのですが、Gateway API を使った設定方法は見当たらなかったため、色々と試行錯誤しながらやってみました。&lt;/p&gt;
&lt;h2 id=&#34;2-argo-cdについて&#34;&gt;2. Argo CDについて&lt;/h2&gt;
&lt;p&gt;まずは Argo CD について簡単に紹介します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://argo-cd.readthedocs.io/en/stable/&#34;&gt;Argo CD&lt;/a&gt; は、Kubernetes クラスター上で GitOps を実践するための CD (Continuous Delivery) ツールです。
Git リポジトリを SSOT (Single Source of Truth) として、宣言的かつ自動的な Kubernetes リソースの管理ができます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://argo-cd.readthedocs.io/en/stable/assets/argocd_architecture.png&#34; alt=&#34;Argo CDのアーキテクチャ&#34;&gt;
From &lt;a href=&#34;https://argo-cd.readthedocs.io/en/stable/#architecture&#34;&gt;https://argo-cd.readthedocs.io/en/stable/#architecture&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;例えば以下のような画面で登録した Application の状態を確認したり、Git リポジトリとの同期操作を行ったりできます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://argo-cd.readthedocs.io/en/stable/assets/argocd-ui.gif&#34; alt=&#34;Argo CD Web UI&#34;&gt;
From &lt;a href=&#34;https://argo-cd.readthedocs.io/en/stable/#what-is-argo-cd&#34;&gt;https://argo-cd.readthedocs.io/en/stable/#what-is-argo-cd&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Argo CD は複数のコンポーネントで構成されており、今回 HTTPS でアクセスできるようにする &lt;strong&gt;argocd-server&lt;/strong&gt; は、先ほど見せた Web UI と API エンドポイントを提供するコンポーネントです。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>自宅サーバーでKubeVirtに入門</title>
      <link>https://blog.tomokon.net/posts/kubevirt/</link>
      <pubDate>Sat, 06 Sep 2025 13:25:20 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/kubevirt/</guid>
      
      <description>&lt;h2 id=&#34;1-はじめに&#34;&gt;1. はじめに&lt;/h2&gt;
&lt;p&gt;私は普段、業務や趣味の自宅サーバーでIaaS基盤の開発・運用をしており、&lt;a href=&#34;https://www.openstack.org/&#34;&gt;OpenStack&lt;/a&gt;や&lt;a href=&#34;https://kubernetes.io/ja/&#34;&gt;Kubernetes&lt;/a&gt;を日常的に触っています。
そのため、「&lt;strong&gt;Kubernetes上で仮想化基盤を構築する&lt;/strong&gt;」というコンセプトの&lt;a href=&#34;https://kubevirt.io/&#34;&gt;KubeVirt&lt;/a&gt;には以前から興味を持っていました。&lt;/p&gt;
&lt;p&gt;そして先日たまたま&lt;a href=&#34;https://speakerdeck.com/oracle4engineer/kubevirt-deep-dive&#34;&gt;こちら&lt;/a&gt;のOracle JapanのTakuya Niitaさんが公開しているスライド資料を見かけて、なんだか思ったより簡単に動かせそう？と思ったので、自宅サーバーで試してみることにしました。&lt;/p&gt;
&lt;p&gt;というわけで今回は、自宅のKubernetesクラスタにKubeVirtをインストールして実際にVMを動かしてみた際の、手順やハマりポイントについて紹介しようと思います。&lt;/p&gt;
&lt;h2 id=&#34;2-kubevirtとは&#34;&gt;2. KubeVirtとは&lt;/h2&gt;
&lt;p&gt;KubeVirtは、Kubernetes上で仮想マシン（VM）を動かすためのプラットフォームとなるOSSです。&lt;/p&gt;
&lt;p&gt;コンテナとVMを同じKubernetesクラスタ上で統一的に管理できるのが特徴で、既存のVM資産をKubernetesに移行したい場合や、コンテナ化が難しいワークロードを扱いたい場合に便利なもののようです。&lt;/p&gt;
&lt;p&gt;KubernetesのリソースとしてVMを定義し、Podと同じようにKubernetesのエコシステムを使って管理できるのが面白いところです。&lt;/p&gt;
&lt;h2 id=&#34;3-環境構築&#34;&gt;3. 環境構築&lt;/h2&gt;
&lt;p&gt;それでは早速KubeVirtをインストールしていきます。&lt;/p&gt;
&lt;h3 id=&#34;31-kubernetesクラスタの準備&#34;&gt;3.1 Kubernetesクラスタの準備&lt;/h3&gt;
&lt;p&gt;まず、KubeVirtを動かすためのKubernetesクラスタが必要です。私の場合は、自宅サーバー上にkubeadmで構築したクラスタを使用しました。ネットワークプラグインには&lt;a href=&#34;https://ovn-kubernetes.io/&#34;&gt;OVN-Kubernetes&lt;/a&gt;を採用しています。&lt;/p&gt;
&lt;p&gt;クラスタの詳細な構築手順については、「&lt;a href=&#34;https://blog.tomokon.net/posts/kubeadm-ovn-kubernetes/&#34;&gt;kubeadmとOVN-Kubernetesで自宅Kubernetesクラスタを構築する&lt;/a&gt;」という記事で紹介していますので、興味がある方はそちらもご覧ください。&lt;/p&gt;
&lt;h3 id=&#34;32-kubevirtのインストール&#34;&gt;3.2 KubeVirtのインストール&lt;/h3&gt;
&lt;p&gt;KubeVirtのインストールは、&lt;a href=&#34;https://kubevirt.io/quickstart_cloud/&#34;&gt;公式のクイックスタートガイド&lt;/a&gt;に従って実施しました。&lt;/p&gt;
&lt;p&gt;まず、最新の安定版バージョンを取得します：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;VERSION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;curl -s https://storage.googleapis.com/kubevirt-prow/release/kubevirt/kubevirt/stable.txt&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$VERSION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、KubeVirt Operatorをデプロイします：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl create -f &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://github.com/kubevirt/kubevirt/releases/download/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;VERSION&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/kubevirt-operator.yaml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後に、KubeVirtのCRをデプロイして実際のコンポーネントを起動します：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl create -f &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://github.com/kubevirt/kubevirt/releases/download/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;VERSION&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/kubevirt-cr.yaml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;順調にいけばこれで完了&amp;hellip;のはずだったのですが、実際にはいくつか問題が発生しました。&lt;/p&gt;
&lt;h2 id=&#34;4-遭遇した問題と解決&#34;&gt;4. 遭遇した問題と解決&lt;/h2&gt;
&lt;h3 id=&#34;41-cpu命令セットの問題&#34;&gt;4.1 CPU命令セットの問題&lt;/h3&gt;
&lt;p&gt;最初に遭遇したのは、各Worker Node上のVMを管理するコンポーネントである &lt;strong&gt;virt-handler&lt;/strong&gt; Podが起動しないという問題です。&lt;/p&gt;
&lt;p&gt;virt-handler Podのログを確認すると、以下のエラーが出ていました：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;virt-handler-hxdfn virt-launcher 2025-08-30T22:58:59.360762864+09:00 Fatal glibc error: CPU does not support x86-64-v2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これは、Worker Nodeとして使っているProxmox VMのCPU typeをデフォルトの &amp;ldquo;kvm64&amp;rdquo; で動かしており、x86-64-v2命令セットをサポートしていなかったことが原因でした。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解決方法&lt;/strong&gt;：Proxmox VMのCPU typeを &amp;ldquo;x86-64-v2-AES&amp;rdquo; に変更することで解決しました。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>kubeadm × ovn-kubernetesのクラスタでService CIDR問題にハマった</title>
      <link>https://blog.tomokon.net/posts/ovn-kubernetes-subnet-issue/</link>
      <pubDate>Mon, 01 Sep 2025 08:21:31 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/ovn-kubernetes-subnet-issue/</guid>
      
      <description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;今回は、自宅サーバーで構築している &lt;strong&gt;kubeadm&lt;/strong&gt; × &lt;strong&gt;ovn-kubernetes&lt;/strong&gt; のKubernetesクラスタで、kubevirtを導入しようとした際に遭遇したService CIDRに関する問題とその解決方法についてお話しします！&lt;/p&gt;
&lt;p&gt;kubeadm × ovn-kubernetesを構築した話は&lt;a href=&#34;https://blog.tomokon.net/posts/kubeadm-ovn-kubernetes/&#34;&gt;こちらの記事&lt;/a&gt;で紹介しているので、興味があればこちらもぜひ読んでみてください。&lt;/p&gt;
&lt;h2 id=&#34;問題の発見&#34;&gt;問題の発見&lt;/h2&gt;
&lt;p&gt;ovn-kubernetesで構築したKubernetesクラスタにkubevirtを導入しようとしたところ、virt-operatorで以下のようなエラーが出始めました。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Internal error occurred: failed calling webhook
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#34;virtualmachineclusterinstancetype-validator.instancetype.kubevirt.io&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;failed to call webhook: Post
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#34;https://virt-api.kubevirt.svc:443/virtualmachineclusterinstancetypes-validate?timeout=10s&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;context deadline exceeded
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;どうやらvirt-operatorがVirtualMachineClusterInstanceTypeリソースを作成しようとして、validation webhookがタイムアウトか何かで失敗しているようです。
validation webhookを叩くのはkube-apiserverだと思ったので、kube-apiserver側のログも確認してみました。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kube-apiserver-home-k8s-master01 kube-apiserver W0902 13:48:03.160803
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  1 dispatcher.go:217] Failed calling webhook, failing closed
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  virtualmachineclusterinstancetype-validator.instancetype.kubevirt.io:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  failed calling webhook
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;virtualmachineclusterinstancetype-validator.instancetype.kubevirt.io&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  failed to call webhook: Post
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;https://virt-api.kubevirt.svc:443/virtualmachineclusterinstancetypes-validate?timeout=10s&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  context deadline exceeded
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;やはりリソース作成のリクエストを受けたkube-apiserver側でvalidation webhookを叩くのに失敗していそうでした。&lt;/p&gt;
&lt;h2 id=&#34;原因調査と解決方法&#34;&gt;原因調査と解決方法&lt;/h2&gt;
&lt;h3 id=&#34;通信テストと原因の絞り込み&#34;&gt;通信テストと原因の絞り込み&lt;/h3&gt;
&lt;p&gt;普通にvirt-apiのServiceのドメインにアクセスしているように見えるのに、なぜアクセスできないのでしょうか？&lt;/p&gt;
&lt;p&gt;まずはkube-apiserverと同じkube-system namespaceにPodを作成してアクセステストをしてみました。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>kubeadmでovn-kubernetesのクラスタを構築</title>
      <link>https://blog.tomokon.net/posts/kubeadm-ovn-kubernetes/</link>
      <pubDate>Sat, 30 Aug 2025 19:35:25 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/kubeadm-ovn-kubernetes/</guid>
      
      <description>&lt;h2 id=&#34;1-はじめに&#34;&gt;1. はじめに&lt;/h2&gt;
&lt;p&gt;今回は、我が家の自宅サーバーで &lt;strong&gt;ovn-kubernetes&lt;/strong&gt; を使ったKubernetesクラスタを構築した話をしようと思います!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;kubeadm&lt;/strong&gt;, &lt;strong&gt;Ansible&lt;/strong&gt;を使った自前のKubernetesクラスタ構築や、ovn-kubernetesに興味がある方の参考になれば幸いです。&lt;/p&gt;
&lt;h2 id=&#34;2-環境構成&#34;&gt;2. 環境構成&lt;/h2&gt;
&lt;p&gt;今回の構築環境はこんな感じです。
Nodeは全てProxmox VE上の仮想マシンを利用しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Node 構成&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Control Plane Node: 1台（2vCPU、4GiB メモリ）&lt;/li&gt;
&lt;li&gt;Worker Node: 2台（4vCPU、8GiB メモリ）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OS&lt;/strong&gt;: Ubuntu 24.04 Noble&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;: v1.33&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンテナランタイム&lt;/strong&gt;: containerd 2.1.4&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ネットワークアドオン&lt;/strong&gt;: OVN-Kubernetes v1.1.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nodeに必要な要件は公式ドキュメントの
&lt;a href=&#34;https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E5%A7%8B%E3%82%81%E3%82%8B%E5%89%8D%E3%81%AB&#34;&gt;kubeadmのインストール#始める前に&lt;/a&gt;
に記載されているので、構築する際はそちらも参考にしてください。&lt;/p&gt;
&lt;h2 id=&#34;3-構築手順&#34;&gt;3. 構築手順&lt;/h2&gt;
&lt;p&gt;実際の構築は全てAnsible Playbookで記述しました。
Proxmox VMを起動して2つのPlaybookを順番に実行するだけで、Kubernetesクラスタが構築されるようになっています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;cluster_bootstrap.yml&lt;/code&gt;: Control Planeの初期化とOVN-Kubernetesのインストール&lt;/li&gt;
&lt;li&gt;&lt;code&gt;worker_join.yml&lt;/code&gt;: Worker NodeをClusterに参加させる&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;31-playbook構成&#34;&gt;3.1 Playbook構成&lt;/h3&gt;
&lt;p&gt;Ansible Playbookは以下のような構成になっています。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── group_vars
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── all.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│── roles/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── common/              &lt;span class=&#34;c1&#34;&gt;# 全ノード共通の設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   ├── tasks/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── main.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── swap_off.yml &lt;span class=&#34;c1&#34;&gt;# swapの無効化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── resolve.yml  &lt;span class=&#34;c1&#34;&gt;# systemd-resolved設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── containerd.yml &lt;span class=&#34;c1&#34;&gt;# containerdインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── runc.yml     &lt;span class=&#34;c1&#34;&gt;# runcインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── cni.yml      &lt;span class=&#34;c1&#34;&gt;# CNIプラグインインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   └── kube.yml     &lt;span class=&#34;c1&#34;&gt;# Kubernetes関連パッケージ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── cluster_bootstrap/   &lt;span class=&#34;c1&#34;&gt;# Control Plane初期化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   ├── tasks/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── main.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── kube.yml     &lt;span class=&#34;c1&#34;&gt;# kubeadm init実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── helm.yml     &lt;span class=&#34;c1&#34;&gt;# Helmインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   └── ovn_kubernetes.yml &lt;span class=&#34;c1&#34;&gt;# OVN-Kubernetes設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── worker_join/        &lt;span class=&#34;c1&#34;&gt;# Worker Nodeをクラスタに参加&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│       └── tasks/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│           └── main.yml     &lt;span class=&#34;c1&#34;&gt;# kubeadm joinの実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── cluster_bootstrap.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── inventory.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── requirements.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── worker_join.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここからは、各タスクについて抜粋して解説していきます。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>『Ansible実践ガイド[基礎編]』を読んで</title>
      <link>https://blog.tomokon.net/posts/ansible-practical-guide-review/</link>
      <pubDate>Wed, 27 Aug 2025 00:27:48 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/ansible-practical-guide-review/</guid>
      
      <description>&lt;h2 id=&#34;1-はじめに&#34;&gt;1. はじめに&lt;/h2&gt;
&lt;p&gt;Ansible、使っていますか？&lt;/p&gt;
&lt;p&gt;Ansibleは、サーバーの設定管理や自動化を行うためのツールであり、YAML形式のPlaybookを書くことで複数のサーバーに対して一括で任意のタスクを実行できる便利なツールです。&lt;/p&gt;
&lt;p&gt;私は今まで業務と趣味の両方でAnsibleを使う機会は多かったのですが、体系的に基礎から学んだことがありませんでした。
今回は会社から本を買ってもらえる機会があったため、この機に&lt;a href=&#34;https://book.impress.co.jp/books/1122101189&#34;&gt;Ansible実践ガイド[基礎編]&lt;/a&gt;を読んでみることにしました。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.tomokon.net/images/book-ansible-practice.jpg&#34;
    alt=&#34;Ansible実践ガイド[基礎編] 表紙&#34; width=&#34;300&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;本を実際に読んでみて思ったこと・感じたことを、率直にまとめてみます。&lt;/p&gt;
&lt;h2 id=&#34;2-本の全体的な印象&#34;&gt;2. 本の全体的な印象&lt;/h2&gt;
&lt;p&gt;実際に読んでみると、思っていた以上に初心者向けの内容でした。
Playbookやインベントリの概念や基本的な書き方など、本当に「Ansibleって何？」という人が読んでも理解できそうなレベル感で、学び初めの最初の一冊としては非常にわかりやすくまとまっていると感じました。&lt;/p&gt;
&lt;p&gt;逆に、ある程度Ansibleを使った経験がある自分にとっては復習の意味合いが強かったかな、という印象です。
しかし、改めて基礎を整理できたのは良かったですし、知らなかった小技もいくつか発見できて読む価値はありました。&lt;/p&gt;
&lt;h2 id=&#34;3-特に役立ったポイント&#34;&gt;3. 特に役立ったポイント&lt;/h2&gt;
&lt;p&gt;本を読んで幾つか「これは使える！」と思ったものがあったので簡単に紹介します。&lt;/p&gt;
&lt;h3 id=&#34;31-パフォーマンスチューニング&#34;&gt;3.1 パフォーマンスチューニング&lt;/h3&gt;
&lt;p&gt;まずは &lt;strong&gt;5-3 パフォーマンスチューニング&lt;/strong&gt; のセクションに書いてあった以下の内容です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ファクトキャッシュ&lt;/strong&gt; の活用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ストラテジプラグイン&lt;/strong&gt; によるタスク並列処理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ファクトキャッシュ&lt;/strong&gt; は、Ansibleが管理対象ホストから収集する情報（ファクト）をキャッシュしておく仕組みです。
これを使うことで、一度ファクトを収集したホスト上ではその情報を使い回すことができ、2回目以降の実行でPlaybookの実行速度が向上することが期待されます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ストラテジプラグイン&lt;/strong&gt; は、Ansibleのタスク実行の順序や並列度を制御するための仕組みです。
本著では &lt;code&gt;linear&lt;/code&gt;, &lt;code&gt;host_pinned&lt;/code&gt;, &lt;code&gt;free&lt;/code&gt; の3種類のストラテジプラグインが紹介されていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;linear&lt;/code&gt;: デフォルトのストラテジで、タスクごとに全ホストで待ち合わせて次のタスクに進む。タスクで他ホストのタスク結果に依存するような処理がある場合にも安全。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;host_pinned&lt;/code&gt;: ホストごとにタスクを進め、待ち合わせはしない。ホスト数がPlayの並列実行数を超える場合は、先にキューに積まれたホストがPlay全体を終了したら残りのホストのPlayが開始される。ホストごとにタスクの順序は保たれるが、他ホストのタスク結果に依存する処理がある場合には注意が必要。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;free&lt;/code&gt;: ホストごと、タスクごとにキューに積まれるイメージ。全てのホストのタスクが並行実行されるが、同時に実行されるタスクは設定された並列実行数を超えない。&lt;code&gt;host_pinned&lt;/code&gt; と同様に、ホストごとにタスクの順序は保たれるが、他ホストのタスク結果に依存する処理がある場合には注意が必要。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;ldquo;&lt;strong&gt;他ホストのタスク結果に依存する処理&lt;/strong&gt;&amp;rdquo; というのがパッと思いつかないかもしれませんが、
例えば Kubernetes クラスターを構築する Playbook において、ある1つの Control Plane Node で
&lt;code&gt;kubeadm init&lt;/code&gt; &amp;amp; &lt;code&gt;kubeadm token create&lt;/code&gt; をして、残りの Node では &lt;code&gt;kubeadm join&lt;/code&gt; を実行するようなタスクが該当します。
&lt;code&gt;kubeadm join&lt;/code&gt; のタスクでは &lt;code&gt;kubeadm token create&lt;/code&gt; の標準出力を使う必要があるためホスト間でタスク順序の依存が発生し、
例えば &lt;code&gt;kubeadm token create&lt;/code&gt; が完了する前に &lt;code&gt;kubeadm join&lt;/code&gt; のタスクが実行されてしまうと失敗してしまいます。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>初めてのKubernetesドキュメント翻訳コントリビュート</title>
      <link>https://blog.tomokon.net/posts/first-kubernetes-doc-contribution/</link>
      <pubDate>Sat, 23 Aug 2025 11:43:00 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/first-kubernetes-doc-contribution/</guid>
      
      <description>&lt;p&gt;今回は、先日初めてKubernetesの公式ドキュメント翻訳にコントリビュートした経験について書いてみようと思います。&lt;/p&gt;
&lt;p&gt;きっかけは、kubeadmを使って自宅サーバーのKubernetesクラスターを構築している時のことでした。
&lt;a href=&#34;https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/#containerd-systemd&#34;&gt;Kubernetesの公式ドキュメントの日本語翻訳&lt;/a&gt;を見ながら作業を進めていたのですが、
Containerdのcgroup driverをsystemdに変更するための設定の書き方が、Containerdの最新バージョンのものと異なっていることに気づいたんです。&lt;/p&gt;
&lt;p&gt;「あれ？設定ファイルの書き方が違うなぁ」と思って英語の原文を確認してみると、ついこの間Containerdの最新バージョンの設定の書き方がドキュメントに追加されていたことを発見しました。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;io.containerd.cri.v1.runtime&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;containerd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;runtimes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;runc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;io.containerd.cri.v1.runtime&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;containerd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;runtimes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;runc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;SystemdCgroup&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;英語のドキュメントには最新の情報があるのに、日本語版には反映されていない状況を見て、「日本語のドキュメントにも同じ内容があった方が、日本語で情報を探している人にとって便利だよね」と考えました。&lt;/p&gt;
&lt;p&gt;自分と同じようにKubernetesクラスターを構築しようとしている人が、古い設定例で困ることもあるかもしれません。そんな時に最新の情報が日本語でも読めるようになっていれば、きっと役に立つはずです。&lt;/p&gt;
&lt;p&gt;といった感じで、「それなら自分で翻訳してみよう！」と思い立ったのがコントリビュートのきっかけでした。&lt;/p&gt;
&lt;p&gt;コントリビュートしようと決めたものの、実際にどうやって翻訳作業を進めればいいのかわからない状態だったので、まずは&lt;a href=&#34;https://github.com/kubernetes/website&#34;&gt;kubernetes/website&lt;/a&gt;のリポジトリのREADMEを確認することから始めました。&lt;/p&gt;
&lt;p&gt;READMEには翻訳のコントリビューションに関する情報へのリンクがあったので、そこから辿って以下のドキュメントを読み込みました：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/website/blob/main/content/ja/README.md&#34;&gt;日本語版README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/ja/docs/contribute/localization/&#34;&gt;ローカライゼーションガイド&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらのドキュメントを読むことで、翻訳の進め方やコントリビューションのルールについて理解することができました。&lt;/p&gt;
&lt;p&gt;ドキュメントを読んだ後は、実際に他の方が翻訳でコントリビュートした際のプルリクエストを見て参考にしました。&lt;/p&gt;
&lt;p&gt;実際のPRを見ることで、以下のようなことが分かりました：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コミットメッセージの書き方&lt;/li&gt;
&lt;li&gt;ファイルの変更範囲&lt;/li&gt;
&lt;li&gt;レビューでのやり取りの雰囲気&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;やっぱり実際のやり取りを見るのが一番参考になりますね。&lt;/p&gt;
&lt;p&gt;今回の翻訳は、Containerdの設定に関する部分だけだったので、それほど大きな分量ではありませんでした。
とはいえ、技術的な内容を正確に翻訳することと、既存の日本語ドキュメントの文体に合わせることを心がけました。&lt;/p&gt;
&lt;p&gt;最終的にレビューのワンラリーを経て、無事にマージすることができました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kubernetes/website/pull/51940&#34;&gt;https://github.com/kubernetes/website/pull/51940&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;とても小さい変更ではありましたが、実際にコントリビュートする際の雰囲気を掴むことができました。&lt;/p&gt;
&lt;p&gt;これからも積極的にOSSへのコントリビュートを意識してやっていきたいと思います！&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Ansibleで自宅サーバーにBIND9 DNSサーバーを構築</title>
      <link>https://blog.tomokon.net/posts/home-dns-bind9-setup/</link>
      <pubDate>Mon, 11 Aug 2025 16:39:57 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/home-dns-bind9-setup/</guid>
      
      <description>&lt;h2 id=&#34;1-はじめに&#34;&gt;1. はじめに&lt;/h2&gt;
&lt;p&gt;今回は、Ubuntu 24.04 サーバーにBIND9を使ってDNSサーバーを構築しました!&lt;/p&gt;
&lt;p&gt;保守性を考えて Ansible Playbook を使った構築になっています。&lt;/p&gt;
&lt;h2 id=&#34;2-ansible-playbook-構成&#34;&gt;2. Ansible Playbook 構成&lt;/h2&gt;
&lt;p&gt;今回作成したプレイブックの構成はこんな感じです：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;home-dns/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── README.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── bind9.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── inventory.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── templates/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ├── db.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ├── named.conf.local.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── named.conf.options.j2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;シンプルな構成で、最低限必要な機能を提供します。&lt;/p&gt;
&lt;h3 id=&#34;task&#34;&gt;Task&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;bind9.yml&lt;/code&gt;がメインのプレイブックです：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Deploy BIND9 DNS Server&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hosts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;dns_servers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;become&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;vars&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;local_network&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;&amp;lt;LOCAL_NETWORK_CIDR&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;domain_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;&amp;lt;DOMAIN_NAME&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Update apt cache&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.apt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update_cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cache_valid_time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3600&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Install BIND9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.package&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;bind9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;bind9utils&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;dnsutils&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;present&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Configure named.conf.options&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;named.conf.options.j2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/etc/bind/named.conf.options&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;owner&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0644&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;notify&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;restart bind9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Configure named.conf.local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;named.conf.local.j2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/etc/bind/named.conf.local&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;owner&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0644&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;notify&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;restart bind9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Create zone file&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;db.j2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/etc/bind/db.{{ domain_name }}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;owner&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0644&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;notify&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;restart bind9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Start and enable BIND9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bind9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;started&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;enabled&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;handlers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;restart bind9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ansible.builtin.service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;bind9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;restarted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;bind9をインストールし、設定ファイルをテンプレートから生成して配置、bind9 serviceの起動を行います。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>cinder-volumeのトラブルシューティングをしたら意外な原因だった</title>
      <link>https://blog.tomokon.net/posts/cinder-volume-troubleshooting/</link>
      <pubDate>Mon, 11 Aug 2025 11:01:37 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/cinder-volume-troubleshooting/</guid>
      
      <description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;我が家には趣味で構築した OpenStack 環境があります（環境の詳細は &lt;a href=&#34;https://blog.tomokon.net/posts/home-server/&#34;&gt;こちらの記事&lt;/a&gt; を参照してください）。&lt;/p&gt;
&lt;p&gt;普段はこのブログサイトや GitHub self-hosted runner 等を動かしていてそれなりに安定稼働しているのですが、ある日 Cinder Volume を作成しようとしたところ、なぜか作成に失敗してしまいました。&lt;/p&gt;
&lt;p&gt;そこから始まったトラブルシューティングで、最終的にたどり着いた原因が予想外すぎて驚いたので、その経験を共有したいと思います。&lt;/p&gt;
&lt;h2 id=&#34;問題の発見&#34;&gt;問題の発見&lt;/h2&gt;
&lt;p&gt;新規に VM を作成するために Cinder Volume の作成しようとしたところ、&amp;ldquo;no host available&amp;rdquo; みたいなエラーが出て失敗してしまいました。そのため、まずは cinder-volume service の状態を確認してみることにしました。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;openstack volume service list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すると、なんと cinder-volume サービスが down になっていました。これが直接の原因のようです。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; Binary           &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; Host          &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; Zone &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; Status  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; State &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; Updated At          &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ---------------- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ------------- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ---- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ------- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ----- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; ------------------- &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; cinder-volume    &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; block-storage &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; nova &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; enabled &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; down  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; 2025-XX-XX XX:XX:XX &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; cinder-scheduler &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; controller    &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; nova &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; enabled &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; up    &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; 2025-XX-XX XX:XX:XX &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;「あれ、cinder-volume が落ちてる&amp;hellip;？」というわけで、調査開始です。&lt;/p&gt;
&lt;h2 id=&#34;調査&#34;&gt;調査&lt;/h2&gt;
&lt;h3 id=&#34;サービスの実態を確認&#34;&gt;サービスの実態を確認&lt;/h3&gt;
&lt;p&gt;まず、cinder-volume が本当に停止しているのか確認するため、cinder-volume が動いている block storage ホストに SSH でログインしました。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Claude CodeでNeovim configのVimScriptからLuaへのマイグレーション</title>
      <link>https://blog.tomokon.net/posts/migrate-neovim-config/</link>
      <pubDate>Wed, 23 Jul 2025 09:20:05 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/migrate-neovim-config/</guid>
      
      <description>&lt;h2 id=&#34;1-はじめに&#34;&gt;1. はじめに&lt;/h2&gt;
&lt;p&gt;みなさん、Neovimの設定ファイル、メンテナンスしてますか？&lt;/p&gt;
&lt;p&gt;私は1年前にVimを本格的に使い始め、その際にVimScriptで書いたNeovimの設定ファイルを使い続けていました。
「いつかLuaに移行しなきゃなぁ&amp;hellip;」と思いながらも、面倒くさくてずっと後回しにしていました。&lt;/p&gt;
&lt;p&gt;そんな中、最近話題のClaude Codeを触る機会があり、「これを使ったら設定ファイルを楽にマイグレーションできるんじゃないか？」と思い立ちました。
重い腰を上げて、ついにVimScript → Luaの移行に挑戦してみることにしたのです。&lt;/p&gt;
&lt;p&gt;私の既存の設定は、「&lt;a href=&#34;https://gihyo.jp/book/2020/978-4-297-11169-4&#34;&gt;マスタリングVim&lt;/a&gt;」にインスパイアされて作成し、使っていきながら様々なプラグインやキーバインドを追加していったものでした。
プラグイン管理にはvim-plugを使い、基本設定からキーマッピング、カスタム関数まで全て &amp;ldquo;&lt;strong&gt;単一の&lt;/strong&gt;&amp;rdquo; VimScriptファイルに記述していたため、管理するのが辛いものとなっていました。&lt;/p&gt;
&lt;p&gt;特に抱えていた課題としては：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新しいLuaベースのプラグインを導入しにくい&lt;/li&gt;
&lt;li&gt;設定の可読性・保守性が悪い&lt;/li&gt;
&lt;li&gt;パフォーマンスの問題（起動が遅い）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった点がありました。&lt;/p&gt;
&lt;h2 id=&#34;2-neovimの設定について&#34;&gt;2. Neovimの設定について&lt;/h2&gt;
&lt;p&gt;Neovimは従来のVimScriptに加えて、Lua言語での設定記述をサポートしています。
Luaを使うことで以下のメリットが得られます：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;豊富なエコシステム&lt;/strong&gt;: 多くの新しいプラグインがLuaベースで開発されている&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保守性&lt;/strong&gt;: 管理しやすいようにディレクトリ・ファイルへの分割が容易&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可読性&lt;/strong&gt;: より直感的で読みやすい文法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高速&lt;/strong&gt;: VimScriptと比べて大幅に高速&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特に最近のNeovimプラグインの、nvim-treesitter、nvim-lspconfig, none-lsなどを利用して、楽にそして柔軟に設定の管理を行いたいモチベーションがありました。&lt;/p&gt;
&lt;h2 id=&#34;3-移行戦略の立案&#34;&gt;3. 移行戦略の立案&lt;/h2&gt;
&lt;p&gt;既存のVimScript設定を分析してみると、大きく以下のカテゴリに分類できることがわかりました：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;プラグイン管理&lt;/strong&gt;: vim-plugによるプラグインのインストールと管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基本設定&lt;/strong&gt;: オプション設定、外観設定&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;キーマッピング&lt;/strong&gt;: 基本的なキーバインドとカスタムマッピング&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;プラグイン設定&lt;/strong&gt;: 各プラグインの個別設定&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;カスタム関数&lt;/strong&gt;: 自作の関数やコマンド&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lua設定では、これらを機能ごとにファイル分割して整理しやすいが大きなメリットです。
移行後は以下のような構造で整理しました：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/.config/nvim/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── init.lua                    &lt;span class=&#34;c1&#34;&gt;# エントリーポイント&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── after/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── lsp/                    &lt;span class=&#34;c1&#34;&gt;# LSP固有設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│       ├── gopls.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│       └── lua_ls.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── lua/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ├── config/                 &lt;span class=&#34;c1&#34;&gt;# 基本設定群&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │   ├── edit.lua            &lt;span class=&#34;c1&#34;&gt;# 編集関連設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │   ├── lazy.lua            &lt;span class=&#34;c1&#34;&gt;# プラグイン管理（lazy.nvim）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │   ├── search.lua          &lt;span class=&#34;c1&#34;&gt;# 検索関連設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │   ├── view.lua            &lt;span class=&#34;c1&#34;&gt;# 見た目関連設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │   ├── window.lua          &lt;span class=&#34;c1&#34;&gt;# ウィンドウ関連設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │   └── langs/              &lt;span class=&#34;c1&#34;&gt;# 言語固有設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │       ├── c.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │       ├── go.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │       ├── terraform.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    │       └── yaml.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── plugins/                &lt;span class=&#34;c1&#34;&gt;# プラグイン設定群&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── completion.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── copilot.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── deepl.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── edit.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── lang.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── lsp.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── navi.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── search.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── session.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ├── sql.lua
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        └── view.lua
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この構造により、機能ごとに設定が整理され、管理しやすくなりました。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>自宅OpenStackのAnsible解説</title>
      <link>https://blog.tomokon.net/posts/home-openstack-ansible/</link>
      <pubDate>Sun, 23 Mar 2025 18:20:31 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/home-openstack-ansible/</guid>
      
      <description>&lt;p&gt;みなさんこんにちは。&lt;/p&gt;
&lt;p&gt;今回は、私が自宅クラウドのOpenStackを構築するのに使っているAnsibleを題材にして、Ansibleの基本的な使い方について紹介したいと思います。
業務で使っているものとは何の関係もないので、これをこのまま本番環境で使える、みたいなものではないです。
ご注意ください。&lt;/p&gt;
&lt;h2 id=&#34;1-ansibleのディレクトリ構成&#34;&gt;1. Ansibleのディレクトリ構成&lt;/h2&gt;
&lt;p&gt;以下が本記事で使用するAnsibleのディレクトリ構成です。
&lt;del&gt;全てのソースコードを見たい方は&lt;a href=&#34;https://github.com/TOMOFUMI-KONDO/openstack-ansible&#34;&gt;こちら&lt;/a&gt;からどうぞ。&lt;/del&gt;
諸事情によりprivate repoにしました。&amp;#x1f64f;&lt;/p&gt;
&lt;p&gt;なおOpenStackにはちゃんと公式のAnsible Playbookもありますが、今回は自分で作ってみたかったため作りました。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── compute.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── controller.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── database.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── inventory.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── roles
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── common
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   └── tasks
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       └── main.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── compute
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   ├── files
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   └── chrony.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   ├── handlers
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   └── main.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   ├── tasks
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── main.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── neutron.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── nova.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   └── ntp.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   └── templates
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── neutron.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── nova-compute.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── nova.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       └── openvswitch_agent.ini.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── controller
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   ├── files
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── apache2.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── apache2_openstack_dashboard.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── dhcp_agent.ini
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── horizon_local_settings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   └── ml2_conf.ini
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   ├── handlers
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   └── main.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   ├── tasks
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── cinder.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── etcd.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── glance.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── horizon.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── keystone.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── main.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── memcached.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── neutron.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── nova.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── ntp.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── placement.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   └── rabbitmq.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   └── templates
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── chrony.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── cinder.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── etcd.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── glance-api.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── keystone.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── memcached.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── metadata_agent.ini.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── neutron.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── nova.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       ├── openvswitch_agent.ini.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       └── placement.conf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   ├── database
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   ├── handlers
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   └── main.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   ├── tasks
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── create_user.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   ├── main.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   │   └── secure_installation.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │   └── templates
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   │       └── 99-openstack.cnf.j2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│   └── openstack
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│       └── tasks
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│           └── main.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── vars
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ├── credentials.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    └── vars.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エントリポイントとなるplaybook&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>我が家のOpenStack server</title>
      <link>https://blog.tomokon.net/posts/home-server/</link>
      <pubDate>Sun, 23 Mar 2025 17:33:34 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/home-server/</guid>
      
      <description>&lt;blockquote&gt;
&lt;p&gt;&amp;#x26a0;&amp;#xfe0f; 本記事の執筆には生成AIを大いに利用しています。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;こんにちは。みなさん、自宅サーバしてますか？してますよね？&lt;/p&gt;
&lt;p&gt;というわけで、今回は私が自宅サーバで運用しているOpenStack環境を、ハードウェア/ソフトウェア両面の構成、さらにちょっとしたこだわりポイントまで、まるっと紹介したいと思います。&lt;/p&gt;
&lt;p&gt;（ちなみに、このブログも自宅のOpenStack環境で動いています！）&lt;/p&gt;
&lt;h2 id=&#34;1-我が家のopenstackざっくり概要&#34;&gt;1. 我が家のOpenStack、ざっくり概要&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenStack バージョン&lt;/strong&gt;: 2024.02 “Dalmatian”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OS&lt;/strong&gt;: Ubuntu 24.04 “Noble”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;構成&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Management Node × 1（iPXE / DHCP / DNSサーバ）&lt;/li&gt;
&lt;li&gt;Controller Node × 1&lt;/li&gt;
&lt;li&gt;Compute Node × 2&lt;/li&gt;
&lt;li&gt;Block Storage Node × 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;インテリア（！？）&lt;/li&gt;
&lt;li&gt;仮想化の勉強&lt;/li&gt;
&lt;li&gt;OSSを動かして遊ぶ&lt;/li&gt;
&lt;li&gt;ISUCONの練習とか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-ハードウェア構成&#34;&gt;2. ハードウェア構成&lt;/h2&gt;
&lt;p&gt;ここからはハードウェアの構成を紹介していきます。
ちなみに見た目はこんな感じです。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.tomokon.net/images/home-server.jpg&#34;
    alt=&#34;自宅サーバ機器たち&#34; width=&#34;600&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;ルータ&#34;&gt;ルータ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;YAMAHA RTX810&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;家庭内LANとの境界に設置しているVPNルータ&lt;/li&gt;
&lt;li&gt;L2TP/IPSecで外出先でもVPN接続可能！（後述）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Buffalo BHR-4GRV2&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;VMセグメントのゲートウェイ&lt;/li&gt;
&lt;li&gt;有線ルータ&lt;/li&gt;
&lt;li&gt;DMZ機能を利用して管理セグメントからVMへの通信を通せて便利&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NEC WG2600HS2&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;管理セグメントのゲートウェイ&lt;/li&gt;
&lt;li&gt;Wi-Fiを喋れるので管理面への接続が楽ちん&lt;/li&gt;
&lt;li&gt;DMZ機能なしのため、VPNセグメントからの通信はポートフォワーディングで対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;l2スイッチ&#34;&gt;L2スイッチ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ELECOM EHC-G08MN2-HJB&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1Gbps × 8ポート&lt;/li&gt;
&lt;li&gt;VMセグメント用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FOXNEO&lt;/strong&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Mastering KVM Virtualization を読んだ感想</title>
      <link>https://blog.tomokon.net/posts/mastering-kvm-virtualization/</link>
      <pubDate>Sun, 02 Feb 2025 15:16:04 +0900</pubDate>
      
      <guid>https://blog.tomokon.net/posts/mastering-kvm-virtualization/</guid>
      
      <description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;やっと自宅サーバでブログを動かすことができたので、ここ数ヶ月ずっと読んでいてようやく読み終わった本の感想を書こうと思います。
本のタイトルは「Mastering KVM Virtualization」というやつで、仮想化周り、特にQEMU/KVMについて詳しく知りたかったので読んでみました。
リンクを貼っておくので、気になる方は是非読んでみてください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://amzn.asia/d/1C0K8xl&#34;&gt;Amazon | Mastering KVM Virtualization&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/71&amp;#43;-sEJFCWL._SY385_.jpg&#34; alt=&#34;Mastering KVM Virtualization&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;本の概要&#34;&gt;本の概要&lt;/h2&gt;
&lt;p&gt;この本はQEMUやKVMを中心としたLinuxの仮想化機能、またそれらを管理するシステムについての概要を述べている本です。
洋書で結構分厚い本なのでかなり読み応えがあります。&lt;/p&gt;
&lt;p&gt;全体として、各トピックについてそこそこ詳しく記載されているが、Deep Diveというほどではない感じです。
例えば、QEMUやKVMのソースコードレベルでの解説等はほとんどありません（序盤に少しだけある）。&lt;/p&gt;
&lt;p&gt;本の構成は以下の様になっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Section 1: KVM Virtualization Basics
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;Understanding Linux Virtualization&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;KVM as a Virtualization Solution&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Section 2: Libvirt and ovirt for Virtual Machine Management
&lt;ul&gt;
&lt;li&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Installing KVM Hypervisor, libvirt, and ovirt&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Libvirt Networking&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Libvirt Storage&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;Virtual Display Devices and Protocols&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;Virtual Machines: Installation, Configuration, and Life Cycle Management&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;Creating and Modifying VM Disks, Templates, and Snapshots&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Section 3: Automation, Customization, and Orchestration for KVM VMs
&lt;ul&gt;
&lt;li&gt;
&lt;ol start=&#34;9&#34;&gt;
&lt;li&gt;Cusomizing a Virtual Machine with cloud-init&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;10&#34;&gt;
&lt;li&gt;Automated Windows Guest Deployment and Customization&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;11&#34;&gt;
&lt;li&gt;Ansible and Scripting for Orchestration and Automation&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Section 4: Sclability, Monitoring, Performance Tuning, and Troubleshooting
&lt;ul&gt;
&lt;li&gt;
&lt;ol start=&#34;12&#34;&gt;
&lt;li&gt;Scaling Out KVM with OpenStack&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;13&#34;&gt;
&lt;li&gt;Scaling out KVM with AWS&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;14&#34;&gt;
&lt;li&gt;Monitoring the KVM Virtualization Platform&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;15&#34;&gt;
&lt;li&gt;Performance Tuning and Optimization for KVM VMs&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;16&#34;&gt;
&lt;li&gt;Trouble Shooting Guidelines for the KVM Platform&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「Section 1: KVM Virtualization Basics」ではKVMや仮想化技術に関する基本のおさらいをしてくれます。
そもそも仮想化とは何か、なぜするのかとか、仮想化の種類、仮想化の対象、そしてLibvirtやQEMU、KVMがそれぞれ何なのかみたいなことも説明されていました。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>2025年の抱負</title>
      <link>https://blog.tomokon.net/posts/my-first-post/</link>
      <pubDate>Sun, 19 Jan 2025 09:33:24 +0000</pubDate>
      
      <guid>https://blog.tomokon.net/posts/my-first-post/</guid>
      
      <description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;記念すべき1記事目ということで何を書こうか迷いに迷ったんですが、丁度2025年の始まりなので、ここは一つ新年の抱負でも書こうかなと思います。&lt;/p&gt;
&lt;h2 id=&#34;昨年の感想&#34;&gt;昨年の感想&lt;/h2&gt;
&lt;p&gt;新年の抱負を書くにあたって、やっぱ昨年を振り返る必要があります。&lt;/p&gt;
&lt;p&gt;2024年は自分にとって新鮮な年でした。
今までの人生の大半を占めてきた &amp;ldquo;学生&amp;rdquo; という身分をやっと捨て、新社会人として新たな一歩を踏み出したのは非常に感慨深いです。
また新たな土地、新たな家、新たな人間関係の中で、&amp;ldquo;仕事&amp;rdquo; という今までとは違う形でエンジニアリングに取り組み、日々新たな刺激がたくさんでした。&lt;/p&gt;
&lt;p&gt;慣れないながらもなんとなく仕事に取り組み、ある程度やるべきことはこなせた気はするのですが、日々仕事をしている中で自分の知識や経験不足をいたく痛感する毎日でした。
昨年感じた自分の能力の不足を糧に、今年は頑張っていきたいです。&lt;/p&gt;
&lt;h2 id=&#34;今年の抱負&#34;&gt;今年の抱負&lt;/h2&gt;
&lt;p&gt;さて、今年頑張りたいことはざっくりこんな感じです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;仮想化技術の習熟&lt;/li&gt;
&lt;li&gt;OS周りの知識を深める&lt;/li&gt;
&lt;li&gt;eBPFに詳しくなる&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;1つずつ詳しく見ていきましょう。&lt;/p&gt;
&lt;h3 id=&#34;1-仮想化技術の習熟&#34;&gt;1. 仮想化技術の習熟&lt;/h3&gt;
&lt;p&gt;自分は仕事でプライベートクラウドのIaaS基盤の開発・運用をしており、業務の中でOpenStackを中心としたいろん技術を日々触っています。&lt;/p&gt;
&lt;p&gt;その中で痛感したのが、仮想化周りの技術に関する前提知識の欠落です。
前提となる知識が圧倒的に不足しているがために、業務において適切に判断を下せなかったり、時間がかかったりしてしまいます。&lt;/p&gt;
&lt;p&gt;仮想化といっても幅広く、CPU、メモリ・IOデバイスなどのハードウェアの仮想化の技術だったり、OVSなどの仮想ネットワークの技術など色々あります。
ここら辺は奥が深く非常に面白いので、もっと理解してあげたいことこの上ないです。&lt;/p&gt;
&lt;h3 id=&#34;2-os周りの知識を深める&#34;&gt;2. OS周りの知識を深める&lt;/h3&gt;
&lt;p&gt;上記にも関連してきますが、クラウド基盤を開発・運用する上で必要なOS、特にLinuxに関する知識も圧倒的に不足していると感じています。
基本的なコマンドとかディレクトリ設計とかはわかっているんですが、ファイルシステムの仕組みとか、プロセスのスケジューリングとか、ブート時に何が行われているのかとか、ハードウェアを操作する際に実際に何が行われているのかとか分からないことだらけです。&lt;/p&gt;
&lt;p&gt;丁度友人がOS自作本をおすすめてしてくれたので、そちらをやったりしながらもっと知識を深めていければと思います。&lt;/p&gt;
&lt;h3 id=&#34;3-ebpfに詳しくなる&#34;&gt;3. eBPFに詳しくなる&lt;/h3&gt;
&lt;p&gt;ここまでとは打って変わりますが、個人的にeBPFにすごく興味があります。
学生の時に知ってチュートリアルレベルのコードは書いたことくらいはあるんですが、Ciliumとかの実際にプロダクション環境でも使われている大規模なeBPFベースのプロダクトとかの中身を見たことがないので、そういうのを見て勉強したいですし、自分でも適当に色々書いてみたいです。&lt;/p&gt;
&lt;p&gt;eBPFは技術的にももちろん興味があるんですが、それとは別に、比較的新しめでまだそこまで情報も出ていなくて枯れていない技術をキャッチアップする、というのを学習の戦略としてやっておきたいというのも動機として大きいです。&lt;/p&gt;
&lt;h3 id=&#34;4-積極的に自作して公開する&#34;&gt;4. 積極的に自作して公開する&lt;/h3&gt;
&lt;p&gt;今までは趣味で作ってきたものも、既存の言語とフレームワークを使って開発し、既存のパブリッククラウドを使ってデプロイすることが多かった、というかほとんどでした。
もちろんソフトウェア開発の基礎を学ぶ上ではとてもいい方法で、実際の仕事でも既存のものを使うのは推奨されていると思います。&lt;/p&gt;
&lt;p&gt;しかし技術を学び、身につけるという観点で言うといいことばかりではなく、既存のものをただ使うだけでは深い学びは得られません。
これからは、趣味で作るものに関しては積極的に自作していきたいなと思います。
むしろ自作そのものを目的にするのも悪くないと思っています。&lt;/p&gt;
&lt;p&gt;ソフトウェア開発をする際に自作のフレームワークを使ってみたり、自作の言語を開発してみたり、またコンパイラやOSの自作にも挑戦したいです。
そうして作ったものをGitHubで公開したり、ブログやLTなどで積極的に発信し、自分がどんなことをしてる人なのかを積極的に周りに伝えるとともに自作のモチベーションにも繋げたいです。
また、既存のソフトウェアを使うにしてもコアな機能の使用やコアな使い方を積極的にし、見つけた機能不足やバグをアップストリームに上げることもしていきたいです。&lt;/p&gt;
&lt;h3 id=&#34;5-アウトプット&#34;&gt;5. アウトプット&lt;/h3&gt;
&lt;p&gt;上記の事項にも関係しますが、今年はアウトプットを積極的にしていきたいです。&lt;/p&gt;
&lt;p&gt;アウトプットを前提にすることでインプットの質向上が見込めたり、そもそもいろんなことを学ぶモチベーションにもなったりします。
また、自分の作っているものや学んでいることを公開することで、自分が何者なのかを社内や業界内に認知してもらえることにつながると思います。&lt;/p&gt;
&lt;h3 id=&#34;6-作業の高速化&#34;&gt;6. 作業の高速化&lt;/h3&gt;
&lt;p&gt;仕事をしていて一番痛感したのが、作業の遅さが致命的だと言うことです。
何をするにしても無駄な思考が多く、同じことを何度も繰り返し考えているような感覚に陥ります。
もちろん、作業を早くするために手を抜くと言うのは論外なんですが、作業が遅いと寧ろ本当はやるべきことに手をつけられず、結果的に手を抜いているのと同じことになるので、作業の速さは絶対に必要です。&lt;/p&gt;
&lt;p&gt;自分の好きな言葉に、「力は技を制し、技は力を制す。そして、速さは全てを制す。」と言うものがあります。
エンジニアリングで例えると、力は頭脳や思考力、技は知識と考えていいかと思いますが、作業の速さは、それら全てを凌駕するほどの価値があります。
1秒間に何十億もの超単純な計算を実行することでこの世界を支えているCPUを見ればわかるように、作業の量が質を圧倒することは自明です。&lt;/p&gt;
&lt;p&gt;今年は、何をするにしても &amp;ldquo;速さ&amp;rdquo; を意識していきたいと思います。&lt;/p&gt;
&lt;h3 id=&#34;7-健康の推進&#34;&gt;7. 健康の推進&lt;/h3&gt;
&lt;p&gt;さて、いよいよ最後になりましたが、今年はこれまで以上に健康に気を遣って生きていきたいなと感じています。&lt;/p&gt;
&lt;p&gt;社会人になって圧倒的に運動量が減り、そのせいか体や頭にあちこち不調が出ているような気がします。
食事や睡眠は学生の時と比べて今の方が圧倒的に良くなったので、運動だけ意識するようにして、とりあえず徒歩での通勤と家での筋トレをゆるく継続していきたいです。&lt;/p&gt;</description>
      
    </item>
    
  </channel>
</rss>
