<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Kubernetes on kkato.dev</title>
    <link>https://kkato.dev/tags/kubernetes/</link>
    <description>Recent content in Kubernetes on kkato.dev</description>
    <image>
      <title>kkato.dev</title>
      <url>https://kkato.dev/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://kkato.dev/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.146.0</generator>
    <language>en</language>
    <lastBuildDate>Sat, 14 Mar 2026 12:00:00 +0900</lastBuildDate>
    <atom:link href="https://kkato.dev/tags/kubernetes/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Prometheusリモートストレージの比較</title>
      <link>https://kkato.dev/posts/prometheus-remote-storage/</link>
      <pubDate>Sat, 14 Mar 2026 12:00:00 +0900</pubDate>
      <guid>https://kkato.dev/posts/prometheus-remote-storage/</guid>
      <description>&lt;p&gt;Prometheusはデフォルトでローカルディスクにメトリクスを保存しますが、長期保存やHA構成を実現するためにリモートストレージが必要になります。代表的な選択肢としてThanos・Cortex・Mimirの3つがあり、業務で検討する機会があったので比較してまとめました。&lt;/p&gt;
&lt;h3 id=&#34;比較表&#34;&gt;比較表&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;a href=&#34;https://github.com/thanos-io/thanos&#34;&gt;Thanos&lt;/a&gt;&lt;/th&gt;
          &lt;th&gt;&lt;a href=&#34;https://github.com/cortexproject/cortex&#34;&gt;Cortex&lt;/a&gt;&lt;/th&gt;
          &lt;th&gt;&lt;a href=&#34;https://github.com/grafana/mimir&#34;&gt;Mimir&lt;/a&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;開発元&lt;/td&gt;
          &lt;td&gt;コミュニティ (元Improbable)&lt;/td&gt;
          &lt;td&gt;コミュニティ (元Weaveworks)&lt;/td&gt;
          &lt;td&gt;Grafana Labs&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GitHub Stars&lt;/td&gt;
          &lt;td&gt;~13,800&lt;/td&gt;
          &lt;td&gt;~5,750&lt;/td&gt;
          &lt;td&gt;~4,400&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ライセンス&lt;/td&gt;
          &lt;td&gt;Apache 2.0&lt;/td&gt;
          &lt;td&gt;Apache 2.0&lt;/td&gt;
          &lt;td&gt;AGPL-3.0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;CNCF&lt;/td&gt;
          &lt;td&gt;Incubating&lt;/td&gt;
          &lt;td&gt;Incubating&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;データ取り込み&lt;/td&gt;
          &lt;td&gt;Sidecar (pull) / Receiver (push)&lt;/td&gt;
          &lt;td&gt;remote_write (push)&lt;/td&gt;
          &lt;td&gt;remote_write (push)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;マルチテナント&lt;/td&gt;
          &lt;td&gt;限定的 (Receiver経由)&lt;/td&gt;
          &lt;td&gt;ネイティブ対応&lt;/td&gt;
          &lt;td&gt;ネイティブ対応&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ダウンサンプリング&lt;/td&gt;
          &lt;td&gt;あり (ネイティブ)&lt;/td&gt;
          &lt;td&gt;なし&lt;/td&gt;
          &lt;td&gt;なし&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;オブジェクトストレージ&lt;/td&gt;
          &lt;td&gt;S3, GCS, Azure, Swift, COS&lt;/td&gt;
          &lt;td&gt;S3, GCS, Azure, Swift&lt;/td&gt;
          &lt;td&gt;S3, GCS, Azure, Swift&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;star-history&#34;&gt;Star History&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://star-history.com/#thanos-io/thanos&amp;amp;cortexproject/cortex&amp;amp;grafana/mimir&amp;amp;Date&#34;&gt;&lt;img alt=&#34;Star History Chart&#34; loading=&#34;lazy&#34; src=&#34;https://api.star-history.com/svg?repos=thanos-io/thanos,cortexproject/cortex,grafana/mimir&amp;type=Date&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;各プロジェクトの特徴&#34;&gt;各プロジェクトの特徴&lt;/h3&gt;
&lt;h4 id=&#34;thanos&#34;&gt;Thanos&lt;/h4&gt;
&lt;p&gt;コミュニティ主導でCNCF Incubatingプロジェクトになっています。最大の特徴はSidecarパターンで、既存のPrometheusに手を加えずに横に並べる形でデプロイできます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cloudflare Tunnelを使っておうちk8sクラスタにアクセスする</title>
      <link>https://kkato.dev/posts/cloudflare-tunnel/</link>
      <pubDate>Sun, 01 Mar 2026 13:27:12 +0900</pubDate>
      <guid>https://kkato.dev/posts/cloudflare-tunnel/</guid>
      <description>&lt;p&gt;Cloudflare Tunnelを使うと、パブリックIPやポート開放なしにKubernetesクラスタ上のサービスをインターネットに公開できます。
