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

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

Certified Kubernetes Administrator (CKA) 試験に合格しました

f:id:orinbou:20200429032015p:plain

昨日(4/28)Certified Kubernetes Administrator (CKA) 試験に合格(1回目[4/14]:不合格、2回目[4/26]:合格)しました。合格するまでの勉強方法などのメモです。誰かの何かの役に立てば幸いです。

 

■ Kubernetes認定資格について

CKAは、Linux Foundationが認定するKubernetesに関するスキルを証明するための、コマンドラインを使ったハンズオン形式の資格試験です。詳細はこちら(↓)です。

Kubernetesは、Googleの社内技術を元にオープンソース化されたコンテナオーケストレーションのデファクトスタンダードとも言うべきものです。ググればいくらでも情報が見つかるのでここでの説明は割愛します。

 

Linux Foundationが認定するKubernetesの認定資格は、次の2種類(CKA/CKAD)があります。 日本語(の試験官)で試験を受けたい場合はJPが付いているものを選択します。

略称 正式名 概要

CKA

CKA-JP

Certified Kubernetes Administrator (CKA) 試験 Kubernetes管理者の責任を果たすためのスキル、知識、およびコンピテンシーを持っていることを保証するもの

CKAD

CKAD-JP

Certified Kubernetes Application Developer (CKAD)試験 Kubernetesのクラウドネイティブ アプリケーションを設計、構築、構成、および公開する能力を証明するもの

今回は「CKA-JP」で試験を申し込んで受験しました。受験費用は何れも$300です。この費用に1回分の再受験が含まれているので心理的にもお財布的にも嬉しいですね。時々割引キャンペーンで受験費用が10〜30%OFFになることがあるので、試験対策を進めながらこまめにチェックするとお得に受験できるかもしれません。

 

■ 試験対策について

試験対策については、様々なサイトやBlogでいろいろと情報が公開されており、こちらもググればたくさん出てくるので、ここでは取得までに実践した内容を簡単に記載しておきます。

 

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

去年のクリスマスセール中に激安で購入した英語のオンライン教材です。割引キャンペーン時に購入すれば、コスパ最強の教材です。Udeimyは頻繁に割引セールを実施しているので、キャンペーンを利用して上手に購入してください。ちなみに、このブログ書いている今も割引中でした(笑)

f:id:orinbou:20200429013959p:plain

Certified Kubernetes Administrator (CKA) with Practice Tests

この教材の優れた点は、下記の点です。

  • 動画で体系的に学べる(英語苦手ですが図の説明で何とか理解できる)
  • 動画で学んだあと、すぐにテストで手を動かして確認できる
  • 実践に近い模擬テスト(Mock Exam)が3セット用意されている

    実際に手を動かす(kubectlコマンドなどを打つ)テストはUdeimyのコース購入で利用可能になるサイト(kodekloud.com)上でWeb経由で実施できるため、手持ちのPCにk8sクラスタ環境を準備する必要がなく非常に手軽にトレーニングすることができます。試験対策という意味では、もうホントこれだけでいいっていう感じです。特に最後の模擬テスト(Mock Exam)は3~5周くらいやって反射的に手が動くように訓練しました。

このコースは、全17章242セッションあり、かなりボリュームがあります。私の場合、週末の時間&通勤移動時間を活用して学習を進めたのですが、全体で約3ヶ月くらい(2020年1~3月)かかりました。この準備期間を経て、4月に受験&再試験(不合格→合格)という流れでした。受験と再試験の間は2週間ほど空けて、受験の記憶が新鮮なうちに、解けなかった系の問題(トラブルシュート、JsonPath、Ingressなど)を中心に復習を行いました。

 

参考サイト:

  •  Kubernetes道場1~25日目:Udemyを見ても理解できない時よく助けられました。

    https://cstoku.dev/tags/kubernetes-dojo/

     

  • Kubernetesドキュメント:試験中に閲覧できる公式ドキュメント

    特に、ここの中でUdemy模擬試験でも試験本番中も最も利用するのが下記のチートシートのページになります。これは試験対策としてブックマーク必須です。

     

  1. Kubectlコマンドの補完(コマンド短縮のためのalias設定は必須:kubectl → k)
  2. kubectlチートシート - Kubernetes(どんなサンプルがあるか把握しておくこと)
  3. Expert Certification - Cloud Native Computing Foundation(CKA & CKAD FAQ)

 

Google翻訳(Chrome 拡張機能)

英語に慣れていない場合は、Google翻訳のChrome拡張をオススメします。Udemyの模擬テスト(kodekloud.com)の問題文や参照サイトの英語ドキュメントを選択状態にするだけで画面遷移することなく翻訳(※長文は画面遷移する必要あり)してくれます。

 

身分証明書:

受験時に身分証明書の提示が必要です。パスポートの準備をくれぐれもお忘れなく!!

 

参考書籍:

