機雷がなんだ! 全速前進!

SEというかプログラマというか、日々のエンジニア生活の中で体験したことなどを中心に書き残しています。

*[本]人月の神話

最近あらためて「人月の神話」を読みました。

f:id:orinbou:20201221010023p:plain

人月の神話(20周年記念増訂版)

昨年の12月はAWS re:Invent 2019へ向かう途中でマウンテンビューのコンピュータ歴史博物館へ立ち寄った。そこに、この本の原著(と思われる本)が展示されていた。 最初の刊行は1975年だから、きっとその当時のものだと思う。

The Mythical Man-month:人月の神話

初版から既に45年が経っているにも関わらず、この本は今でも尚、大規模開発プロジェクトのソフトウェア工学の古典として読み継がれている名著と言われている。本の横に書かれているのは、あの有名な『ブルックスの法則』で 

「遅れているソフトウェアプロジェクトへの要員追加は、さらにプロジェクトを遅らせるだけだ(Adding manpower to a late software project makes it later.)」

 というやつです。最近たまたま、この本を思い出すきっかけがあったのであらためて手に取ってみた。

 

まず、本の表示の獣を何故かずっと熊と思い込んでいたのだが、実はメガテリウム(オオナマケモノ)という新生代(約5百万~1万年前)の生物だった。確かに熊と違って尻尾が太い。全長6~8mで体重3tにもなるそうで熊よりよっぽどデカい。そして、第1章「タールの沼」の直前に下記の絵が掲載されており、左側にサーベルタイガーも描かれており確かに古代(新生代)を前提とした絵であることが分かる。

f:id:orinbou:20201223013526p:plain

タールの沼

この本の中で、著者のブルックスは、大規模なソフトウェア開発をもがけばもがくほど絡みつくタールの沼に例えている。

 

そして著者はソフトウェア開発の複雑性を次のように区別して考えている。(第16章)

 

●「本質的な複雑性」

 ソフトウェアの性質に固有な困難のこと

【本質:データセットやデータ項目間の関係、アルゴリズムや機能呼出などが組み合わさったコンセプトで構成されたものであり、同じ概念構造が多くの異なる表現で表されるという点で抽象的である。にもかかわらず、非常に正確で十分に詳細であるということ】

【困難:概念構造体の仕様作成とデザインおよびテスト】

 

●「偶有的(副次的あるいは不随の)な複雑性」

 目下の生産性にはつきまとうが本来備わっているものではない困難のこと

【例:実装(言語、ランタイム、ツール、プログラミング手法)にかかわるもの】

 

このように区別したうえで、ソフトウェア技術の進歩(例:高水準言語、オブジェクト指向プログラミングなど)は、主に偶有的な複雑性を解決して生産性を向上してきたが本質的な複雑性を攻略できた訳ではないと主張している。(確かにそうかも)

 

つまり、本質的な複雑さは、依然として攻略困難な課題として存在し続けており、それこそがソフトウェア構築は(当時と比べて飛躍的にテクノロジーが進歩した今でもなお)いつでも困難であり続けており「銀の弾丸はない」ということに繋がっているように思う。

 

この本は、最初の刊行では15章までだったけど、この20周年記念贈訂版では16~19章が付け加えられており、当時から20年の時の経過をふりかえっての後日譚が多く記載されている。

 

その中で、順次モデルまたはウォーターフォールを改良したウィンストン・ロイスについても触れているのが興味深い。それにも関わらず、未だにロイスは改良前(フィードバックが許されない古典的な)のウォーターフォールの父として語られているのを耳にすることがあるので少々気の非常に毒に思う。聞くたびに「そうじゃないんだよ」と訂正しているけど。あと、米国防総省の黒歴史DOD-STD-2167のことも書いてあった。日本にも強い影響を与えた仕様ですね(今や黒歴史?)

 

漸増的(インクリメンタル)構築モデルの利点を述べ、常にシステムが動く状態にしておくことの重要性についても触れているのは興味深いし、(当時の)マイクロソフトの「毎晩構築」アプローチは、継続的インテグレーションとデイリービルドの考えを地で行ってる感じがした。

 