今回はCloudflare Tunnelの作成から、cloudflare-tunnel-ingress-controllerを使ってKubernetesのIngressリソースで自動的にトンネル経由の公開を行う設定までをまとめました。&lt;/p&gt;
&lt;h3 id=&#34;cloudflare-tunnelの仕組み&#34;&gt;Cloudflare Tunnelの仕組み&lt;/h3&gt;
&lt;p&gt;通常、クラスタ内のサービスを外部に公開するにはパブリックIPの取得やルーターのポート開放が必要です。Cloudflare Tunnelを使うとクラスタ側からCloudflareへアウトバウンド接続を張るだけで、Cloudflare経由で外部からのアクセスを受けられるようになります。&lt;/p&gt;
&lt;p&gt;cloudflare-tunnel-ingress-controllerを使うと、KubernetesのIngressリソースを作成するだけで自動的にCloudflare Tunnelのルーティングが設定されます。通常のIngress Controllerと同じ使い勝手でトンネル経由の公開が可能です。&lt;/p&gt;
&lt;h3 id=&#34;cloudflare-tunnelの作成&#34;&gt;Cloudflare Tunnelの作成&lt;/h3&gt;
&lt;p&gt;Cloudflareダッシュボードからトンネルを作成します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ネットワーク &amp;gt; Tunnels&lt;/strong&gt; に移動し、「トンネルを作成」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://kkato.dev/images/cloudflare-tunnel/create-cloudflare-tunnel1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;トンネル名を入力します。ここでは &lt;code&gt;kkato.app&lt;/code&gt; としました。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://kkato.dev/images/cloudflare-tunnel/create-cloudflare-tunnel2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;トンネルが作成されると、環境のセットアップ画面が表示されます。ここに表示されるトンネルトークンを後ほど使います。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://kkato.dev/images/cloudflare-tunnel/create-cloudflare-tunnel3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;作成が完了するとトンネルの概要が表示されます。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://kkato.dev/images/cloudflare-tunnel/create-cloudflare-tunnel4.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;cloudflare-apiトークンの作成&#34;&gt;Cloudflare APIトークンの作成&lt;/h3&gt;
&lt;p&gt;cloudflare-tunnel-ingress-controllerがCloudflare APIを操作するためのトークンを作成します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://dash.cloudflare.com/profile/api-tokens&#34;&gt;Cloudflareダッシュボード&lt;/a&gt;のAPIトークンページにアクセスし、「Create Token」から「Create Custom Token」を選択します。&lt;/p&gt;
&lt;p&gt;以下の権限を設定します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Account&lt;/strong&gt; / &lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt; / &lt;strong&gt;Edit&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zone&lt;/strong&gt; / &lt;strong&gt;DNS&lt;/strong&gt; / &lt;strong&gt;Edit&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;シークレットをgcp-secret-managerに登録&#34;&gt;シークレットをGCP Secret Managerに登録&lt;/h3&gt;
&lt;p&gt;External Secrets Operatorを使ってGCP Secret ManagerからKubernetesのSecretを自動生成する構成にしています。以下の3つのシークレットを登録します。&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;echo&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;lt;your-api-token&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; gcloud secrets create cloudflare-api-token --data-file&lt;span class=&#34;o&#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; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;lt;your-account-id&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; gcloud secrets create cloudflare-account-id --data-file&lt;span class=&#34;o&#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; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;lt;your-tunnel-name&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; gcloud secrets create cloudflare-tunnel-name --data-file&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;-
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;アカウントIDはCloudflareダッシュボードのURLやトンネルトークンのデコード結果から確認できます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>PostgreSQL Operatorの比較</title>
      <link>https://kkato.dev/posts/postgres-operators/</link>
      <pubDate>Fri, 20 Feb 2026 15:00:00 +0900</pubDate>
      <guid>https://kkato.dev/posts/postgres-operators/</guid>
      <description>&lt;p&gt;Kubernetes上でPostgreSQLを運用するためのOperatorが複数存在します。以前どれを選ぶか検討する機会があったので、主要な4つのオペレーターを比較してみました。&lt;/p&gt;
&lt;h3 id=&#34;比較表&#34;&gt;比較表&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;a href=&#34;https://github.com/CrunchyData/postgres-operator&#34;&gt;PGO&lt;/a&gt;&lt;/th&gt;
          &lt;th&gt;&lt;a href=&#34;https://github.com/cloudnative-pg/cloudnative-pg&#34;&gt;CloudNativePG&lt;/a&gt;&lt;/th&gt;
          &lt;th&gt;&lt;a href=&#34;https://github.com/zalando/postgres-operator&#34;&gt;Zalando&lt;/a&gt;&lt;/th&gt;
          &lt;th&gt;&lt;a href=&#34;https://github.com/ongres/stackgres&#34;&gt;StackGres&lt;/a&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;開発元&lt;/td&gt;
          &lt;td&gt;Crunchy Data&lt;/td&gt;
          &lt;td&gt;EDB / CNCF&lt;/td&gt;
          &lt;td&gt;Zalando&lt;/td&gt;
          &lt;td&gt;OnGres&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GitHub Stars&lt;/td&gt;
          &lt;td&gt;4,400&lt;/td&gt;
          &lt;td&gt;8,000&lt;/td&gt;
          &lt;td&gt;5,100&lt;/td&gt;
          &lt;td&gt;1,400&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ライセンス (Operator)&lt;/td&gt;
          &lt;td&gt;Apache 2.0&lt;/td&gt;
          &lt;td&gt;Apache 2.0&lt;/td&gt;
          &lt;td&gt;MIT&lt;/td&gt;
          &lt;td&gt;AGPL-3.0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ライセンス (コンテナイメージ)&lt;/td&gt;
          &lt;td&gt;独自 (制限あり)&lt;/td&gt;
          &lt;td&gt;Apache 2.0&lt;/td&gt;
          &lt;td&gt;MIT&lt;/td&gt;
          &lt;td&gt;AGPL-3.0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Patroni&lt;/td&gt;
          &lt;td&gt;使用&lt;/td&gt;
          &lt;td&gt;不使用 (独自実装)&lt;/td&gt;
          &lt;td&gt;使用 (Patroni開発元)&lt;/td&gt;
          &lt;td&gt;使用&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;CNCF&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;Sandbox&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;star-history&#34;&gt;Star History&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://star-history.com/#CrunchyData/postgres-operator&amp;amp;cloudnative-pg/cloudnative-pg&amp;amp;zalando/postgres-operator&amp;amp;ongres/stackgres&amp;amp;Date&#34;&gt;&lt;img alt=&#34;Star History Chart&#34; loading=&#34;lazy&#34; src=&#34;https://api.star-history.com/svg?repos=CrunchyData/postgres-operator,cloudnative-pg/cloudnative-pg,zalando/postgres-operator,ongres/stackgres&amp;type=Date&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;各オペレーターの特徴&#34;&gt;各オペレーターの特徴&lt;/h3&gt;