試験対策として特に書籍は読みませんでした。(※試験対策とは別でDockerやk8sの本は読みましたが、直接の試験対策にはならないと思うので、ここでは割愛します)

 

■ 試験本番の注意点!

ありがたいことに多くの人が本当によくまとめてくれています。例えばコチラです。

CNCF が提供する Kubernetes の認定資格 CKA を取得した - reboooot․net

同じことを記載してもあまり意味がないので、今回の受験に際して調査した結果、どのサイトにも記載されていなかった(地味に重要な)点を下記に記載しておきます。

 

試験環境のクリーンデスク:

この資格試験は自宅で受験することができますが、事前のクリーンデスクのチェックがとても厳しかったです。初回受験時に、本受験で使用するノートPCを机上に置いて、外付けキーボードを接続して受験しようとしたところ、本受験で使用するノートPCにも関わらず、机上から撤去しろと言われてしまいました。チャットで試験官に説明しても、聞き入れられませんでした。最終的に机の裏側に小さな棚を持ってきて、その上にノートPC置いたら何とかOKをもらえました。受験で使用するPCを机の上に置くことも許されないとは思いませんでした。そんなやり取りをやっていたせいで、試験開始予定時刻を20分くらい経過してから試験開始になりました。そのせいで試験時間が短くなってしまうのではないかと心配しましたが、遅れて開始した分は、ちゃんと試験終了時刻も延びていましたので、もし同じ目にあっても安心して下さい。再受験時は、クリーンデスクに十分配慮して望んだのでスムーズに試験を開始することができました。

 

試験中に閲覧可能なページ:

試験ハンドブックやQAでは、試験中は下記のページのみ閲覧可能とされています。

https://kubernetes.io/docs/ ←翻訳ページもOK(例:https://kubernetes.io/ja/docs/

https://github.com/kubernetes/

https://kubernetes.io/blog/

説明には、上記およびそのサブドメインの閲覧が許可されているため、下記のページも閲覧してOKです。自信を持ってブックマーク&閲覧してください。

https://discuss.kubernetes.io/

上記ページには、試験問題を解くにあたり、具体的で有益な情報が掲載されていることがあります。ブックマークしてうまく活用しましょう。また、許可ページ以外を閲覧すると失格になる可能性があるため十分注意しましょう。

 

■ 最後に

2回目の試験中、後半のトラブルシュート系の問題で、クラスタの各ワーカノードへsshして作業することがあるのですが、行ったり来たりsshしているうちに、今どこに居るか分からなくなって、うっかり大元の作業場所で「exit」コマンドを実行してしまい、画面が飛びました。試験官にチャットで助けを求めたところ、再読み込みしろと言われたので、そのとおり実行したら、試験の残り時間だけが減った状態で、それ以外の全てがリセットされているような状態で、試験が再開されました。分からない問題に目印(Flag)が付けられるのですが、それも全てキレイに消えて無くなっていました。そこまでの回答も消えてそうだ、、、完全にやっちまったな、、、と思いつつ試験官に確認したところ、回答は保存されているよと言われました。半信半疑のまま試験を続けましたが、残りの試験中も試験終了後も本当に回答が保存されていたのかが気になって、ずっとソワソワしてました。受験が終了して約31時間くらいで試験結果通知メールが来てなんとか合格してました。回答がちゃんと保存されてたみたいです(笑)。とりあえず受かってて良かった。

 

いま世界は新型コロナウイルス感染症(COVID-19)の影響で多くの人が外出できず不自由な生活を余儀なくされています。ですが、そんな状況だからこそ自宅でじっくり勉強できますし、この資格試験は自宅で受験することもできます。この機会を自己研鑽への投資に活用してみるのもまた、ひとつの有意義な過ごし方なんじゃないでしょうか。

 

次は、CKAD(CKAD-JP)試験に挑戦してみたいと思います。

*[本]業務システムクラウド移行の定石

f:id:orinbou:20200301141128p:plain

業務システムクラウド移行の定石

オンプレからクラウドへシステム移行する際の手順がステップごとに分かりやすく記載してある。経験値が少ない人、ある程度経験はあるが進め方や観点の漏れ抜けがないか気になる人にとって良い本だと思う。教科書的な内容になってて、技術的な深さはあまりなく泥臭い話(具体的な事例)とかは出てこない。

 

クラウド移行の全体手順は下記の5ステップに分けて説明されている。(※大項目)

  • Step1:企画フェーズ

 クラウドとは何かを理解したうえで、クラウド移行の目的を明らかにし、目標を設定し合意を取る。さらに、その後の進め方や体制を計画し、承認を得る

  • Step2:戦略・分析フェーズ

 現状のインフラやシステムの状況を把握するとともに、クラウドに要求される事項などを明確にする。移行の対象候補システムや移行の順番付けの考え方などを明らかにする

  • Step3:PoC(実証実験)フェーズ

 詳細な設計作業や標準化作業にはいる前に、実際にサービスを利用しながら、プラットフォームに関する懸念点などを検証する

  • Step4:設計・移行フェーズ

 ここまでの内容を踏まえ、システムごとに設計や移行を行う。必要に応じて、標準化や共通化も推進する

  • Step5:運用・改善フェーズ

 運用を開始する。運用を通じて得た知見に基づき、戦略を見直したり設計内容を改善したりする

 