『人間が全て(そう、だいたいのところは)』の節で言及している「成功のためには、プロジェクトに携わる人々の質、およびその組織形態と管理こそが、使用するツールや採用する技術的アプローチよりもはるかに重要な要因であると考えている」という点にも一考の余地があると思う。同じページでデマルコの「ピープルウェア:生産的なプロジェクトとチーム」も引用されていた。両翼からのアプローチは大事ですよね。

 

経済学者E.F.シューマッハーの「小さいことは美しい:あたかも人間を重視するかのような経済学の研究」を引用して、チームに権限を委譲して自由を与え、結果の責任を持たせることで準企業体を目指す企業がいる、など他にも興味深い話は多々あったけど、キリがないのでこの辺で。

 

本書の最後の節に「ソフトウェアエンジニアリングというタールの沼は、これから当分の間厄介なままだろう。人類が、手の届く範囲の、あるいはギリギリで届かないところにあるシステムを、ずっと試していくことは容易に想像がつく。ソフトウェアシステムは、人間の作り出したもののうちで最も複雑なものだろう。」と書かれている。これは増訂版が出版された1996年に書かれたもので、その時点から更に25年が経過している。

ソフトウェアエンジニアリングが今尚タールの沼のままなのかどうかはさておき、ソフトウェアの本質的な複雑性はさほど変わっていないと思う。ので、考えてみれば大変な(だが面白い)仕事を生業にしたもんだな、とつくづく感じる。(勿論いい意味で、)

ArgoCDを使用したGitOpsのデモ

今年は有難いことにk8sをお仕事で使用する機会に恵まれました。その中で、アプリケーションやインフラのデリバリをGitOpsで実現する手段としてArgoCDを使用しました。

 

イメージはだいたいこんな感じです。

f:id:orinbou:20201221004822p:plain

ArgoCDの利用イメージ

ArgoCDとググれば公式サイトをはじめ結構たくさんの情報がヒットします。なので、今更まとめ記事を書く必要もなさそうです。ハマりどころをスキップしてサッと試せるサンプルがあれば十分かなと思ったので、AWS EKSでk8sクラスタを作成してArgoCDでGitOpsを試すサンプルを作成してGitHubに置きました。

 

github.com

 

とりあえず適当なアプリでArgoCDがどんなものか触ってみたい人は試してみてください。

 

※補足

k8sサンプルアプリはいつものやつ(Sock Shop)を使用してますが、EKS:v1.18だとAPIバージョンなど廃止された記述があってうまくapplyできないのでマニフェストをForkして少しだけ修正してあります。

AWS 認定DevOps エンジニア – プロフェッショナル(DOP)を取得しました

AWS 認定DevOps エンジニア – プロフェッショナル を取得(11/29)しました。

f:id:orinbou:20201130004615p:plain

スコアは844でした。試験対策や所感などをメモがてら書き残しておきます。

AWS認定について

詳細は以下の公式ページに記載されています。

aws.amazon.com

ざっくり言うとAWS(Amazon)が公式に認定するベンダー資格です。大きくは2つのレベル(アソシエイトとプロフェッショナル)に分かれています。

また、プロフェッショナルとは別に専門知識というカテゴリも用意されており、以前は英語のみ受験が可能だったのですが、現在は全て日本語での受験が可能になっているようです。(なんかどんどん増えますねぇ、、、今や全部取得すると12冠なんですって)

DOP試験対策について