&lt;h4 id=&#34;pgo-crunchy-data&#34;&gt;PGO (Crunchy Data)&lt;/h4&gt;
&lt;p&gt;Crunchy Data社が開発するオペレーターで、Patroniを使ったHAに対応しています。Operator自体のソースコードはApache 2.0ですが、Crunchy Data が配布するコンテナイメージは独自のライセンス（&lt;a href=&#34;https://www.crunchydata.com/developers/terms-of-use&#34;&gt;Crunchy Data Developer Program&lt;/a&gt;）で提供されています。50名以上の組織では本番利用に有償サブスクリプションが必要になるため、注意が必要です。自前でイメージをビルドすれば回避できますが、手間がかかります。&lt;/p&gt;
&lt;h4 id=&#34;cloudnativepg&#34;&gt;CloudNativePG&lt;/h4&gt;
&lt;p&gt;EDBが開発を始め、現在はCNCF Sandboxプロジェクトになっています。Patroniに依存せず、独自のInstance Managerが各Pod内で動作し、Kubernetes APIを直接利用してリーダー選出やフェイルオーバーを行います。ライセンスもOperator・コンテナイメージともにApache 2.0で、制限なく利用できます。Star数も最も多く、コミュニティの勢いがあります。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Argo CDをインストールしてみた</title>
      <link>https://kkato.dev/posts/argocd/</link>
      <pubDate>Fri, 20 Feb 2026 11:00:00 +0900</pubDate>
      <guid>https://kkato.dev/posts/argocd/</guid>
      <description>&lt;p&gt;Argo CDはKubernetes向けのGitOpsツールで、Gitリポジトリに置いたマニフェストをクラスタに自動で反映してくれます。
今回はHelmを使ってArgo CDをインストールし、リポジトリの接続からApplicationの作成までを試してみました。&lt;/p&gt;
&lt;h3 id=&#34;argo-cdのインストール&#34;&gt;Argo CDのインストール&lt;/h3&gt;
&lt;p&gt;Helm Chartリポジトリを追加します。&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;helm repo add argo https://argoproj.github.io/argo-helm
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;argocd&lt;/code&gt; namespaceにインストールします。&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;helm install argocd argo/argo-cd &lt;span class=&#34;se&#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;se&#34;&gt;&lt;/span&gt;  --namespace argocd &lt;span class=&#34;se&#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;se&#34;&gt;&lt;/span&gt;  --create-namespace &lt;span class=&#34;se&#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;se&#34;&gt;&lt;/span&gt;  --version 7.8.13
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;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;kubectl get pods -n argocd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;argo-cd-uiにアクセスする&#34;&gt;Argo CD UIにアクセスする&lt;/h3&gt;
&lt;p&gt;port-forwardでArgo CDのUIにアクセスできます。&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 port-forward svc/argocd-server -n argocd 8080:443
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ブラウザで &lt;code&gt;http://localhost:8080&lt;/code&gt; にアクセスします。&lt;/p&gt;
&lt;p&gt;初期パスワードは以下のコマンドで取得できます。ユーザー名は&lt;code&gt;admin&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl -n argocd get secret argocd-initial-admin-secret -o &lt;span class=&#34;nv&#34;&gt;jsonpath&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;{.data.password}&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; base64 -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://kkato.dev/images/argocd/login.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;gitリポジトリを接続する&#34;&gt;Gitリポジトリを接続する&lt;/h3&gt;
&lt;p&gt;Argo CDがGitリポジトリからマニフェストを取得するために、リポジトリの接続設定が必要です。&lt;/p&gt;
&lt;h4 id=&#34;ssh鍵の作成&#34;&gt;SSH鍵の作成&lt;/h4&gt;
&lt;p&gt;Argo CD専用のSSH鍵を作成します。&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;ssh-keygen -t ed25519 -f ~/.ssh/argocd -C &lt;span class=&#34;s2&#34;&gt;&amp;#34;argocd&amp;#34;&lt;/span&gt; -N &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;githubにdeploy-keyを登録&#34;&gt;GitHubにDeploy Keyを登録&lt;/h4&gt;
&lt;p&gt;生成した公開鍵をリポジトリのDeploy Keyとして登録します。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetesをv1.30からv1.31にアップグレードした</title>
      <link>https://kkato.dev/posts/k8s-upgrade/</link>
      <pubDate>Sat, 24 Jan 2026 20:11:09 +0900</pubDate>
      <guid>https://kkato.dev/posts/k8s-upgrade/</guid>
      <description>&lt;p&gt;自宅で運用しているKubernetesクラスターをv1.30からv1.31にアップグレードしました。
kubeadmを使った標準的なアップグレード手順ですが、忘れがちなので備忘録として残しておきます。&lt;/p&gt;
&lt;p&gt;公式ドキュメント: &lt;a href=&#34;https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/&#34;&gt;https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;コントロールプレーンノードのアップグレード&#34;&gt;コントロールプレーンノードのアップグレード&lt;/h3&gt;
&lt;p&gt;コントロールプレーンノードから順番にアップグレードしていきます。&lt;/p&gt;
&lt;h4 id=&#34;パッケージリポジトリの変更&#34;&gt;パッケージリポジトリの変更&lt;/h4&gt;
&lt;p&gt;まず、yumリポジトリの設定ファイルをv1.31用に変更します。&lt;/p&gt;
&lt;p&gt;変更前（v1.30）:&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;o&#34;&gt;[&lt;/span&gt;kkato@nuc01 ~&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;$ cat /etc/yum.repos.d/kubernetes.repo
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;kubernetes&lt;span class=&#34;o&#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;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Kubernetes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;baseurl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;enabled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&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;nv&#34;&gt;gpgcheck&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&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;nv&#34;&gt;gpgkey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;exclude&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;kubelet kubeadm kubectl cri-tools kubernetes-cni
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;変更後（v1.31）:&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;$ cat /etc/yum.repos.d/kubernetes.repo
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;kubernetes&lt;span class=&#34;o&#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;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Kubernetes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;baseurl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;enabled&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&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;nv&#34;&gt;gpgcheck&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&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;nv&#34;&gt;gpgkey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;exclude&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;kubelet kubeadm kubectl cri-tools kubernetes-cni
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考: &lt;a href=&#34;https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/change-package-repository/&#34;&gt;https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/change-package-repository/&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;kubeadmのアップグレード&#34;&gt;kubeadmのアップグレード&lt;/h4&gt;
&lt;p&gt;まずkubeadmパッケージをアップグレードします。&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;sudo yum upgrade kubeadm --setopt&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;disable_excludes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;kubernetes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;sudo kubeadm upgrade plan
&lt;/span&gt;&lt;/span&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;Components that must be upgraded manually after you have upgraded the control plane with &lt;span class=&#34;s1&#34;&gt;&amp;#39;kubeadm upgrade apply&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT   NODE      CURRENT   TARGET
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubelet     nuc01     v1.30.1   v1.31.14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubelet     nuc02     v1.30.1   v1.31.14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubelet     nuc03     v1.30.1   v1.31.14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubelet     nuc04     v1.30.1   v1.31.14
&lt;/span&gt;&lt;/span&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;Upgrade to the latest stable version:
&lt;/span&gt;&lt;/span&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;COMPONENT                 NODE      CURRENT    TARGET
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kube-apiserver            nuc01     v1.30.4    v1.31.14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kube-controller-manager   nuc01     v1.30.4    v1.31.14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kube-scheduler            nuc01     v1.30.4    v1.31.14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kube-proxy                          1.30.4     v1.31.14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CoreDNS                             v1.11.1    v1.11.3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;etcd                      nuc01     3.5.12-0   3.5.24-0
&lt;/span&gt;&lt;/span&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;You can now apply the upgrade by executing the following command:
&lt;/span&gt;&lt;/span&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;        kubeadm upgrade apply v1.31.14
&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>Helmコマンド まとめ</title>
      <link>https://kkato.dev/posts/helm-command/</link>
      <pubDate>Sat, 27 Dec 2025 09:37:48 +0900</pubDate>
      <guid>https://kkato.dev/posts/helm-command/</guid>
      <description>&lt;p&gt;HelmはKubernetes向けのパッケージマネージャーで、複雑なアプリケーションのデプロイを簡単にしてくれるツールです。
