<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kubernetes on ゲンゾウ用ポストイット</title><link>https://genzouw.com/entry/category/kubernetes/</link><description>Recent content in Kubernetes on ゲンゾウ用ポストイット</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Sun, 07 May 2023 09:00:37 +0900</lastBuildDate><atom:link href="https://genzouw.com/entry/category/kubernetes/index.xml" rel="self" type="application/rss+xml"/><item><title>イメージのビルド高速化機構 Docker BuildKit、BuildX を理解していなかったので調べてみました</title><link>https://genzouw.com/entry/2021/07/17/100615/2724/</link><pubDate>Sat, 17 Jul 2021 10:06:15 +0900</pubDate><guid>https://genzouw.com/entry/2021/07/17/100615/2724/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;Dockerfile&lt;/code&gt; を作成した後は &lt;code&gt;docker build&lt;/code&gt; コマンドを使って Docker イメージをビルドします。&lt;/p&gt;&#10;&lt;p&gt;ある日を境に &lt;code&gt;docker build&lt;/code&gt; コマンド実行時のコンソールメッセージの表示が様変わりしたのですが、&#10;これは &lt;strong&gt;Docker (正確には僕のローカル PC で利用している Docker for Mac)&lt;/strong&gt; に &lt;strong&gt;BuildKit&lt;/strong&gt; と言われるものが導入されたためのようです。&lt;/p&gt;&#10;&lt;p&gt;この &lt;strong&gt;BuildKit&lt;/strong&gt; について理解していませんでしたので、調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 20.10.7, build f0df350&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="buildkit-とは"&gt;BuildKit とは？&lt;/h2&gt;&#10;&lt;p&gt;BuildKit は、 Docker の 18.06 から試験的に導入され、18.09 以降で正式に導入された機構になります。&lt;/p&gt;</description></item><item><title>YAMLの重複記述を減らしDRYを保つためにエイリアス機能を使う</title><link>https://genzouw.com/entry/2021/06/19/082626/2661/</link><pubDate>Sat, 19 Jun 2021 08:26:26 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/19/082626/2661/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;僕が YAML ファイルを触りだしたのは、Ansible を使い始めてからでした。&lt;/p&gt;&#10;&lt;p&gt;そこから &lt;strong&gt;Docker Composes&lt;/strong&gt; 、 &lt;strong&gt;Kubernetes&lt;/strong&gt; ともはや YAML を触ることがないシステムはない状況となりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS&lt;/strong&gt; や &lt;strong&gt;GCP&lt;/strong&gt; 、 &lt;strong&gt;Azure&lt;/strong&gt; といったクラウド環境でも YAML ファイルで設定するリソースは非常に多いですし、Rest API のインターフェイス定義として &lt;strong&gt;OpenAPI&lt;/strong&gt; を YAML で記述します。&lt;/p&gt;&#10;&lt;p&gt;YAML ファイルの重要性が高まるにつれて、ファイルの内容はどんどん肥大化する傾向にあります。&#10;同時に 1 つの YAML ファイルの中に記述する内容が重複することも多く（Kubernetes マニフェストのラベル名など）、なんとか &lt;strong&gt;DRY&lt;/strong&gt; に記述できないかと悩むことがあります。&lt;/p&gt;&#10;&lt;h2 id="重複記述を回避するために-エイリアス-を使う"&gt;重複記述を回避するために &amp;ldquo;エイリアス&amp;rdquo; を使う&lt;/h2&gt;&#10;&lt;p&gt;そこで有効なのが YAML の標準機能として提供されている &lt;strong&gt;エイリアス&lt;/strong&gt; 機能です。&lt;/p&gt;&#10;&lt;p&gt;現在担当してるシステムのローカル開発環境は &lt;strong&gt;Docker Compose&lt;/strong&gt; を使って構築していますが、エイリアス機能を使って &lt;code&gt;docker-compose.yaml&lt;/code&gt; ファイルの簡素化を行っています。&lt;/p&gt;&#10;&lt;p&gt;それでは、エイリアス機能について見ていきましょう。&lt;/p&gt;&#10;&lt;h2 id="エイリアス別名機能とは"&gt;エイリアス(別名)機能とは？&lt;/h2&gt;&#10;&lt;p&gt;YAML のエイリアス機能とは、 &lt;strong&gt;単一の値&lt;/strong&gt; か &lt;strong&gt;ブロック(YAML のツリー構造)&lt;/strong&gt; のどちらかに名前をつけて、あとから参照するための仕組みになります。&lt;/p&gt;&#10;&lt;h2 id="エイリアス機能を利用した例"&gt;エイリアス機能を利用した例&lt;/h2&gt;&#10;&lt;h3 id="値にエイリアスを設定し参照する"&gt;値にエイリアスを設定し、参照する&lt;/h3&gt;&#10;&lt;p&gt;値に名前をつけるというのが最もシンプルな使い方です。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;&amp;amp;エイリアス名&lt;/code&gt; で名前をつけ、 &lt;code&gt;*エイリアス名&lt;/code&gt; で値を参照します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;&amp;amp;hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;world&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;#39;hello&amp;#39; という文字列となります&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;new_greeting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;room&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;#39;hello&amp;#39; という文字列となります&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;正しく値が参照できているかを確認するために、 &lt;a href="https://github.com/mikefarah/yq"&gt;yq&lt;/a&gt; というコマンドラインから YAML ファイルを操作するツールを使ってみます。&lt;/p&gt;</description></item><item><title>Docker Container Registryサーバーを自前で作成してみる</title><link>https://genzouw.com/entry/2021/06/14/072906/2656/</link><pubDate>Mon, 14 Jun 2021 07:29:06 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/14/072906/2656/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;&amp;ldquo;Docker Hub&amp;rdquo;&lt;/strong&gt; や &lt;strong&gt;GCR&lt;/strong&gt; 、 &lt;strong&gt;ECR&lt;/strong&gt; といったサービスがあるなか、&#10;わざわざ自前で &amp;ldquo;Docker Registry&amp;rdquo; を構築して Docker イメージを管理する必要性は少ないとは思いますが、仕組みを理解する目的で、自作の Docker Registry 環境を構築してみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="作業の流れ作業ログ"&gt;作業の流れ（作業ログ）&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Docker Registry サーバを立ち上げ&lt;/li&gt;&#10;&lt;li&gt;Docker Registry サーバに外部から接続するための設定を追加&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;前提として、今回は最もかんたんな方法で Docker Registry サーバを立ち上げたいと思います。&lt;/p&gt;&#10;&lt;p&gt;その方法とは、 「すでに公開されている Docker Registry サーバ用の Docker イメージを利用する」というものです。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Docker イメージを管理するためのサーバを Docker で立ち上げる、というのが面白いですね。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;そんなわけで、Docker を事前にインストールしておきましょう。&#10;Windows や Mac で動作させる最もかんたんな方法は以下のツールを導入することです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.docker.com/products/docker-desktop"&gt;Docker Desktop for Mac and Windows | Docker&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="1-docker-registry-サーバを立ち上げ"&gt;1. Docker Registry サーバを立ち上げ&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;registry:2.7.1&lt;/strong&gt; というイメージを利用したいと思います。&lt;/p&gt;</description></item><item><title>GKEのNEG(Network Endpoint Group)とIG(Instance Group)との違い、メリットを整理しました</title><link>https://genzouw.com/entry/2021/05/20/160245/2613/</link><pubDate>Thu, 20 May 2021 16:02:45 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/20/160245/2613/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;GCP の Cloud Armor について調べていたところ、ドキュメントに出てきた &lt;strong&gt;NEG&lt;/strong&gt; という単語。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;「VM インスタンスや NEG に対して WAF 機能を提供する」&lt;/em&gt;、とありましたが、&lt;strong&gt;NEG&lt;/strong&gt; とはなんだろう？となってしまったため、 &lt;strong&gt;NEG&lt;/strong&gt; について調べました。&lt;/p&gt;&#10;&lt;h2 id="neg-とは"&gt;NEG とは？&lt;/h2&gt;&#10;&lt;p&gt;NEG についての記載があるページを参考にさせていただきました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://medium.com/google-cloud-jp/neg-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B-cc1e2bbc979e"&gt;NEG とは何か. はじめに | by Yuki Furuyama | google-cloud-jp | Medium&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Network Endpoint ( &lt;strong&gt;NE&lt;/strong&gt; ) は Kubernetes の &lt;strong&gt;Pod&lt;/strong&gt; に相当する&lt;/li&gt;&#10;&lt;li&gt;Network Endpoint を複数まとめたグループが Network Endpoint Group ( &lt;strong&gt;NEG&lt;/strong&gt; ) であり、Kubernetes の &lt;strong&gt;Service&lt;/strong&gt; に相当する&lt;/li&gt;&#10;&lt;li&gt;NEG を使うことで Kubernetes の Pod と Service を GCP 側で第一級市民として扱えるようになる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;視覚化すると以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= GCP =====================================&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------+ +-------+ +---+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |Load Balancer| ----&amp;gt; |NEG | ----&amp;gt; |NE |+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------+ +-------+ +---+|+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ^ ^ +---+|&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | +---+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | ^&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= GKE =|===================|=============|=&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +------------------+ +-------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |Ingress Controller| |NEG Controller |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +------------------+ +-------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------+ +-------+ +---+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |Ingress | ----&amp;gt; |Service| ----&amp;gt; |Pod|+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------+ +-------+ +---+|+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---+|&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;GKE&lt;/strong&gt; 上のリソースとして &lt;strong&gt;Ingress&lt;/strong&gt; 、 &lt;strong&gt;Service&lt;/strong&gt; 、 &lt;strong&gt;Pod&lt;/strong&gt; がありますが、 GCP 上にも対になるリソースが生成されます。&#10;&lt;strong&gt;NE&lt;/strong&gt; は　 Pod に割り当てられている &lt;strong&gt;IP + Port&lt;/strong&gt; のセットで一意となる GCP リソースです。&lt;/p&gt;</description></item><item><title>Kubernetes Podの"command"や"args"で環境変数を参照する方法いろいろ</title><link>https://genzouw.com/entry/2021/01/19/213038/2118/</link><pubDate>Tue, 19 Jan 2021 21:30:38 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/19/213038/2118/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;KubernetesでPod（もしくはReplicaSet、Deployment）のマニフェストにて、 &lt;strong&gt;command&lt;/strong&gt; や &lt;strong&gt;args&lt;/strong&gt; 属性を使って実行コマンドを指定する事ができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;command&lt;/strong&gt; や &lt;strong&gt;args&lt;/strong&gt; に指定する実行コマンドで環境変数を利用する場合の注意点と対処法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client Version: version.Info&lt;span class="o"&gt;{&lt;/span&gt;Major:&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, Minor:&lt;span class="s2"&gt;&amp;#34;19&amp;#34;&lt;/span&gt;, GitVersion:&lt;span class="s2"&gt;&amp;#34;v1.19.4&amp;#34;&lt;/span&gt;, GitCommit:&lt;span class="s2"&gt;&amp;#34;d360454c9bcd1634cf4cc52d1867af5491dc9c5f&amp;#34;&lt;/span&gt;, GitTreeState:&lt;span class="s2"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;, BuildDate:&lt;span class="s2"&gt;&amp;#34;2020-11-12T01:09:16Z&amp;#34;&lt;/span&gt;, GoVersion:&lt;span class="s2"&gt;&amp;#34;go1.15.4&amp;#34;&lt;/span&gt;, Compiler:&lt;span class="s2"&gt;&amp;#34;gc&amp;#34;&lt;/span&gt;, Platform:&lt;span class="s2"&gt;&amp;#34;darwin/amd64&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server Version: version.Info&lt;span class="o"&gt;{&lt;/span&gt;Major:&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, Minor:&lt;span class="s2"&gt;&amp;#34;16+&amp;#34;&lt;/span&gt;, GitVersion:&lt;span class="s2"&gt;&amp;#34;v1.16.15-gke.4300&amp;#34;&lt;/span&gt;, GitCommit:&lt;span class="s2"&gt;&amp;#34;7ed5ddc0e67cb68296994f0b754cec45450d6a64&amp;#34;&lt;/span&gt;, GitTreeState:&lt;span class="s2"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;, BuildDate:&lt;span class="s2"&gt;&amp;#34;2020-10-28T09:23:22Z&amp;#34;&lt;/span&gt;, GoVersion:&lt;span class="s2"&gt;&amp;#34;go1.13.15b4&amp;#34;&lt;/span&gt;, Compiler:&lt;span class="s2"&gt;&amp;#34;gc&amp;#34;&lt;/span&gt;, Platform:&lt;span class="s2"&gt;&amp;#34;linux/amd64&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="command-や-args-に環境変数をベタ書きした場合うまく参照できない"&gt;command や args に環境変数をベタ書きした場合、うまく参照できない&lt;/h2&gt;&#10;&lt;p&gt;環境変数を出力するだけのPodを作成してみます。&#10;まずはPodのマニフェストファイルを作成します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;env&lt;/code&gt; 属性で &lt;code&gt;NAME&lt;/code&gt; という環境変数を設定し、それを出力させてみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# test-pod.yaml というマニフェストファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;test-pod.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;apiVersion: v1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;kind: Pod&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;metadata:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; name: test-pod&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;spec:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; containers:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; - name: test-pod&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; image: bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; command: [&amp;#34;echo&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; args:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; - &amp;#34;${NAME}&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; env:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; - name: NAME&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; value: &amp;#34;genzouw&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;マニフェストファイルを元にPodを作成します。&lt;/p&gt;</description></item><item><title>envsubstを使ってテキストファイルをテンプレートエンジンとして使う</title><link>https://genzouw.com/entry/2021/01/14/220134/2113/</link><pubDate>Thu, 14 Jan 2021 22:01:34 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/14/220134/2113/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Kubernetes のマニフェストファイル内に環境変数を埋め込み、出力内容を動的に変更したい場合がありました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/kubernetes-sigs/kustomize"&gt;kustomize&lt;/a&gt; や &lt;a href="https://helm.sh/"&gt;helm&lt;/a&gt; といったツールを利用することで Kubernetes のマニフェストファイルに変数を埋め込むことはできます。&#10;しかし、そこまで大層な仕組みを導入するような手間を掛けたくありません。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; を使う方法もありますが、可読性は低くなります。&lt;/p&gt;&#10;&lt;p&gt;そんな場合、 &lt;code&gt;enｖsubst&lt;/code&gt; コマンドを利用することで実現できました。&lt;/p&gt;&#10;&lt;p&gt;テキストファイルをテンプレートエンジンのとして利用できるシンプルで便利なコマンドです。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="envsubst-コマンドとは"&gt;&lt;code&gt;envsubst&lt;/code&gt; コマンドとは&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;envsubst&lt;/code&gt; コマンドを使うと，変数展開など「テンプレートエンジン」のような仕組みを実現できます。&lt;/p&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;僕の環境 ( CentOS ) には最初にインストールされていなかったため、まずはインストールから行いました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum install -y gettext&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ which envsubst&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/bin/envsubst&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;Mac 環境の場合は &lt;strong&gt;Homebrew&lt;/strong&gt; でインストールできます ( 僕の Mac には気がついたらインストールされていました ) 。&#10;&lt;code&gt;apt&lt;/code&gt; でもきっと用意にインストールできるでしょう。&lt;/p&gt;</description></item><item><title>"bash -c"コマンド実行で子プロセスが作られる時、作られない時</title><link>https://genzouw.com/entry/2021/01/08/202800/2109/</link><pubDate>Fri, 08 Jan 2021 20:28:00 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/08/202800/2109/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;KubernetesのマニフェストファイルやDockerのビルドファイル、Docker Composeの設定ファイルを閲覧、編集することが増えてきました。&lt;/p&gt;&#10;&lt;p&gt;それらのファイルの中で &lt;code&gt;bash -c&lt;/code&gt; というコマンドが実行されていることがあります。&#10;&lt;code&gt;bash&lt;/code&gt; の新しいプロセスを立ち上げ、 &lt;code&gt;-c&lt;/code&gt; オプションで渡されたコマンドを実行する命令になります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;ps&lt;/code&gt; コマンドを使い、実行中の &lt;code&gt;bash -c&lt;/code&gt; プロセスを見ていたところ、プロセスツリーの表示が時々で異なっていたため不思議に思い調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="改めて-bash--c-って何"&gt;改めて、 &lt;code&gt;bash -c&lt;/code&gt; って何？&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;bash -c &amp;quot;echo hello&amp;quot;&lt;/code&gt; といったように、 &lt;code&gt;-c&lt;/code&gt; コマンドに文字列を渡すことで、文字列をコマンドとして実行させることができます。&#10;多くの言語系で実装されている &lt;code&gt;eval&lt;/code&gt; 関数のようなものですね。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 10秒待ってからhelloが表示される&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -c &lt;span class="s2"&gt;&amp;#34;echo hogehoge&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hogehoge&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;コマンドは &lt;code&gt;;&lt;/code&gt; で区切って複数実行させることもできます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 10秒待ってからhelloが表示される&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -c &lt;span class="s2"&gt;&amp;#34;sleep 10; echo hello;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="bash--c-sleep-10-echo-hello-を実行したときのプロセスツリー"&gt;&lt;code&gt;bash -c &amp;quot;sleep 10; echo hello;&amp;quot;&lt;/code&gt; を実行したときのプロセスツリー&lt;/h2&gt;&#10;&lt;p&gt;ここで、 &lt;code&gt;bash -c &amp;quot;sleep 10; echo hello;&amp;quot;&lt;/code&gt; というコマンドを実行します。&lt;/p&gt;</description></item><item><title>DockerfileでENTRYPOINT、CMDの挙動を動かしながら理解する</title><link>https://genzouw.com/entry/2020/10/02/000810/2075/</link><pubDate>Fri, 02 Oct 2020 00:08:10 +0900</pubDate><guid>https://genzouw.com/entry/2020/10/02/000810/2075/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Dockerfile内で指定可能なコマンドはいくつかありますが、 &lt;strong&gt;ENTRYPOINT&lt;/strong&gt; コマンドと &lt;strong&gt;CMD&lt;/strong&gt; コマンドは初見ではわかりくいコマンドとなっています。&lt;/p&gt;&#10;&lt;p&gt;この2つのコマンドが、Dockerコンテナの実行にどのように影響するか、実行させながら理解していきたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 19.03.13-beta2, build ff3fbc9d55&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="dockerイメージ実行時の実行コマンドの組み立てロジック"&gt;Dockerイメージ実行時の実行コマンドの組み立てロジック&lt;/h2&gt;&#10;&lt;p&gt;今回は結論から入ります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Dockerイメージ内で実行されるコマンド&lt;/strong&gt; は、以下の3つの要素を使って組み立てられます。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Dockerfile内の &lt;strong&gt;ENTRYPOINTの設定値&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;docker run IMAGE_NAME&lt;/code&gt; コマンド実行時の &lt;strong&gt;コマンドライン引数&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Dockerfile内の &lt;strong&gt;CMDの設定値&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;2と3の両方が設定されている場合は、 &lt;strong&gt;2が優先され、3は無視&lt;/strong&gt; されます。&lt;/p&gt;&#10;&lt;p&gt;結果、 &lt;strong&gt;Dockerイメージ内で実行されるコマンド&lt;/strong&gt; は以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;ENTRYPOINTの設定値&amp;gt; &amp;lt;コマンドライン引数&lt;span class="p"&gt;|&lt;/span&gt;CMDの設定値&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;具体的な例を見ていきたいと思います。&lt;/p&gt;&#10;&lt;h2 id="dockerfileに-entrypoint-と-cmd-の両方が指定されている場合"&gt;Dockerfileに &lt;strong&gt;ENTRYPOINT&lt;/strong&gt; と &lt;strong&gt;CMD&lt;/strong&gt; の両方が指定されている場合&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;ENTRYPOINT&lt;/strong&gt; と &lt;strong&gt;CMD&lt;/strong&gt; の両方が指定されたDockerfileから、Dockerイメージを作成してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Dockerfileを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;Dockerfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;FROM alpine:3.11.3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ENTRYPOINT [&amp;#34;seq&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;CMD [&amp;#34;1&amp;#34;, &amp;#34;5&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# my_docker_image_01 という名前のDockerイメージを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker build -t my_docker_image_01 .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="dockerイメージを実行-コマンドライン引数なし"&gt;Dockerイメージを実行 (コマンドライン引数なし)&lt;/h3&gt;&#10;&lt;p&gt;まずは作成されたDockerイメージを、イメージ名の後方に引数をつけずに実行してみます。&lt;/p&gt;</description></item><item><title>GCPのGoogle Container Registryのイメージを一括削除する方法</title><link>https://genzouw.com/entry/2020/08/13/123526/2057/</link><pubDate>Thu, 13 Aug 2020 12:35:26 +0900</pubDate><guid>https://genzouw.com/entry/2020/08/13/123526/2057/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;GCP上の &lt;strong&gt;Google Container Registry&lt;/strong&gt; 内に不要なDockerイメージがあるため、削除したいと思いました。&lt;/p&gt;&#10;&lt;p&gt;Dockerイメージを削除するためには、すべてのタグ（というかハッシュ。ビルド履歴）を削除する必要がありmさう。&lt;/p&gt;&#10;&lt;p&gt;対象のDockerイメージに4000以上のタグが付与されているため、できる限り一括かつ並列で削除擦る方法を探してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.17&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.4.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ xargs --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xargs &lt;span class="o"&gt;(&lt;/span&gt;GNU findutils&lt;span class="o"&gt;)&lt;/span&gt; 4.7.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;GCP上のリソースをコマンドラインから操作するためのツールとして &lt;code&gt;gcloud&lt;/code&gt; コマンドがあります。&#10;事前にこちらのコマンドをインストールし、 &lt;code&gt;gcloud auth login&lt;/code&gt; などで認証を完了しておきましょう。&lt;/p&gt;&#10;&lt;p&gt;正しく準備ができていれば、以下のコマンドが動作するはずです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Google Container Registryからイメージの一覧を取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gcloud container images list&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="結果"&gt;結果&lt;/h2&gt;&#10;&lt;p&gt;準備ができれば、後は以下のコマンドを実行するだけです。&#10;以下の2つの環境変数はご自分のGCP設定に合わせて書き換えてください。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;GCP_PROJECT_ID&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;GCP_DOCKER_IMAGE_NAME&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;span class="lnt"&gt;9&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;GCP_PROJECT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_GCP_PROJECT_ID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;GCP_DOCKER_IMAGE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gcr.io/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GCP_PROJECT_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/YOUR_DOCKER_IMAGE_NAME&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gcloud &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container images list-tags &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GCP_DOCKER_IMAGE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed 1d &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print $1 }&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -P4 -n &lt;span class="m"&gt;1&lt;/span&gt; -I&lt;span class="o"&gt;{}&lt;/span&gt; gcloud container images delete &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GCP_DOCKER_IMAGE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;@sha256:&lt;span class="o"&gt;{}&lt;/span&gt; --quiet --force-delete-tags&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;ここでは、 &lt;code&gt;xargs&lt;/code&gt; の &lt;code&gt;-P&lt;/code&gt; パラメータで &lt;strong&gt;4並列実行しています&lt;/strong&gt; 。&#10;マシンリソースに自身があるなら &lt;code&gt;-P0&lt;/code&gt; として、CPUを目一杯使うことができます。&lt;/p&gt;</description></item><item><title>DockerfileのVOLUME命令とはなにか？どのように利用すると便利か？</title><link>https://genzouw.com/entry/2020/02/08/225825/1921/</link><pubDate>Sat, 08 Feb 2020 22:58:25 +0900</pubDate><guid>https://genzouw.com/entry/2020/02/08/225825/1921/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; を使うに当たり &lt;strong&gt;Dockerfile&lt;/strong&gt; の各種命令の理解は必須です。 &lt;strong&gt;FROM&lt;/strong&gt; や &lt;strong&gt;RUN&lt;/strong&gt; などは確実に登場します。&lt;/p&gt;&#10;&lt;p&gt;ただ、 &lt;strong&gt;VOLUME&lt;/strong&gt; という命令を使う機会が多くなかったため、改めて理解を整理してみます。&#10;また、どういうときに便利に利用できるのかについても取り上げてみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 19.03.5, build 633a0ea&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="volume-命令の記述方法"&gt;VOLUME 命令の記述方法&lt;/h2&gt;&#10;&lt;p&gt;まずは動作確認のために、VOLUME 命令を使用したかんたんな &lt;strong&gt;Dockerfile&lt;/strong&gt; を作成してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;Dockerfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;FROM alpine:3.11.3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;RUN mkdir -p /hoge /fuga&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;VOLUME [&amp;#34;/hoge&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;記述している内容は 3 命令しかありません。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;FROM&lt;/code&gt; : ベースとして利用するコンテナイメージ。何でも良いがここでは &lt;strong&gt;Alpine Linux&lt;/strong&gt; を利用しています。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;RUN&lt;/code&gt; : ルートディレクトリ直下に２つのディレクトリを作成しています。( &lt;code&gt;/hoge&lt;/code&gt;, &lt;code&gt;/fuga&lt;/code&gt;)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;VOLUME&lt;/code&gt; : 配列で複数指定可能。ボリュームとしたいパスを指定。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ここでは、 &lt;code&gt;/hoge&lt;/code&gt; というディレクトリを &lt;strong&gt;ボリューム&lt;/strong&gt; として定義しています。&lt;/p&gt;</description></item><item><title>スタンドアロンKubernetesクラスタにIngressを設定しWebサーバを公開する</title><link>https://genzouw.com/entry/2020/01/26/234702/1909/</link><pubDate>Sun, 26 Jan 2020 23:47:02 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/26/234702/1909/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2020/01/25/001110"&gt;余ったPC1台を使ってKubernetesクラスタを構築してみる&lt;/a&gt;でKubernetesの検証環境を構築できました。&lt;/p&gt;&#10;&lt;p&gt;せっかくできたこの環境を使って外部からアクセス可能なWebサーバを構築し、公開してみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="ingressとは"&gt;Ingressとは&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Ingress&lt;/strong&gt;とは、&lt;strong&gt;Kubernetes&lt;/strong&gt;で利用できる&lt;strong&gt;L7(HTTP/HTTPS)ロードバランサ&lt;/strong&gt;です。&#10;クラスタ内のコンテナ(正確にはPod)を外部に公開できます。&lt;/p&gt;&#10;&lt;p&gt;似たようなものとして&lt;strong&gt;Load Balancer Service&lt;/strong&gt;というものがあります。&#10;こちらは&lt;strong&gt;L4(TCP/UDP)ロードバランサ&lt;/strong&gt;です。&#10;後々やってみたいと思っている&lt;em&gt;TLSターミネーション&lt;/em&gt;や&lt;em&gt;URLマップ&lt;/em&gt;ができません。&lt;/p&gt;&#10;&lt;p&gt;したがって、&lt;strong&gt;Ingress&lt;/strong&gt;を使ってみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;&#10;&lt;h3 id="検証環境"&gt;検証環境&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2020/01/25/001110"&gt;前回のエントリ&lt;/a&gt;の続きのため、Ubuntu環境を利用しました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;40~18.04.1-Ubuntu SMP Thu Nov &lt;span class="m"&gt;14&lt;/span&gt; 12:06:39 UTC &lt;span class="m"&gt;2019&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="ingress-nginx-controller"&gt;Ingress Nginx Controller&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Ingress&lt;/strong&gt;とは先程触れたとおり、&lt;strong&gt;Kubernetes&lt;/strong&gt;で利用できる&lt;strong&gt;L7(HTTP/HTTPS)ロードバランサ&lt;/strong&gt;です。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Ingress&lt;/strong&gt;の内部実装は&lt;strong&gt;Ingress Controller&lt;/strong&gt;と呼ばれており、GCPで動作するもの、AWSで動作するものなど色々あります。&lt;/p&gt;&#10;&lt;p&gt;ここではオンプレミス環境でも利用できる&lt;strong&gt;Ingress Nginx Controller&lt;/strong&gt;をインストールします。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Ingress Nginx Controller&lt;/strong&gt;を&lt;a href="https://helm.sh/"&gt;Helm&lt;/a&gt;というツールを使ってセットアップを行います。&#10;*Helm**を利用する理由は、クラスタ外からアクセスするためのIPアドレス（&lt;code&gt;external_ip&lt;/code&gt;）の設定が容易なためです。&lt;/p&gt;&#10;&lt;h4 id="helmのインストール"&gt;Helmのインストール&lt;/h4&gt;&#10;&lt;p&gt;&lt;a href="https://helm.sh/"&gt;公式ページ&lt;/a&gt;に記載されている方法でインストールします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; get_helm.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./get_helm.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Initialize&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;次に外部からアクセスする際のクラスタのIPについて確認します。&#10;スタンドアローンのクラスタなので、 &lt;strong&gt;マスタサーバ&lt;/strong&gt; で &lt;code&gt;ip addr&lt;/code&gt; を実行した結果のIPアドレスを利用します。&lt;/p&gt;</description></item><item><title>余ったPC1台を使ってオンプレKubernetesクラスタを構築してみる</title><link>https://genzouw.com/entry/2020/01/25/001110/1905/</link><pubDate>Sat, 25 Jan 2020 00:11:10 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/25/001110/1905/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;仕事では&lt;a href="https://cloud.google.com/kubernetes-engine/"&gt;Google Kubernetes Engine (GKE)&lt;/a&gt;を使っての&lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt;クラスタ構築をしています。&lt;/p&gt;&#10;&lt;p&gt;仕事以外の時間でもKubernetesクラスタをゴリゴリ触ってみたいと思いました。&#10;そこで、家の使っていない古いPCを使ってKubernetesクラスタをいちから作成してみることにしました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;(2020-01-26 追記)&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;当エントリでまとめたセットアップ手順をシンプルなシェルスクリプトにまとめ、公開しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/genzouw/standalone_kubernetes_cluster"&gt;GitHub - genzouw/standalone_kubernetes_cluster: This simple shell script helps build a &amp;quot;standalone&amp;quot; Kubernetes cluster on an extra (eg, old) PC.&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="クラスタを構成するマスタサーバとノードの２つの役割はどうするの"&gt;クラスタを構成する「マスタサーバ」と「ノード」の２つの役割はどうするの？&lt;/h2&gt;&#10;&lt;p&gt;Kubernetesクラスタには、&lt;strong&gt;マスターサーバ&lt;/strong&gt;と&lt;strong&gt;ノード&lt;/strong&gt;と言われるサーバが必要になります。&lt;/p&gt;&#10;&lt;p&gt;ざっくりいうと、 &lt;strong&gt;マスターサーバ&lt;/strong&gt;は管理者からの要求に答えて&lt;strong&gt;ノード&lt;/strong&gt;(後述)にコンテナを立ち上げたり、&lt;strong&gt;ノード&lt;/strong&gt;に存在するコンテナの状況を監視します。&#10;&lt;strong&gt;ノード&lt;/strong&gt;はコンテナそのものを動かすサーバです。&lt;/p&gt;&#10;&lt;p&gt;「Hadoop HDFS」における&lt;strong&gt;マスタノード&lt;/strong&gt;と&lt;strong&gt;スレーブノード&lt;/strong&gt;に似ていますね。&lt;/p&gt;&#10;&lt;p&gt;したがって、できる限り&lt;strong&gt;マスターサーバ&lt;/strong&gt;は余裕のある状況が望ましいです。&lt;/p&gt;&#10;&lt;p&gt;ただし今回は検証環境である、またお金をかけたくないなどの理由から、&#10;「マスタサーバ」x1台と「ノード」x1台を物理サーバx1台に共存させたいと思います。&lt;/p&gt;&#10;&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;&#10;&lt;p&gt;Kubernetesクラスタを構築していきます。&lt;/p&gt;&#10;&lt;h3 id="osのディストリビューションバージョンを確認"&gt;OSのディストリビューション・バージョンを確認&lt;/h3&gt;&#10;&lt;p&gt;さて、今回余っていた古いPCには &lt;code&gt;Ubuntu18.04&lt;/code&gt; がインストールされていたため、その環境をそのまま利用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;40~18.04.1-Ubuntu SMP Thu Nov &lt;span class="m"&gt;14&lt;/span&gt; 12:06:39 UTC &lt;span class="m"&gt;2019&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="docker-のインストール"&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; のインストール&lt;/h3&gt;&#10;&lt;p&gt;セットアップ後は以下のコマンドを実行し、OSリブート時にもサービスが自動起動するようにしておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;span class="lnt"&gt;9&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install -y docker.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; docker.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在ログインしているユーザが `docker` コマンドを実行できるようにしておく&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gpasswd -a &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 上記で設定したdockerグループへの所属は、一度ログインしないと反映されない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;正常にセットアップされたか配下のコマンドを実行すれば確認できます。&lt;/p&gt;</description></item></channel></rss>