試験対策ですが先達の方々からのアドバイスによるとUdemyの教材が良いと聞いていたのでセール期間にいくつか購入していたのですがいずれも英語の教材でした。英語が嫌い過ぎてどーにもやる気が出ず2週間前くらいまで『無』の境地で諦めモードでした。が、なんと試験2週間くらい前になって、いい感じの日本語の教材を見つけました!

  • AWS認定 DevOpsエンジニア – プロフェッショナル (DOP-C01) 模擬試験 (2020年試験対応版) | Udemy(※有償:¥3000 yen → ¥1200 yen

    • 日本語の模擬試験問題集です。しかも非常にリーズナブルな価格で、なんとAWS公式の模擬試験よりも安いにもかかわらず、DOP本番試験と同じ問題数(75問)の模擬試験が4回分(※年内には5回分になるらしい)も掲載されています。さらにセール期間に買えば¥1200 yenです。試験問題や回答選択肢の日本語が怪しい点も忠実に(?)再現されています。試験2週間前くらいから慌ててひたすら過去問を解いて、間違えた問題を中心に解説を読みました。解説だけで納得できないものは解説に記載されているAWS公式ドキュメントにも軽く目を通しました。試験対策は、ほぼこれだけ

他にやったことは、公式のサンプル問題を解いたくらいですね。

  • 公式のサンプル問題(※無料)

    • AWSが公開しているサンプル問題集です。10問しかありませんが、回答と解説がちゃんと記載されているので、こちらも試験前に1度は解いておくのが良いと思います。

 

現時点でDOP日本語の教材は非常に少ないので、他には下記くらいだと思うのですが、今回はいずれも利用しませんでした。(そう考えると対策のコスパ良かったな)

  • AWS WEB問題集で学習しよう(※有償:¥5480 yen 90日★ダイヤモンドプラン)
    • オリジナルのAWS認定試験対策問題集を有償で公開しています。前回SAP試験の際は活用しましたが、DOPの試験問題はまだそこまで充実していない印象を受けたので今回は利用しませんでした。
  • 模擬試験(※有償:¥4000 yen)
    • AWS認定の模擬試験をオンラインで受けることができます。本試験と同じような画面レイアウト(時間制限なども本番に近い)で体験できるので、一度はやっておくと良いと思います。が、今回はUdemyの過去問だけで十分だとな気がしたので今回は利用しませんでした。

 

試験会場は行きつけの歌舞伎座テストセンターにしたかったのですが、日程が合わず断念。自宅でAWS認定試験が受験できるようになったので、自宅で受験しようとも思ったのですがバウチャーが利用できないのでそれも断念。最終的に、昔SAA受験した時に利用した(PSI試験で嫌な思い出のある)田町テストセンターで受験することになったので会場(というよりは試験中の異常なまでの監視)に不安があったのですが、前回のPSI試験の時とは違って、入室前に身分証明書などを提示してカメラで顔写真を撮った際の事前チェックをしてからは、Webカメラでの監視や試験官とのチャットでのコミュニケーションなども一切なく試験に集中して淡々と進めることができました。今回はピアソンVUE試験だったからかな?これなら歌舞伎座じゃなくても良いかもって思いました。

 

f:id:orinbou:20201130004525p:plain

お疲れさまでした。

[2020/05/15(金)]アジャイル・ディスカッション!!オンライン へ参加してきました

f:id:orinbou:20200524105433p:plain

新型コロナウイルスによる自粛生活が始まってから集合形式の勉強会は殆どがキャンセルされ、久しく社外勉強会に参加していませでしたが、最近ではオンライン形式の勉強会も増えてきました。これまで何度が参加させてもらったアジャイル・ディスカッション勉強会も遂にオンラインで開催されるということで参加してきました。

そもそもオンラインで大人数のディスカッションなんてできるのか?など一体どんな雰囲気になるのか想像もつきませんでしたが、うまくツールを活用してオンラインのディスカッションを実現していました。

 

利用したツール

オンライン勉強会では以下のツールを活用しました。

Discord

テキスト・音声どちらも使えるチャットツールです。

Mural

特に付箋に特化したオンラインホワイトボードです。


オンラインディスカッションの進め方

オンライン勉強会は、OST(オープン・スペース・テクノロジー)形式で進められました。OSTでは、その場に居る人達が議論したい内容を持ち寄って、自分達でディスカッションしたいテーマを決定します。1つのOSTの中でテーマは複数あり、テーマごとに同時並行でディスカッションを進めます。どのテーマのディスカッションに参加するかは自由に選択できます。具体的な進め方は、実際にディスカッションのテーマ出しをする前に、Mural上に用意されたアウトラインのスライドに沿ってDiscordボイスチャットで説明してくれました。運営の方、事前準備どうもありがとうございました。

f:id:orinbou:20200523173254p:plain

Discordには、ディスカッション用の部屋が複数用意されていました。参加者が出し合ったディスカッションテーマを部屋ごとにひとつ割り当てて、前半/後半の2つのタイムボックスでそれぞれディスカッションしました。

f:id:orinbou:20200523174200p:plain

ディスカッションへの参加度合いは人それぞれ自由で、積極的に話すファシリ役から聞き役まで様々で、ディスカッション前の説明ではOSTへ参加する役割について次のように説明されました。

3つの役割

  • Bird(さえずる鳥🐦):トピックを決めて議論をファシリテートする人
  • Bee(群がる蜂🐝):トピックに群がり議論を前に進め、建設的な提案をする人
  • Butterfly(飛び回る蝶🦋):複数のトピックを回りながら、他家受粉を促す人

私はテレワークをもっとカイゼンしたかったので「オンラインでのふりかえり方法」や「オンラインでの困り事」のディスカッションに参加させてもらいました。テレワークが始まって以来、社外の人とSNSなどで情報交換したことはありましたが、口頭で議論するのは初めてだったので良い情報交換ができました。

 

まとめ

Discordを初めて使用したのですが、多人数(30人弱)で利用しても遅延を感じることもなく全体をとおして通話品質が良いなという印象でした。初めての利用でしたが、ワンクリックでの部屋移動など、操作も簡単でした。オンライン勉強会でも結構やれるな、と思った反面、話し手(※特にメインスピーカ)の顔が見えないので、音声以外の情報(表情や仕草など)から雰囲気や感情を感じ取れないのは辛いな、とも思いました。今度Discordのカメラ機能を使ってカイゼンできないか試してみたいところです。

 

総合的にみて オンライン勉強会いいな! という感想を持ちました。今まで私が参加してきた対面形式の勉強会は自宅から遠いことが多かったので、終電や長時間の移動を気にせず参加できるオンライン勉強会は神です。今までのような対面形式の勉強会と比べて不便はありますが、メリットも大きいと感じました。オンライン勉強会が定着して、その不便もカイゼンされていけば、いつでもどこからでも世界中の勉強会に参加できますね。今後のオンライン勉強会の進化に大いに期待したいところです。

Certified Kubernetes Application Developer (CKAD) 試験に合格しました

f:id:orinbou:20200518231455p:plain

本日(5/18)Certified Kubernetes Application Developer (CKAD) 試験に合格しました。合格するまでの勉強方法などのメモです。誰かの何かの役に立てば幸いです。

 

Kubernetes認定資格について

詳細はこちらの過去記事をご覧ください。

今回は「CKAD-JP」で試験を申し込んで受験しました。ちょうど今、割引キャンペーンを実施中で今月末(5/31)まで受験費用は30%OFF($300→$210)になっていますので受験を考えている方はエントリしてみては如何でしょうか。有効期間は、エントリ後1年間です。好きなタイミングで受験できるので、いずれ受験しようと考えているのであれば、とりあえずエントリして、(自分で自分の尻に火をつけて)それをモチベーションに今から勉強して頃合をみて受験することも可能です。

f:id:orinbou:20200518233624p:plain

ちなみにクーポンコードは、エントリする際、クーポンコード入力欄に

ANYWHERE30

と入力するだけでOKです。

 

■ 試験対策について

今回の試験対策で実践した内容は(ほぼ)次のひとつだけです。 

Udemy(※有償:¥24000 → 1380yen)★94%OFF!

CKAと同様に去年のクリスマスセール中に激安で購入した英語のCKADオンライン教材です。割引キャンペーン時に購入すれば、コスパ最強の教材です。Udeimyは頻繁に割引セールを実施しているので、キャンペーンを利用して上手に購入してください。ちなみに、このブログ書いている今は割引なし。うーん、高いな、、、f:id:orinbou:20200518235315p:plain

この教材の優れた点などは、同じく前述の CKAの過去記事 を参考にしてください。 

 

CKA受験から3週間空けてCKADを受験した訳ですが、ギリギリながら1発合格することができました。試験対策としての勉強は、下記だけです。CKA試験対策のベースがあったのでセクション1~10のセミナー動画は結局最後まで見ませんでした。

* セクション12: Mock Exams
  • Mock Exam - 1
  • Mock Exam - 2
 * セクション11: Lightning Labs
  • Lightning Lab - 1
  • Lightning Lab - 2 

取り組んだ順番も上記のとおりです。セクション12の「Mock Exams」から着手する理由は、セクション11の「Lightning Labs」があまりにも難しくて、かつ、試験時間も足りなすぎて、CKAD試験がこのレベルだと思ってしまうと心が折れます(たぶん)。よって、まずは Mock Exams に挑戦してみて、慣れてからLightning Labsに挑戦してみると良いと思います。 

ちなみに私は、最後まで Lightning Labs の問題を時間内に完全に終わらせることができませんでしたが、ちゃんと(?)試験をパスできました。なので Lightning Labs が時間内に全部終わらなくても焦らなくて大丈夫です。

CKAD-exercises

様々なCKAD試験対策のブログやネット記事で取り上げられていたので、一応は見てみましたが、Udemyの問題と比べると簡単な問題が多い印象で、ほんの少しだけ手を付けて辞めてしまいました。ざっと眺めてみて、知らないとか苦手だと思うものがあったら手を付ける程度で十分と思いました。

 

■ 試験本番の注意点!

自宅でのオンライン受験はかれこれ3回目だったので、特に今回は手順でハマったところはありませんでしたが、受験15分前にコイツが出た時は少し焦りました。何が起きるか分からないので、当日試験前は十分時間に余裕を持ってスタンバイすると良いです。

f:id:orinbou:20200519003510p:plain

また、あえて付け足すなら、 試験開始前に試験官からWebカメラで身分証明書(パスポート)、机の上、部屋の中を見せるように言われるのですが、その際、自分のWebカメラの映像をWebブラウザにプレビューすることができます。プレビュー映像を確認しながらやらないと、試験官から、パスポートが見えないとか、部屋の中をもっとよく見せろとかしつこく言われててしまい非常に時間がかかります。その結果、試験を時間通り開始できなくて焦ってしまったり、疲れてしまったりするので、ちょっとしたことですが、知っておくと吉です。

 

■ 最後に

今回は、試験のペース配分をミスってしまい、一番最後の問題(高配点)を解く時間がなくなってしまいました。受験の際は、ちょっとでもハマって時間がかかりそうになったり、問題文が長くて内容を理解するのに時間がかかりそうだなと思った場合は、躊躇なく後回しフラグを立てて、どんどん進んだ方がいいです。特に、本当は解けるはずの高配点の問題を逃してしまうのが一番勿体ないです。CKADの試験問題はCKA試験と比べると、問題文も長くて、難易度も高い傾向にあるので特にその意識を強めに持った方がいいと思います。

今年の1月から、CKAの勉強を始めて約4ヶ月半でCKAとCKADの試験に合格できました。勉強の進め方をふりかえってみると、まずCKAでkubernetes全般の知識を広く(浅く)学び、そのベースを元にして追加でCKADの勉強を進める、というなんとなくな戦略で対策を進めてきましたが、結果として(自分にとっては)正しかったように思います。いきなりCKADの難易度の高い問題をやっていたら、すぐ嫌になって投げ出していたかもしれません。コツコツと進めるのが性に合っている人にとっては、この順番で対策を進めることをお勧めしたいと思います。

加えて、CKA/CKAD試験は自宅で受験しましたが、移動コストや交通遅延を気にする必要もなく、慣れた環境(自分の部屋、普段使い慣れたモニタ、キーボードなど)で受験することができるので、今まで受験した試験と比べて非常にリラックスして受験することができました。まだしばらくは新型コロナウイルス感染症(COVID-19)の影響で外出しにくい状況が続きそうなので、自宅で受験できるような試験が増えるとありがたいですね。

pod内からncコマンドで疎通確認する方法

f:id:orinbou:20200510225328p:plain

k8sのトラブルシュートなどでpodから疎通確認する方法についての簡単なメモです。
時々しか使わないので、時間が経つと100%忘れるのでここにメモを残しておきます。

nc コマンドの説明

NetcatはHobbit氏によって開発された、汎用TCP/UDP接続コマンドラインツールです。
ncコマンドはNetcatの略。非常に多機能なツールですが、今回は一部機能のみ使用します。

(外部接続の疎通確認の)コマンド実行の書式は下記です。

nc [-オプション] 接続先 ポート番号

疎通確認時によく使うオプションは下記です。

オプション 覚え方 説明
-z zero I/Oの[z] ゼロI/Oモード(ポートスキャン時)
-v verboseの[v] (多弁:verbose)情報表示モード
-w secs waitの[w] タイムアウトwait時間(秒数指定)

podからncコマンドで疎通確認する方法

まず、疎通確認したい pod(接続元) へ入ります。

$ kubectl exec -it webapp-color -- sh

次に、疎通確認したい pod / service (接続先)へ nc コマンドを実行します。

疎通OKの場合

# nc -z -v -w 3 secure-service 80
secure-service (10.108.84.141:80) open

疎通NGの場合(※タイムアウト)

# nc -z -v -w 3 secure-service
nc: secure-service (10.108.84.141:0): Operation timed out

上記は、CKA / CKAD のトラブルシュート試験でよく出題されて焦るやつなので覚えておくと吉。

参考URL

この記事を書くにあたり下記の情報を参考にさせていただきました。

k8sコンテナでコマンド実行するマニフェストファイル記述例

f:id:orinbou:20200508000144p:plain

k8sコンテナでコマンドを実行するマニフェストファイルの記述例を紹介します。

TL;DR

下記の流れでk8sコンテナでコマンドを実行するサンプルをいくつか試してみました。

  • サンプル1:単純な引数ありコマンドを実行する(commandのみ)記述方法
  • サンプル2:シェルで複数の引数ありコマンドを実行する(commandのみ)記述方法
  • サンプル3:シェルで複数の引数ありコマンドを実行する(command + args)記述方法①
  • サンプル4:シェルで複数の引数ありコマンドを実行する(command + args)記述方法②
  • サンプル5:シェルで複数の引数ありコマンドを実行する(command + 環境変数)記述方法
  • まとめ

サンプル1

単純な引数ありコマンドを実行する(commandのみ)記述方法

■ sample01.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample01
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['echo' , 'The sample01 app is running!']

サンプルpodをデプロイ

$ kubectl apply -f sample01.yaml
pod/sample01 created

サンプルpodの実行確認

$ kubectl logs sample01
The sample01 app is running!

ちゃんと実行されてますね。 ただし、コンテナのメインプロセスが即終了するためコンテナが再起動を繰り返してしまいます。

$ kubectl get pods sample01 -w
NAME       READY     STATUS      RESTARTS   AGE
sample01   0/1       Completed   1          7s
sample01   0/1       CrashLoopBackOff   1         7s
sample01   0/1       Completed   2         21s
sample01   0/1       CrashLoopBackOff   2         34s
sample01   0/1       Completed   3         48s
sample01   0/1       CrashLoopBackOff   3         1m

サンプル2

シェルで複数の引数ありコマンドを実行する(commandのみ)記述方法

■ sample02.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample02
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'echo The sample02 app is running! && sleep 3600']