Helmコマンドをよく忘れてしまうので、基本的なコマンドを備忘録としてまとめました。&lt;/p&gt;
&lt;h4 id=&#34;リポジトリの追加&#34;&gt;リポジトリの追加&lt;/h4&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;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;helm repo add stable https://charts.helm.sh/stable
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm repo add bitnami https://charts.bitnami.com/bitnami
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;リポジトリの一覧表示&#34;&gt;リポジトリの一覧表示&lt;/h4&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;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;helm repo list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;リポジトリの更新&#34;&gt;リポジトリの更新&lt;/h4&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;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;helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;チャートの検索&#34;&gt;チャートの検索&lt;/h4&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;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;helm search repo nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm search repo mysql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;チャート情報の表示&#34;&gt;チャート情報の表示&lt;/h4&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;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;helm show chart bitnami/nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm show values bitnami/nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;インストール&#34;&gt;インストール&lt;/h4&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;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;helm install my-nginx bitnami/nginx
&lt;/span&gt;&lt;/span&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;&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;helm install my-nginx bitnami/nginx -n production --create-namespace
&lt;/span&gt;&lt;/span&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;&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;helm install my-nginx bitnami/nginx --set service.type&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;LoadBalancer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;リリース一覧の表示&#34;&gt;リリース一覧の表示&lt;/h4&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;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;helm list
&lt;/span&gt;&lt;/span&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;&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;helm list -A
&lt;/span&gt;&lt;/span&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;&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;helm list -n production
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;リリース情報の確認&#34;&gt;リリース情報の確認&lt;/h4&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;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;helm get all my-nginx
&lt;/span&gt;&lt;/span&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;&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;helm get values my-nginx
&lt;/span&gt;&lt;/span&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;&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;helm &lt;span class=&#34;nb&#34;&gt;history&lt;/span&gt; my-nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;アップグレード&#34;&gt;アップグレード&lt;/h4&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;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;helm upgrade my-nginx bitnami/nginx
&lt;/span&gt;&lt;/span&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;&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;helm upgrade my-nginx bitnami/nginx --set image.tag&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1.21.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;ロールバック&#34;&gt;ロールバック&lt;/h4&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;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;helm rollback my-nginx
&lt;/span&gt;&lt;/span&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;&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;helm rollback my-nginx &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;アンインストール&#34;&gt;アンインストール&lt;/h4&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;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;helm uninstall my-nginx
&lt;/span&gt;&lt;/span&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;&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;helm uninstall my-nginx -n production
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;ドライラン&#34;&gt;ドライラン&lt;/h4&gt;
&lt;p&gt;実際にはインストールせずに、何が実行されるかを確認できます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>kubectlで全てのリソースをgetする方法</title>
      <link>https://kkato.dev/posts/kubectl-get-all/</link>
      <pubDate>Mon, 11 Aug 2025 13:02:00 +0900</pubDate>
      <guid>https://kkato.dev/posts/kubectl-get-all/</guid>
      <description>&lt;p&gt;&lt;code&gt;kubectl get all&lt;/code&gt;だとCustom Resourceが表示されないので、全てのリソースが表示できずに困ることがありました。&lt;code&gt;kubectl api-resources&lt;/code&gt;を使えば、Custom Resourceを含めた全てのリソースを表示することができます。&lt;/p&gt;
&lt;h3 id=&#34;全てのリソースを表示する&#34;&gt;全てのリソースを表示する&lt;/h3&gt;
&lt;p&gt;以下のコマンドで、特定のnamespaceに存在する、全てのリソース(Custom Resourceも含めて)を表示することができます。&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 get &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;kubectl api-resources --verbs&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;list --namespaced -o name &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -v &lt;span class=&#34;s2&#34;&gt;&amp;#34;events&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; tr &lt;span class=&#34;s1&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;,&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/,$//&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; -n openebs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubectl api-resources&lt;/code&gt;: クラスター内のCustom Resourceを含む全てのKubernetesリソース名を表示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--verbs=list&lt;/code&gt;: list操作が可能なものに絞る&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--namespaced&lt;/code&gt;: 名前空間に属するリソース名に絞る (NamespaceやNodeなどのcluster-scopedリソースは対象外)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-o name&lt;/code&gt;: kubectlでgetできるリソース名だけを出力&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep -v &amp;quot;events&amp;quot;&lt;/code&gt;: eventsリソースは大量に出力されてしまうため、除外する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tr &#39;\n&#39; &#39;,&#39;&lt;/code&gt;: 出力されたリソース名を、改行区切りからカンマ区切りに変換&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sed &#39;s/,$//&#39;&lt;/code&gt;: 末尾に付いてしまった余分なカンマを削除&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>kubectlとjqコマンドの便利な組み合わせ</title>
      <link>https://kkato.dev/posts/kubectl-jq/</link>
      <pubDate>Sun, 10 Aug 2025 19:52:30 +0900</pubDate>
      <guid>https://kkato.dev/posts/kubectl-jq/</guid>
      <description>&lt;p&gt;jqコマンドとは、JSON形式のデータを処理・変換するためのコマンドです。