また、移行プロジェクトを進めるにあたり、主導権を社内の情シスがCoEを組織して担当することの重要性についても言及している。これは 前回記事 にも通じるものがある。(丸投げは空洞化を招くのでアンチパターンという文脈のやつ)

 

最終章(5.5章)の、某ITコンサルタントの次のセリフが印象的でした。

「実はこの考え方は、クラウド移行だけに当てはまるものではありません。新規ビジネスの立ち上げや新しいシステムの構築など、変化する環境の中で早く成果を出す必要のある領域全てに適用できます」

アジャイルコーチ Ryutaro YOSHIBA (@ryuzee) | Twitter さんらしいですね(笑)

 

books.rakuten.co.jp

*[本]百年アーキテクチャ~持続可能な情報システムの条件~

f:id:orinbou:20200224113125p:plain

オージス総研の本 [百年アーキテクチャ]

10年近く前に書かれた本ですが、それほど古さを感じない内容でした。この本が本質を突いているということもあるんだろうけど、日本のIT活用や業界構造の課題がこの10年間それほど変わっていないってことなのかもしれない。アジャイル開発やレガシーオフショア(主に中国に対する)による失敗などについても言及されており、なかなか共感できる点も多かった。

 

この本で語られている「百年アーキテクチャ」のコンセプトは、ビジネス(業務)とそれを支える情報システム(IT)をモデルの形で整理しておき、ビジネスを変更した際に、遅れなく情報システムも変化修整(※「修正」でなく)できるようにする、というものだそうだ。

 

この本の全体を通じて、下記に示す4つのアーキテクチャ成熟度ステージ(MIT Sloan)を前提にして様々なことが語られており、このステージ間の移行には、技術、プロセス、そして何よりも社員の文化が深く影響するんだとか。各ステージに見合った戦略をとらないとうまくいかない、ってのは確かに。あまり体系的に考えたことなかったのでこの観点は参考になる。

  • ステージ1.Business Silos:個別IT(サイロ型システム)

 個々の利用部門のビジネスニーズやシステムへの要求を最大限満たすことに注力

  • ステージ2.Standardized Technology:標準化でコストダウン(IT標準化)

 技術の標準化や集中化を通じてITの効率化を追求

  • ステージ3.Optimized Core:企業全体視点(ビジネス最適化)

 企業のビジネスモデルに応じて、全社視点からのコア業務とコアデータの標準化を進める

  • ステージ4.Business Modularity:戦略視点(ビジネスモジュール化)

 疎結合状態でサービス化されたビジネスプロセスコンポーネントを再利用して、コア部分はグローバル標準を担保しつつローカルの自由度を許している

 

この本の中で紹介されているシステム・ダイナミックス(SD)モデルによるステージアップのシナリオでは、1つのステージに必要な期間を5年として、4つのステージを20年かけて上がっていくと説明されているのだが、これではいくらなんでも遅すぎるように思えた。ただ、百年アーキテクチャ、って言ってるので、本気で100年を前提にするなら、その1/5の20年をかけるってのは、妥当ってことなのか。ケース・バイ・ケースなんでしょうけど、この時間感覚にはちょっと共感できなかった。

 

ビジネスにおいて企業のIT戦略が重要な地位を占めるようになっていく(※現在は、もう既になっていると思うけど)ので、企業のIT部門(情シス?)も成長していく必要がある。というのは、ずっと言われていることですね。今後は、今以上にビジネスにスピートが求められてくるとなると、多重請負構造による丸投げ開発っていう伝家の宝刀は、今までみたいには使えなくなりますね。

 

下記の図は、この書籍(P.133)でも紹介されている情報サービス産業協会(JISA)が2009年5月に今後5~10年間の業界構造変化についてまとめたもの(つまり10年前の資料)です。既に10年が経過していますが、まだ展望のようにはなってないかもしれません。しかし、これからベンダが生き残っていくためには右側(展望)で飯食えるようになっていかないと淘汰されるんでしょうね。

f:id:orinbou:20200224143828p:plain

巷では、DXレポート ~ITシステム「2025年の崖」克服とDXの本格的な展開~(METI/経済産業省)とかって言われてますし、最近の採用の動向を見てみても、IT企業じゃない企業(製造業や量販店など)のIT部門強化と思われる中途採用の求人も非常に多いので「全ての企業が“IT企業”に」っていう時代になりつつあるのを感じます。

 

books.rakuten.co.jp

 