サンプルpodをデプロイ

$ kubectl apply -f sample02.yaml
pod/sample02 created

サンプルpodの実行確認

$ kubectl logs sample02
The sample02 app is running!

ちゃんと実行されてますね。

サンプル3

シェルで複数の引数ありコマンドを実行する(command + args)記述方法①

■ sample03.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample03
spec:
  containers:
  - name: busybox
    image: busybox
    command: ['sh']
    args: ['-c', 'echo The sample03 app is running! && sleep 3600']

サンプルpodをデプロイ

$ kubectl apply -f sample03.yaml
pod/sample03 created

サンプルpodの実行確認

$ kubectl logs sample03
The sample03 app is running!

ちゃんと実行されてますね。

サンプル4

シェルで複数の引数ありコマンドを実行する(command + args)記述方法②

■ sample04.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample04
spec:
  containers:
  - name: busybox
    image: busybox
    command:
    - 'sh'
    args:
    - '-c'
    - 'echo The sample04 app is running! && sleep 3600'

サンプルpodをデプロイ

$ kubectl apply -f sample04.yaml
pod/sample04 created

サンプルpodの実行確認

$ kubectl logs sample04
The sample04 app is running!

ちゃんと実行されてますね。

サンプル5

シェルで複数の引数ありコマンドを実行する(command + 環境変数)記述方法

■ sample05.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample05
spec:
  containers:
  - name: busybox
    image: busybox
    env:
    - name: MESSAGE
      value: 'The sample05 app is running!'
    command: ['sh', '-c', 'echo $(MESSAGE) && sleep 3600']

サンプルpodをデプロイ

$ kubectl apply -f sample05.yaml
pod/sample05 created

サンプルpodの実行確認

$ kubectl logs sample05
The sample05 app is running!

ちゃんと実行されてますね。

まとめ

同じような実行結果を出力する場合でも、いろいろな書き方があります。 全てを覚える必要はありませんが、書き方は一つじゃないということと、 変にハマらないために、まずは無難な書き方を覚えて徐々に慣れるのが良いと思います。

参考URL

この記事を書くにあたり下記の情報を参考にさせていただきました。