普段はkubectlやAWS CLIと組み合わせて使うことが多いのですが、使い方やオプションをきちんと調べたことがなかったため、改めておさらいしようと思います。&lt;/p&gt;
&lt;h3 id=&#34;keys関数&#34;&gt;keys関数&lt;/h3&gt;
&lt;p&gt;これまでは&lt;code&gt;jq &#39;.&#39;&lt;/code&gt;のように全階層をまとめて表示してキーを把握していましたが、keys関数を使うと一階層ずつキーを表示できます。&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;c1&#34;&gt;# labelのキーを取得する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get pod my-pod -o json &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq &lt;span class=&#34;s1&#34;&gt;&amp;#39;.metadata.labels | keys&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;select関数&#34;&gt;select関数&lt;/h3&gt;
&lt;p&gt;select関数は条件にマッチした項目のみを抽出します。&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;c1&#34;&gt;# Running状態ではないPodの一覧を取得する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get pods -A -o json &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq &lt;span class=&#34;s1&#34;&gt;&amp;#39;.items[] | select(.status.phase != &amp;#34;Running&amp;#34;) | .metadata.name&amp;#39;&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# namespace、Pod名、Podの状態も合わせて表示する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get pods -A -o json &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq -r &lt;span class=&#34;s1&#34;&gt;&amp;#39;.items[] | select(.status.phase != &amp;#34;Running&amp;#34;) | &amp;#34;\(.metadata.namespace) \(.metadata.name) \(.status.phase)&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; column -t
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2つ目のコマンドではいくつかのオプションや機能を使っているため、それらについて説明します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-r&lt;/code&gt;: ダブルクォートを削除するオプション(デフォルトでは&lt;code&gt;&amp;quot;&lt;/code&gt;が付いてくる)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;\(filter)&amp;quot;&lt;/code&gt;: 文字列の中で &lt;code&gt;\(filter)&lt;/code&gt; を使うことで、抽出した値を文字列に埋め込める。これにより、複数の値を空白区切りで1行に表示できる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;columnt -t&lt;/code&gt;: columnコマンドの&lt;code&gt;-t&lt;/code&gt;オプションを使うことで、区切り文字を基準に列を揃えて表形式で表示できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;contains関数&#34;&gt;contains関数&lt;/h3&gt;
&lt;p&gt;contains関数は指定した文字列が含まれていればtrueを返します。&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;c1&#34;&gt;# コンテナ名に&amp;#39;ghr.io&amp;#39;を含むPodを検索する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get pods -o json &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq &lt;span class=&#34;s1&#34;&gt;&amp;#39;.items[] | select(.spec.containers[].name | contains(&amp;#34;gcr.io&amp;#34;)) | .metadata.name&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;kubectl と jq の組み合わせは業務でよく使っていたものの、正直ちゃんと理解できていなかった部分も多かったので、今回改めておさらいできてよかったです。
特に keys や select、contains などの関数を使うと、複雑な JSON から必要な情報をサクッと抜き出せるのが便利だなと感じました。&lt;/p&gt;</description>
    </item>
    <item>
      <title>NUC上にk8sクラスタを構築する</title>
      <link>https://kkato.dev/posts/nuc-k8s/</link>
      <pubDate>Wed, 05 Jun 2024 21:20:47 +0900</pubDate>
      <guid>https://kkato.dev/posts/nuc-k8s/</guid>
      <description>&lt;p&gt;しばらく放置していたNUC上にk8sをインストールして、おうちクラスタを運用していこうと思います。
今回はkubeadmを使ってk8sをインストールしようと思います。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://kkato.dev/images/nuc-k8s/nuc.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;前提&#34;&gt;前提&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ベアメタル(Intel NUC11PAHi5)上に構築&lt;/li&gt;
&lt;li&gt;Control Planex1台とWorkerx3台の4台構成&lt;/li&gt;
&lt;li&gt;OSはRocky Linux9.3&lt;/li&gt;
&lt;li&gt;ルーター側の設定で固定IPを割り当て&lt;/li&gt;
&lt;li&gt;各ノードのスペックは以下&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;CPU&lt;/th&gt;
          &lt;th&gt;メモリ&lt;/th&gt;
          &lt;th&gt;ストレージ&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;4コア&lt;/td&gt;
          &lt;td&gt;16GB&lt;/td&gt;
          &lt;td&gt;500GB&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;kubeadmのインストール&#34;&gt;kubeadmのインストール&lt;/h3&gt;
&lt;p&gt;以下の手順を参考にします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/&#34;&gt;kubeadmのインストール&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「始める前に」にSwapがオフであること、と記載がありますが、swapがオフになっていなかったので無効化します。&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;sudo swapoff -a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;ポートの開放&#34;&gt;ポートの開放&lt;/h4&gt;
&lt;p&gt;kubernetesのコンポーネントが互いに通信するために、&lt;a href=&#34;https://kubernetes.io/docs/reference/networking/ports-and-protocols/&#34;&gt;これらのポート&lt;/a&gt;を開く必要があります。
RockyはRHEL系なので&lt;code&gt;firewall-cmd&lt;/code&gt;を使って、Control Planeノードのポートを開放します。&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;sudo firewall-cmd --add-port=6443/tcp --permanent
&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;go&#34;&gt;sudo firewall-cmd --add-port=2379-2380/tcp --permanent
&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;go&#34;&gt;sudo firewall-cmd --add-port=10250/tcp --permanent
&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;go&#34;&gt;sudo firewall-cmd --add-port=10257/tcp --permanent
&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;go&#34;&gt;sudo firewall-cmd --add-port=10259/tcp --permanent
&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;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;sudo firewall-cmd --reload
&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;go&#34;&gt;sudo firewall-cmd --list-ports
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;続いて各Workerノードのポートを開放します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-coonsole&#34; data-lang=&#34;coonsole&#34;&gt;sudo firewall-cmd --add-port=30000-32767/tcp --permanent
sudo firewall-cmd --add-port=10250/tcp --permanent
&lt;/code&gt;&lt;/pre&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;sudo firewall-cmd --reload
&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;go&#34;&gt;sudo firewall-cmd --list-ports
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;コンテナランタイムのインストール&#34;&gt;コンテナランタイムのインストール&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/&#34;&gt;コンテナランタイム&lt;/a&gt;の手順を参考に、各ノードに設定をしていきます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Alertmanagerのwebhookを試してみる</title>
      <link>https://kkato.dev/posts/webhook-nginx/</link>
      <pubDate>Sun, 13 Aug 2023 13:11:42 +0900</pubDate>
      <guid>https://kkato.dev/posts/webhook-nginx/</guid>
      <description>&lt;p&gt;Kubernetes上でAlertmanagerがちゃんと通知できるか、どんな内容が通知されているのか確認してみようとすると、連携するためのSlackが必要であったり、Emailを送信するにもメールサーバが必要だったりと、意外と気軽に試せないということがありました。&lt;/p&gt;