*[本]業務システム開発モダナイゼーションガイド~非効率な日本のSIを変革する実践的ベストプラクティス~

f:id:orinbou:20200223133348p:plain

タテワリの壁(組織、契約、こころ、etc.)によって同じゴールを共有できてないことに起因して発生する諸問題への対応手段についてざっくり書いてありますねという所感(あと、全編にわたりMSワードで記載されていたという驚きもある)

 

日本特有の(?)多重請負構造が前提の方法論なので、理想はあまり高くなく、モダナイゼーション(最新化でなく近代化)という意味では納得。現実的に今よりマシにしていくための方法論について書かれており、アバンギャルドな刺激を求めている人、劇的に何かを変えたいと思っている人、既にこれらに取組んでいる人にとっては物足りなさを感じるかも。

 

最後に、もはやSIerっていうコトバがすっかり定着しているけど、もともと「System Integrator」だからSIorだろって思ったけど、まあ別にそんなことどうでもいいか。

 

books.rakuten.co.jp

みんなが欲しているもの(こと)

確か新卒でIT業界へ入社して1年目のことだったと思う。

「最近は、皆なんでもITだと騒いでるが、皆ちょっと思い違いをしている。ITはあくまでも手段。日本のメインはモノづくりなんだから勘違いしたらいかん。皆がほしいのはモノなんだから、ITはモノづくりを支えとけばいいんだ」

自動車部品の工場長をやっていた親戚のおじさんからこんなことを言われた。

もう20年近く前のことで言葉尻ははっきりと覚えていないが、確かそんな内容だったと思う。

当時、就職したばかりでITに未来を感じて働きはじめていた自分としては、故郷に帰ってこんな風に言われて肩身が狭く感じたものだった。他の親戚にも「どんな仕事をしているのか?」と聞かれてコンピュータで動かすプログラムを設計して書いているとか言っても全然伝わらなかった。親戚は、トヨタ関係の製造業や医者や学校の先生などの職業の人達が多かったのだけれどITについてよく分からないし、興味もない感じだった。

 

当時はそんな理由で、親戚と仕事の話をするのが面倒で嫌だったんだけれど、今となっては、そんなことはどうでも良い。ただ当時「皆が欲しているもの」を考えた時、多くの人が「モノ」を欲しがっていると思っていたことだ。

 

まだ「ドリルを売るには穴を売れ」なんて本も出てなかったし、UX(ユーザ体験)なんて言葉も知らなかった。何より自分もモノ(車)が好きで、安く購入できるスポーツタイプの車(シルビアとかMR2)乗ってたな。

 

時が流れてもITが手段ということに変わりはないけれど、商売するために必要不可欠なものになっていった。この流れは長沢さんの資料「ビジネスとITの図」が分かりやすい。

f:id:orinbou:20200126235922p:plain

最近ではUX(ユーザ体験)っていう言葉は一般的に使われていて、ユーザが欲しているのは(当時から既に)モノではなかったんじゃないかなと思う。例えば「冷蔵庫」というモノがなくても、食品や飲み物を冷やせれば別に冷蔵庫なんて要らないし、見たい映像が見れれば「テレビ」だって要らない。

 

確かに、かつて圧倒的にモノ不足だった時代があった訳で、モノという分かりやすいモノサシをつかってモノを所有することで満足感を得ていた時代があったということも理解できる。だけど、本質的にモノはモノであって、結局何かの目的のために存在している訳なので、その目的を満たせればモノは無くたっていい(はず)。かつてスターバックス創業者ハワード・シュルツが「スターバックスはコーヒーを売っているのではない。体験を売っているのだ。」と言ったのはけっこう有名な話。確かにスタバのコーヒーはそんなに美味しいと思ったことない(個人の感想です)。あの(Macbook広げたり参考書開いたりするリア充な)雰囲気を売ってるんだもんな。

 

これからDX(デジタルトランスフォーメーション)という名のもとに、ますますIT化が進むことになると思うけど、ITで飯を喰っている身としては、言われたものを淡々とつくっているだけでは死亡フラグが立つと思うので、今やっていること、今つくっているものがどんな体験や付加価値を提供できるのか?ということを考え抜いて行く必要があると思っている。

 

最後に、なんでこんなこと書いたかというと、当時は多くの人が当たり前だと思っていたことっていうのが、今では当たり前ではなくなっているにもかかわらず、残念ながらそれに囚われてしまっていることが多々あるように思う。ので自戒の意味で今年最初の記事を書いてみた。当時の親戚のおじさんから言われたことは、たぶん当時は半分は正解だったんだけど、残りの半分の本質的なところに長らく自分も気づけなかった(今も怪しいもんだ)。

 

そんな訳で、今年もよろしくお願いいたします。

2019年ふりかえり

今年は念願のJAWS-UGさいたま横浜)に何回か参加できた。