&lt;p&gt;なので、今回はwebhookの機能を使ってNginxにリクエストを飛ばし、リクエストの内容をログから確認してみようと思います。&lt;/p&gt;
&lt;h3 id=&#34;webhookとは&#34;&gt;webhookとは?&lt;/h3&gt;
&lt;p&gt;Alertmanagerのreceiverには以下が指定できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.atlassian.com/software/opsgenie&#34;&gt;Opesgenie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.pagerduty.com/&#34;&gt;PagerDuty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pushover.net/&#34;&gt;Pushover&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://slack.com/intl/ja-jp&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/jp/sns/&#34;&gt;AWS SNS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.splunk.com/en_us/about-splunk/acquisitions/splunk-on-call.html&#34;&gt;VictorOps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Webhook&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.wechat.com/ja/&#34;&gt;Wechat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://telegram.org/&#34;&gt;Telegram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.webex.com/ja/index.html&#34;&gt;Webex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Webhookとは特定のエンドポイントに対してHTTP POSTリクエストでアラートの情報を送信するというものです。
外部サービスではないので、自分自身でエンドポイントを用意し、自分自身で後続の処理を実装する必要があります。&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-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;receivers&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;s2&#34;&gt;&amp;#34;nginx&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;webhook_configs&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;url&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;s1&#34;&gt;&amp;#39;http://nginx-svc.default:8080/&amp;#39;&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;h3 id=&#34;webhookの連携先としてnginxを使う&#34;&gt;webhookの連携先としてnginxを使う&lt;/h3&gt;
&lt;p&gt;今回はwebhookの連携先としてnginxを使用します。&lt;/p&gt;
&lt;p&gt;nginxを使って実現したいことは以下のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エンドポイントを用意する&lt;/li&gt;
&lt;li&gt;リクエスト内容を確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;nginx.confの初期設定をベースにしていますが、そのままだとリクエスト内容を確認することができないので、設定を追加しました。
&lt;code&gt;log_format&lt;/code&gt;で&lt;code&gt;$request_body&lt;/code&gt;を指定し、&lt;code&gt;/&lt;/code&gt;にアクセスした時に&lt;code&gt;$request_body&lt;/code&gt;がログとして標準出力に出るように設定しています。&lt;/p&gt;
&lt;p&gt;しかし、&lt;code&gt;$request_body&lt;/code&gt;を有効化するには&lt;code&gt;proxy_pass&lt;/code&gt;などの後続処理が必要になります。なので、&lt;code&gt;proxy_pass&lt;/code&gt;で&lt;code&gt;/trash&lt;/code&gt;というエンドポイントにリクエストを転送し、&lt;code&gt;/trash&lt;/code&gt;で特に意味のない処理(1x1ピクセルのgifを返す)をしています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The variable’s value is made available in locations processed by the proxy_pass, fastcgi_pass, uwsgi_pass, and scgi_pass directives when the request body was read to a memory buffer.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body&#34;&gt;http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_body&lt;/a&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-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;user&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;nginx&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;k&#34;&gt;worker_processes&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;auto&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;error_log&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;/var/log/nginx/error.log&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;notice&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;k&#34;&gt;pid&lt;/span&gt;        &lt;span class=&#34;s&#34;&gt;/var/run/nginx.pid&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&gt;&lt;/span&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;&lt;span class=&#34;k&#34;&gt;events&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;kn&#34;&gt;worker_connections&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;1024&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&gt;&lt;/span&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;&lt;span class=&#34;k&#34;&gt;http&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;kn&#34;&gt;include&lt;/span&gt;       &lt;span class=&#34;s&#34;&gt;/etc/nginx/mime.types&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;kn&#34;&gt;default_type&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;application/octet-stream&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;log_format&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;main&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$remote_user&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$time_local]&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$request&amp;#34;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#39;&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;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$status&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$body_bytes_sent&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$http_referer&amp;#34;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#39;&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;#39;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$http_user_agent&amp;#34;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$http_x_forwarded_for&amp;#34;&amp;#39;&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;access_log&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;/var/log/nginx/access.log&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;main&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &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;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kn&#34;&gt;log_format&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;postdata&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;escape=none&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$request_body&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;server&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;kn&#34;&gt;listen&lt;/span&gt;   &lt;span class=&#34;mi&#34;&gt;8080&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;kn&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#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;kn&#34;&gt;access_log&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/dev/stdout&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;postdata&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;kn&#34;&gt;proxy_pass&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;http://127.0.0.1:8080/trash&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;kn&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/trash&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;kn&#34;&gt;access_log&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;off&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;kn&#34;&gt;empty_gif&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;kn&#34;&gt;break&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &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;&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;    &lt;span class=&#34;kn&#34;&gt;sendfile&lt;/span&gt;        &lt;span class=&#34;no&#34;&gt;on&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;c1&#34;&gt;#tcp_nopush     on;
&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;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;    &lt;span class=&#34;kn&#34;&gt;keepalive_timeout&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;65&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#gzip  on;
&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;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;    &lt;span class=&#34;kn&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/etc/nginx/conf.d/*.conf&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の設定をConfigMapとして作成し、nginxのPodに対してConfigMapをマウントしてあげます。&lt;code&gt;nginx-svc&lt;/code&gt;というServiceも作成します。&lt;/p&gt;</description>
    </item>
    <item>
      <title>KubernetesのCronJobが失敗したときにアラートをあげる</title>
      <link>https://kkato.dev/posts/k8s-job-alert/</link>
      <pubDate>Tue, 08 Aug 2023 19:48:39 +0900</pubDate>
      <guid>https://kkato.dev/posts/k8s-job-alert/</guid>
      <description>&lt;p&gt;CronJobは、指定したcronフォーマットに基づいて定期的にJobを実行するという機能です。
主にバックアップの取得やメール送信など、定期的な処理を実行する際に便利です。&lt;/p&gt;
&lt;p&gt;一方で、CronJobが失敗した際にどのように検知すべきかについては、あまり情報がありませんでした。
なので、今回はそちらについて考えてみたいと思います。&lt;/p&gt;
&lt;h3 id=&#34;kube-state-metricsを活用する&#34;&gt;kube-state-metricsを活用する&lt;/h3&gt;
&lt;p&gt;kube-state-metricsとはKubernetesクラスタ内のリソースの状態をメトリクスとして提供してくれるというものです。
kube-state-metricsではCronJobやJobの状態をメトリクスとして取得することができます。
この方式採用している記事が多かったので、こちらで検討を進めてみたいと思います。&lt;/p&gt;
&lt;p&gt;※記事&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/@tristan_96324/prometheus-k8s-cronjob-alerts-94bee7b90511&#34;&gt;https://medium.com/@tristan_96324/prometheus-k8s-cronjob-alerts-94bee7b90511&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.giffgaff.io/tech/monitoring-kubernetes-jobs&#34;&gt;https://www.giffgaff.io/tech/monitoring-kubernetes-jobs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;どのメトリクスを使い監視するか&#34;&gt;どのメトリクスを使い監視するか&lt;/h3&gt;
&lt;p&gt;CronJobはcronフォーマットで指定された時刻にJobを生成し、そのJobがPodを生成するという3層の親子構造になっています。
また、CronJobとJobの関係は1対多で、JobとPodの関係は1対多になります。&lt;/p&gt;
&lt;p&gt;Jobが完了するのは&lt;code&gt;completions&lt;/code&gt;個のPodが正常終了した場合、もしくは&lt;code&gt;backoffLimit&lt;/code&gt;個のPodが異常終了した場合に限ります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;completions
&lt;ul&gt;
&lt;li&gt;completions個のPodが成功すると、Jobが完了したとみなされる&lt;/li&gt;
&lt;li&gt;デフォルトは1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;backoffLimit
&lt;ul&gt;
&lt;li&gt;失敗したと判断するまでの再試行回数で、この回数を超えるとJobは失敗とみなされる&lt;/li&gt;
&lt;li&gt;デフォルトは6&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そして、アラートを上げたいのはJobが失敗した時です。言い換えると、&lt;code&gt;backoffLimit&lt;/code&gt;個のPodが異常終了したときにアラートを上げるということになります。
何個のPodが異常終了したのか監視することも可能だと思いますが、ここではJobのステータスを監視するのが適切かと思います。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;メトリクス&lt;/th&gt;
          &lt;th&gt;対応する項目&lt;/th&gt;
          &lt;th&gt;説明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;kube_job_status_succeeded&lt;/td&gt;
          &lt;td&gt;.status.succeeded&lt;/td&gt;
          &lt;td&gt;Jobの管理下で正常終了したPodの数&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kube_job_status_failed&lt;/td&gt;
          &lt;td&gt;.status.failed&lt;/td&gt;
          &lt;td&gt;Jobの管理下で異常終了したPodの数&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kube_job_complete&lt;/td&gt;
          &lt;td&gt;.status.conditions.type&lt;/td&gt;
          &lt;td&gt;Jobが成功したかどうか&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kube_job_failed&lt;/td&gt;
          &lt;td&gt;.status.conditions.type&lt;/td&gt;
          &lt;td&gt;Jobが失敗したかどうか&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;参考: &lt;a href=&#34;https://github.com/kubernetes/kube-state-metrics/blob/main/docs/job-metrics.md&#34;&gt;https://github.com/kubernetes/kube-state-metrics/blob/main/docs/job-metrics.md&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Jobに関するメトリクスは複数ありますが、この中でも特に&lt;code&gt;kube_job_failed&lt;/code&gt;を使ってアラートを上げるのが良さそうです。
以下の設定だと、Jobが失敗したときにアラートが上がります。&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_job_failed &amp;gt; 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;アラートが発火し続けてしまう問題&#34;&gt;アラートが発火し続けてしまう問題&lt;/h3&gt;
&lt;p&gt;失敗したJobは削除されずに残り続けるので、アラートが発火し続けてしまいます。
なので、Jobの&lt;code&gt;ttlSecondsAfterFinished&lt;/code&gt;を設定し、数分後にJobが削除されるようにします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ttlSecondsAfterFinished
&lt;ul&gt;
&lt;li&gt;指定秒後にJobを削除できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CronJobの&lt;code&gt;failedJobsHistoryLimit&lt;/code&gt;を設定するという方法も思いつきましたが、0にしてしまうとそもそもアラートが上がらないと思うので、こちらは1のままにしておきました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;failedJobsHistoryLimit
&lt;ul&gt;
&lt;li&gt;失敗したJobを指定個数分残しておける&lt;/li&gt;
&lt;li&gt;デフォルトは1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;
&lt;p&gt;今回はkube-state-metricsを活用して、CronJobが失敗した時のアラートを設定しました。CronJob失敗時にアラートを上げる方法についてはあまり参考になる記事がなく、私なりに考えてみました。他にもっといい方法をご存知の方は教えていただけるとありがたいです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>kubesprayでk8sクラスタを構築する</title>
      <link>https://kkato.dev/posts/kubespray/</link>
      <pubDate>Mon, 01 May 2023 10:07:31 +0900</pubDate>
      <guid>https://kkato.dev/posts/kubespray/</guid>
      <description>&lt;p&gt;k8s構築ツールはいろいろありますが、公式ドキュメントでは以下が紹介されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/ja/docs/setup/learning-environment/&#34;&gt;学習環境&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Minikube&lt;/li&gt;