AWS Summit Tokyo 2019にも参加できたし、AWS-SAP(Solutions Architect Professional)も取得できたし、なんとAWS-re:Invent 2019シリコンバレー&ラスベガス)にも参加できた。

いろいろ問題もあったけど担当プロジェクトも何とかサービスインできた。

担当プロジェクトの追加機能開発では、顧客と一緒にスクラムで開発を進めることができてチームメンバがメキメキ成長している(※まだ仕掛中だけど)、、、

上記以外でも、Jenkins Days 2019へ参加してCloudBees川口さんと話せたし、それがキッカケでもともと興味があって触っていたJenkins Xも試せた。さらに、その流れでコンテナオーケストレーションツール(kubernetes)も触れた。

 

別に繋がると思ってなかったことが結果的にいろいろと繋がった年だったと思う。

 

今年も残すところあと6時間くらいになりましたが、来年は今年以上に繋がる年になったら良いな。そんな訳で、来年も精進します。

 

それでは、良いお年を

Jenkins Xを触ってみた(後編)

https://raw.githubusercontent.com/cdfoundation/artwork/master/jenkinsx/stacked/color/jenkinsx-stacked-color.png

CloudNativeなCI/CDパイプラインの本命 Jenkins X の「Serverless Jenkins X Pipelines with Tekton」を試してみました。

ちなみに前回記事はこちら(↓)

orinbou.hatenablog.com

※前回は Jenkins installation type「Static Jenkins Server and Jenkinsfiles」でした。

Using the Google Cloud Shell

今回は環境構築手順は下記の公式サイトを参考にしました。

https://github.com/jenkins-x/jx/releases/tag/v2.0.968

※よく見たらこのバージョン正式リリースじゃなくてプレスリリース版ですね。 ^^;

github.com

Google Cloud Platform(GCP)を準備

GCPダッシュボードから、新規プロジェクト(jenkins-x-demo-serverless)を作成します。

f:id:orinbou:20191109121151p:plain

プロジェクトを作成したら画面右上のCloud Shellボタンを押してWebコンソールを表示します。

f:id:orinbou:20191109121415p:plain

JenkinsXをインストールする

Google Cloud ShellのWebコンソールで下記コマンドを実行します。

$ curl -L https://github.com/jenkins-x/jx/releases/download/v2.0.968/jx-linux-amd64.tar.gz | tar xzv
$ sudo mv jx /usr/local/bin

バージョンを確認してみます。

$ jx version
NAME               VERSION
jx                 2.0.968
Kubernetes cluster v1.13.11-gke.9
kubectl            v1.13.11-dispatcher
helm client        Client: v2.14.1+g5270352
git                2.11.0
Operating System   Debian GNU/Linux 9.11 (stretch)

Google Cloud Shell は無料で利用できますが home ディレクトリ配下以外は永続化されないため注意してください(つまり本項でインストールした jx は永続化されません)

新規k8sクラスタを作成する

Google Cloud ShellのWebコンソールで下記コマンドを実行します。

$ jx create cluster gke --skip-login

Google Cloud Projectを選択します。

? Google Cloud Project:  [Use arrows to move, space to select, type to filter, ? for more help]
> jenkins-x-demo-serverless
  jenkins-x-demo-static

Google Cloud Zoneを選択します。

? Google Cloud Project: jenkins-x-demo-serverless
Updated property [core/project].
? No cluster name provided so using a generated one: mindtranslucent
? Defaulting to cluster type: Zonal
? Google Cloud Zone:  [Use arrows to move, space to select, type to filter, ? for more help]
  asia-east1-b
  asia-east1-c
  asia-east2-a
  asia-east2-b
  asia-east2-c
> asia-northeast1-a
  asia-northeast1-b
  asia-northeast1-c
  asia-northeast2-a
  asia-northeast2-b

Select Jenkins installation type(今回は【Serverless Jenkins X Pipelines with Tekton】)を選択します。(←★ココ重要!!)