&lt;li&gt;Kind&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/ja/docs/setup/production-environment/&#34;&gt;プロダクション環境&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;kubeadm&lt;/li&gt;
&lt;li&gt;kops&lt;/li&gt;
&lt;li&gt;kubespray&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;※各ツールの違いについては&lt;a href=&#34;https://github.com/kubernetes-sigs/kubespray/blob/master/docs/comparisons.md&#34;&gt;こちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今回はその中でも&lt;a href=&#34;https://github.com/kubernetes-sigs/kubespray&#34;&gt;kubespray&lt;/a&gt;というツールを使ってk8sクラスタを構築してみようと思います。kubeadmは1台ずつインストールを実施するのに対し、kubesprayはAnsibleを使い、各ノードで一斉にインストールを実施します。なので、kubesprayは台数が多いときに便利です。&lt;/p&gt;
&lt;p&gt;ちなみに、kubesprayは内部でkubeadmを使っているので、kubespray = kubeadm + Ansibleという感じです。また、kubesprayを使うと、コンテナランタイム(デフォルトはcontainerd)やPod間通信のネットワークプラグイン(デフォルトはcalico)などが自動でインストールされるので、非常に便利です。&lt;/p&gt;
&lt;h3 id=&#34;構築&#34;&gt;構築&lt;/h3&gt;
&lt;p&gt;前提:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ベアメタル(Intel NUC11PAHi5)上に構築&lt;/li&gt;
&lt;li&gt;Control Planex1台とWorkerx3台の4台構成&lt;/li&gt;
&lt;li&gt;OSはRocky Linux9.1&lt;/li&gt;
&lt;li&gt;ルーター側の設定で固定IPを割り当て&lt;/li&gt;
&lt;li&gt;各ノードのスペックは以下&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;CPU&lt;/th&gt;
          &lt;th&gt;メモリ&lt;/th&gt;
          &lt;th&gt;ストレージ&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;4コア&lt;/td&gt;
          &lt;td&gt;16GB&lt;/td&gt;
          &lt;td&gt;500GB&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;ssh公開認証の設定&#34;&gt;ssh公開認証の設定&lt;/h4&gt;
&lt;p&gt;手元のPCからパスワードなしでssh接続できるように公開鍵認証の設定をします。
ssh-keygenのパスワードには空文字を指定します。&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kkato@bastion:~$ ssh-keygen
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kkato@bastion:~$ scp ~/.ssh/id_rsa.pub 192.168.10.xxx:~/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;公開鍵の情報を各ノードのauthorized_keysに追記します。&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kkato@nuc01:~$ mkdir ~/.ssh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kkato@nuc01:~$ chmod &lt;span class=&#34;m&#34;&gt;700&lt;/span&gt; /.ssh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kkato@nuc01:~$ cat id_rsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kkato@nuc01:~$ chmod &lt;span class=&#34;m&#34;&gt;600&lt;/span&gt; ~/.ssh/authorized_keys
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;etchostsの編集&#34;&gt;/etc/hostsの編集&lt;/h4&gt;
&lt;p&gt;手元のPCから各ノードへホスト名で接続できるように、/etc/hostsを編集します。&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kkato@bastion:~$ cat /etc/hosts
&lt;/span&gt;&lt;/span&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;192.168.10.121 nuc01
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;192.168.10.122 nuc02
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;192.168.10.123 nuc03
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;192.168.10.124 nuc04
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;ユーザーの設定&#34;&gt;ユーザーの設定&lt;/h4&gt;
&lt;p&gt;各ノードのユーザーがパスワードなしでsudo実行できるよう設定します。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Raspberry Pi上にk8sクラスタを構築する</title>
      <link>https://kkato.dev/posts/raspi-k8s/</link>
      <pubDate>Sun, 23 Apr 2023 16:13:42 +0900</pubDate>
      <guid>https://kkato.dev/posts/raspi-k8s/</guid>
      <description>&lt;p&gt;最近ラズパイを手に入れたので、kubeadmを使ってk8sクラスタを組んでみたいと思います。
Control Planeノードx1 Workerノードx3の構成です。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://kkato.dev/images/raspi-k8s/raspi-cluster.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;準備&#34;&gt;準備&lt;/h3&gt;
&lt;p&gt;準備したものは以下のとおりです。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;アイテム&lt;/th&gt;
          &lt;th&gt;個数&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://www.switch-science.com/products/5680&#34;&gt;Raspberry Pi 4 Model B / 4GB&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://www.switch-science.com/products/7172?_pos=1&amp;amp;_sid=e013ece27&amp;amp;_ss=r&#34;&gt;Raspberry Pi PoE+ HAT&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://amzn.asia/d/8DQ2Vjn&#34;&gt;ケース&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://amzn.asia/d/1a7lXpn&#34;&gt;microSD 64GB&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://amzn.asia/d/6lrvPog&#34;&gt;スイッチングハブ&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://amzn.asia/d/cSs0irO&#34;&gt;LANケーブル 0.15m&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;4&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://amzn.asia/d/0IejUmF&#34;&gt;LANケーブル 1m&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://amzn.asia/d/4oTN3E9&#34;&gt;SDカードリーダー&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://amzn.asia/d/a8TZ1OH&#34;&gt;HDMI変換アダプター&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;1&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PoE(Power over Ethernet)+ HATを使うと、LANケーブルから電源供給できるのでとても便利です。今回はPoE+ HATを使っているので、スイッチングハブもPoE対応のものを購入しています。ラズパイのOSをSDカードにインストールする必要があるので、SDカードリーダーも購入しました。あとは、ディスプレイと繋ぐときにmicro HDMIに変換するためのアダプタも購入しました。&lt;/p&gt;
&lt;h3 id=&#34;osの設定&#34;&gt;OSの設定&lt;/h3&gt;
&lt;h4 id=&#34;osのインストール&#34;&gt;OSのインストール&lt;/h4&gt;
&lt;p&gt;手元のPCはUbuntu 22.04 LTSなので、以下のコマンドでRaspberry Pi Imagerをインストールします。&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;$ sudo apt install rpi-imager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして、microSDカード4枚全てにUbuntu Server 22.10 (64-bit)を焼きます。&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;$ rpi-imager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://kkato.dev/images/raspi-k8s/raspi-imager.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;microSDカードを差し込み、ディスプレイ(micro HDMI)とキーボード(USB)を接続し、OSの初期設定を行います。初期ユーザー名とパスワードはubuntuです。パッケージを最新にしておきます。&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo spy update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo apt upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;新しくユーザを作成し、ユーザにsudo権限を付与します。sudoをパスワードなしでできるように追加の設定もします。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