? Google Cloud Project: jenkins-x-demo-serverless
Updated property [core/project].
? No cluster name provided so using a generated one: mindtranslucent
? Defaulting to cluster type: Zonal
? Google Cloud Zone: asia-northeast1-a
? Defaulting to machine type: n1-standard-2
? Defaulting to minimum number of nodes: 3
? Defaulting to maximum number of nodes: 5
? Defaulting use of preemptible VMs: No
? Defaulting access to Google Cloud Storage / Google Container Registry: Yes
? Defaulting enabling Cloud Build, Container Registry & Container Analysis API's: Yes
? Defaulting enabling Kaniko for building container images: No
Creating cluster...
WARNING: In November 2019, node auto-upgrade will be enabled by default for newly created clusters and node pools. To disable it, use the `--no-enable-autoupgrade`flag.
WARNING: Currently VPC-native is not the default mode during cluster creation. In the future, this will become the default mode and can be disabled using `--no-enable-ip-alias` flag. Use `--[no-]enable-ip-alias` flag to suppress this warning.
WARNING: Starting in 1.12, default node pools in new clusters will have their legacy Compute Engine instance metadata endpoints disabled by default. To create a cluster with legacy instance metadata endpoints disabled in the default node pool, run `clusters create` with the flag `--metadata disable-legacy-endpoints=true`.
WARNING: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s).
This will enable the autorepair feature for nodes. Please see https://cloud.google.com/kubernetes-engine/docs/node-auto-repair for more information on node autorepairs.
Creating cluster mindtranslucent in asia-northeast1-a...
...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................done.
Created [https://container.googleapis.com/v1/projects/jenkins-x-demo-serverless/zones/asia-northeast1-a/clusters/mindtranslucent].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/asia-northeast1-a/mindtranslucent?project=jenkins-x-demo-serverless
kubeconfig entry generated for mindtranslucent.
NAME             LOCATION           MASTER_VERSION  MASTER_IP     MACHINE_TYPE   NODE_VERSION   NUM_NODES  STATUS
mindtranslucent  asia-northeast1-a  1.13.11-gke.9   34.84.28.226  n1-standard-2  1.13.11-gke.9  3          RUNNING
Initialising cluster ...

? Select Jenkins installation type:  [Use arrows to move, space to select, type to filter]
> Serverless Jenkins X Pipelines with Tekton
  Static Jenkins Server and Jenkinsfiles

Domainを設定(今回は未指定。空のままEnter続行)します。

WARNING: When using tekton, only kaniko is supported as a builder
Namespace jx created
Context "gke_jenkins-x-demo-serverless_asia-northeast1-a_mindtranslucent" modified.
Setting the docker registry organisation to jenkins-x-demo-serverless in the TeamSettings
Git configured for user: orinbou and email sarubobo.com@gmail.com
Helm installed and configured
? No existing ingress controller found in the kube-system namespace, installing one: Yes
Cloning the Jenkins X versions repo https://github.com/jenkins-x/jenkins-x-versions.git with ref refs/heads/master to /home/sarubobo_com/.jx/jenkins-x-versions
? A local Jenkins X versions repository already exists, pulling the latest: Yes

Note: this loadbalancer will fail to be provisioned if you have insufficient quotas, this can happen easily on a GKE free account.
To view quotas run: gcloud compute project-info describe
Waiting for external loadbalancer to be created and update the nginx-ingress-controller service in kube-system namespace
External loadbalancer created
Waiting to find the external host name of the ingress controller Service in namespace kube-system with name jxing-nginx-ingress-controller
You can now configure a wildcard DNS pointing to the new Load Balancer address 35.243.71.113
If you don't have a wildcard DNS setup then create a DNS (A) record and point it at: 35.243.71.113, then use the DNS domain in the next input...

If you do not have a custom domain setup yet, Ingress rules will be set for magic DNS nip.io.
Once you have a custom domain ready, you can update with the command jx upgrade ingress --cluster
? Domain [? for help] (35.243.71.113.nip.io) 

GitHubユーザ名を設定します。

nginx ingress controller installed and configured
? Default enabling long term logs storage: Yes
No bucket name provided for long term storage, creating a new one
The bucket gs://mindtranslucent-lts-4f47dae0-dd2e-4bec-bb2a-ca735ac8a949 does not exist so lets create it
Set up a Git username and API token to be able to perform CI/CD
Creating a local Git user for GitHub server
? GitHub username: orinbou

GitHub連携用Tokenを設定します。 コンソールに表示されたURLをクリックしてGitHubのToken取得ページを開いてToken作成して設定します。

To be able to create a repository on GitHub we need an API Token
Please click this URL and generate a token
https://github.com/settings/tokens/new?scopes=repo,read:user,read:org,user:email,write:repo_hook,delete_repo

Then COPY the token and enter it below:

? API Token: ****************************************
Select the CI/CD pipelines Git server and user
? Do you wish to use GitHub as the pipelines Git server: Yes
Creating a pipelines Git user for GitHub server
To be able to create a repository on GitHub we need an API Token
Please click this URL and generate a token
https://github.com/settings/tokens/new?scopes=repo,read:user,read:org,user:email,write:repo_hook,delete_repo

Then COPY the token and enter it below:

? API Token: ****************************************

その後、いろいろ聞かれましたが基本Yesで設定しました。

Setting the pipelines Git server https://github.com and user name orinbou.
? A local Jenkins X versions repository already exists, pulling the latest: Yes
Enumerating objects: 1440, done.
Total 1440 (delta 0), reused 0 (delta 0), pack-reused 1440
Configuring Kaniko service account mindtranslucent-ko for project jenkins-x-demo-serverless
Unable to find service account mindtranslucent-ko, checking if we have enough permission to create
Creating service account mindtranslucent-ko
Assigning role roles/storage.admin
Assigning role roles/storage.objectAdmin
Assigning role roles/storage.objectCreator
Downloading service account key
Setting up prow config into namespace jx
Installing tekton into namespace jx
? A local Jenkins X versions repository already exists, pulling the latest: Yes

WARNING: waiting for install to be ready, if this is the first time then it will take a while to download images
Jenkins X deployments ready in namespace jx
Configuring the TeamSettings for ImportMode YAML
Creating default staging and production environments
? Select the organization where you want to create the environment repository: orinbou
Using Git provider GitHub at https://github.com
? Using Git user name: orinbou
? Using organisation: orinbou
Creating repository orinbou/environment-mindtranslucent-staging
Creating Git repository orinbou/environment-mindtranslucent-staging
Pushed Git repository to https://github.com/orinbou/environment-mindtranslucent-staging

Creating staging Environment in namespace jx
Created environment staging
Namespace jx-staging created
Creating GitHub webhook for orinbou/environment-mindtranslucent-staging for url http://hook.jx.35.243.71.113.nip.io/hook
Using Git provider GitHub at https://github.com
? Using Git user name: orinbou
? Using organisation: orinbou
Creating repository orinbou/environment-mindtranslucent-production
Creating Git repository orinbou/environment-mindtranslucent-production
Pushed Git repository to https://github.com/orinbou/environment-mindtranslucent-production

Creating production Environment in namespace jx
Created environment production
Namespace jx-production created
Creating GitHub webhook for orinbou/environment-mindtranslucent-production for url http://hook.jx.35.243.71.113.nip.io/hook

Jenkins X installation completed successfully


        ********************************************************

             NOTE: Your admin password is: XXXXXXXXXXXXXXXXXXXX

        ********************************************************


Your Kubernetes context is now set to the namespace: jx
To switch back to your original namespace use: jx namespace default
Or to use this context/namespace in just one terminal use: jx shell
For help on switching contexts see: https://jenkins-x.io/developing/kube-context/
To import existing projects into Jenkins:       jx import
To create a new Spring Boot microservice:       jx create spring -d web -d actuator
To create a new microservice from a quickstart: jx create quickstart
Fetching cluster endpoint and auth data.
kubeconfig entry generated for mindtranslucent.
Context "gke_jenkins-x-demo-serverless_asia-northeast1-a_mindtranslucent" modified.
NAME          HOSTS                                 ADDRESS         PORTS   AGE
chartmuseum   chartmuseum.jx.XXX.XXX.XXX.XXX.nip.io   XXX.XXX.XXX.XXX   80      2m57s
deck          deck.jx.XXX.XXX.XXX.XXX.nip.io          XXX.XXX.XXX.XXX   80      2m56s
hook          hook.jx.XXX.XXX.XXX.XXX.nip.io          XXX.XXX.XXX.XXX   80      2m57s
nexus         nexus.jx.XXX.XXX.XXX.XXX.nip.io         XXX.XXX.XXX.XXX   80      2m57s
tide          tide.jx.XXX.XXX.XXX.XXX.nip.io          XXX.XXX.XXX.XXX   80      2m57s

セットアップ完了したJenkinsX環境

GKEクラスタ画面でクラスタを確認できます。 f:id:orinbou:20191109124648p:plain

GKEワークロード画面でワークロードを確認できます。 f:id:orinbou:20191109124803p:plain

作成したクラスタは、マシンタイプ【n1-standard-2(vCPU x 2、メモリ 7.5 GB)】の3つのVMインスタンスで構成されていますね。

f:id:orinbou:20191109125247p:plain

セットアップが完了した環境へは下記のようなURLでWebブラウザからアクセスできます。

名前 URL
chartmuseum http://chartmuseum.jx.XXX.XXX.XXX.XXX.nip.io/
deck http://deck.jx.XXX.XXX.XXX.XXX.nip.io/
hook http://hook.jx.XXX.XXX.XXX.XXX.nip.io/
nexus http://nexus.jx.XXX.XXX.XXX.XXX.nip.io/
tide http://tide.jx.XXX.XXX.XXX.XXX.nip.io/

※ID/PWは、セットアップ時に表示されたもの(admin/XXXXXXXXXXXXXXXXXXXX)を使用します。

また、GitHubに新規リポジトリが作成されていることが確認できます。

新規プロジェクトを作成する(quickstart:spring boot)

Google Cloud ShellのWebコンソールで下記コマンドを実行します。
今回アプリ名(GitHubリポジトリ名)を「environment-mindtranslucent-serverless」としました。

jx create quickstart
? A local Jenkins X versions repository already exists, pulling the latest: Yes
? select the quickstart you wish to create spring-boot-http-gradle
Using Git provider GitHub at https://github.com
? Do you wish to use orinbou as the Git user name? Yes
? Who should be the owner of the repository? orinbou
? Enter the new repository name:  environment-mindtranslucent-serverless
Creating repository orinbou/environment-mindtranslucent-serverless
Generated quickstart at /home/sarubobo_com/environment-mindtranslucent-serverless
### NO charts folder /home/sarubobo_com/environment-mindtranslucent-serverless/charts/spring-boot-http-gradle
Created project at /home/sarubobo_com/environment-mindtranslucent-serverless
The directory /home/sarubobo_com/environment-mindtranslucent-serverless is not yet using git
? Would you like to initialise git now? Yes
? Commit message:  Initial import

Git repository created
selected pack: /home/sarubobo_com/.jx/draft/packs/github.com/jenkins-x-buildpacks/jenkins-x-kubernetes/packs/gradle
replacing placeholders in directory /home/sarubobo_com/environment-mindtranslucent-serverless
app name: environment-mindtranslucent-serverless, git server: github.com, org: orinbou, Docker registry org: jenkins-x-demo-serverless
skipping directory "/home/sarubobo_com/environment-mindtranslucent-serverless/.git"
Pushed Git repository to https://github.com/orinbou/environment-mindtranslucent-serverless
Creating GitHub webhook for orinbou/environment-mindtranslucent-serverless for url http://hook.jx.35.243.71.113.nip.io/hook

Watch pipeline activity via:    jx get activity -f environment-mindtranslucent-serverless -w
Browse the pipeline log via:    jx get build logs orinbou/environment-mindtranslucent-serverless/master
You can list the pipelines via: jx get pipelines
When the pipeline is complete:  jx get applications

For more help on available commands see: https://jenkins-x.io/developing/browsing/

Note that your first pipeline may take a few minutes to start while the necessary images get downloaded!

GitHubに新規リポジトリが作成されていることが確認できます。
https://github.com/orinbou/environment-mindtranslucent-serverless

上記リポジトリをローカルPCに clone して、masterブランチへpushもしくはpull requestによるマージが発生するとWebhookイベントにより自動的にGCP環境のJenkinsでビルドされデプロイまで自動的に実行されます。自動ビルド&デプロイはデフォルトでmasterブランチに対してのアクションのみです。前回のJenkins installation type「Static Jenkins Server and Jenkinsfiles」と同様に、masterブランチへpull requestを出した際、pull requestの動作確認用のワークロード(例:jx-orinbou-environment-mindtranslucent-serverless-pr-2)が起動しているため、ソースコードのレビューと一緒に動くアプリの確認もできます。

GitHubのPull-request画面 f:id:orinbou:20191109131650p:plain

Pull-request動作確認用アプリ画面 f:id:orinbou:20191109132958p:plain

PR動作確認用アプリのワークロードの様子 f:id:orinbou:20191109131448p:plain

また、前回のJenkins installation type「Static Jenkins Server and Jenkinsfiles」では、pull requestをmasterへマージして動作確認用のGCPワークロードが不要になっても自動で削除してくれなかったのですが、今回のJenkins installation type「Serverless Jenkins X Pipelines with Tekton」では、しっかり削除までやってくれました。

ビルドの履歴はProw Status画面(deck.jx.XXX.XXX.XXX.XXX.nip.io)で確認できます。

f:id:orinbou:20191109132352p:plain

さらに、下記URLで記載されているように

GitHubのPull-request画面などから、GitOpsによる操作(【例】テスト:/test、アサイン:/assign @orinbou)が可能です。

素晴らしい!イケてますね。これは本格的に使ってみたいですね。

ちなみにGitHubの画面から可能な操作の一覧は こちら です。

Jenkins X 構成要素(気になったもの)

今回試してみて気になった構成要素は下記のものになります。
また詳しく調べてみたいと思います。

Tekton Pipelines
https://tekton.dev/img/logos/tekton-horizontal-color.png

test-infra/prow at master · kubernetes/test-infra · GitHub
https://github.com/kubernetes/test-infra/raw/master/prow/logo_horizontal_solid.png

さいごに

この記事を書くのに10月に開催された Jenkins Day Japan 2019 へ参加して得られた情報とモチベーションに(あと身内からのプレッシャーにもw)助けられました。通常のJenkinsを自動車、そして、クラウドネイティブなJenkins Xを鉄道に例えて分かりやすく説明してくれた川口耕介さんをはじめイベントのスピーカーの皆様、どうもありがとうございました。

https://cloudbees.techmatrix.jp/wp-content/uploads/2019/08/JenkinsDay2019_top_br.png cloudbees.techmatrix.jp

あと、Jenkins X のイメキャラ(おじさんからロボットへ)正式に変わったんですかね?w

おまけ

今回はGCPでJenkins Xをつかってk8sクラスタ(×2:jenkins-x-demo-static、jenkins-x-demo-serverless)を約2日間動かした料金は下記のとおりでした。

f:id:orinbou:20191109143135p:plain

結構お高いので、不用意にクラスタを動かしっぱなしにしてしまわないよう十分ご注意を!!

参考