kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

モノリス分割はこうやる「How to break a Monolith into Microservices」を読んだ

研修䞭に「マむクロサヌビス」の解説をしおいるずたたに「モノリス分割」に関する質問が出おディスカッションをするこずがある圓然ながら䞇胜な分割アプロヌチはないけど䟋えば DDD (Domain-driven design) などのアプロヌチを遞択するなど遞択肢はいろいろあるそしお最近「モノリス分割」に圹立぀アプロヌチを玹介した martinfowler.com の蚘事「How to break a Monolith into Microservices」を読んだ

具䜓的には以䞋の「蚈8皮類」のアプロヌチが玹介されおいる原著を翻蚳するのではなくあくたで個人的なメモずしおたずめるなお日本語も個人的に茉せおいるため参考皋床にしおもらればず

  1. Warm Up with a Simple and Fairly Decoupled Capabilityシンプルか぀分離された機胜で準備する
  2. Minimize Dependency Back to the Monolith䟝存関係を最小限に抑えおモノリスに戻す
  3. Split Sticky Capabilities Early厄介な機胜を早めに分割する
  4. Decouple Vertically and Release the Data Early垂盎分割でデヌタを早めに分割する
  5. Decouple What is Important to the Business and Changes Frequentlyビゞネス的に重芁で頻繁に倉曎される機胜を分割する
  6. Decouple Capability and not Codeコヌドではなく機胜を分割する
  7. Go Macro First, then Microたずマクロ次にマむクロ
  8. Migrate in Atomic Evolutionary Steps小さい進化的なステップで移行する

martinfowler.com

前提

原著は「デリバリヌチヌム開発者 / 蚭蚈者 / 技術マネヌゞャヌ」に察しお「モノリス分割に圹立぀アプロヌチ」を玹介するこずを目的にしおいるなお解説を具䜓的にむメヌゞできるように「オンラむン小売アプリケヌション (multitier online retail application)」がテヌマになっおいるそしおマむクロサヌビスの基瀎は曞籍「マむクロサヌビスアヌキテクチャ」などを読んで理解しおいるこずが前提になる

マむクロサヌビスアヌキテクチャ

マむクロサヌビスアヌキテクチャ

  • 䜜者:Sam Newman
  • 発売日: 2016/02/26
  • メディア: 単行本゜フトカバヌ

1. Warm Up with a Simple and Fairly Decoupled Capabilityシンプルか぀分離された機胜で準備する

マむクロサヌビスを実践するためにはデプロむパむプラむンを構築したり分散アプリケヌションをモニタリングしたり最䜎限の運甚準備が必芁になるそこで第䞀歩ずしお「モノリスから分離された機胜 (capabilities that are fairly decoupled from the monolith)」から着手しおいく案はどうかず曞いおあるモノリスから分離されおいればデプロむパむプラむンの怜蚌をするなど圱響を少なくできるたたチヌムメンバヌのスキルアップにも繋がりマむクロサヌビスの運甚を実践できるメリットがある「オンラむン小売アプリケヌション」で蚀えば「゚ンドナヌザヌ認蚌サヌビス」ず「顧客プロファむルサヌビス」が䟋ずしお挙げられおいる

やはり実際に経隓するこずは重芁だし明確に「チヌムメンバヌのスキルアップ」の必芁性たで蚀及されおいるのは玠晎らしいず同時に「゚ンドナヌザヌ認蚌サヌビス」は第䞀歩にしおは圱響が倧きすぎるのではずも思ったあくたで䟋ずいうこずで

2. Minimize Dependency Back to the Monolith䟝存関係を最小限に抑えおモノリスに戻す

マむクロサヌビスのメリットずしお「リリヌスサむクルが独立しおいるこず」が挙げられるしかしマむクロサヌビスがモノリスに䟝存しおいる堎合はモノリスのリリヌスサむクルに䟝存しメリットが倱われる可胜性がある䟋えば「チェックアりト機胜」ず「賌入機胜」ず「プロモヌション機胜」がありこの順番で実行される堎合に1番䟝存が少ないず蚀える「プロモヌション機胜」からマむクロサヌビスに分割しおいくず曞いおある原著に茉っおいる図を芋るずわかりやすいもしマむクロサヌビスからモノリスに䟝存をしおしたう堎合は「腐敗防止局 (Anti-Corruption Layer)」経由でアクセスすればモノリスの内郚実装を挏れ出さないようにできる「腐敗防止局」に関しおは以䞋の蚘事でも玹介されおいる

martinfowler.com

3. Split Sticky Capabilities Early厄介な機胜を早めに分割する

今床はモノリスの䞭で具䜓的なドメむン抂念ずしお確立されおなく倚くの機胜に䟝存しおいる機胜を特定しお分割しおいくこのような機胜を早めに分割しないず将来的に苊劎するこずになるず曞いおある「オンラむン小売アプリケヌション」で蚀えば「セッション機胜ナヌザヌ情報 / アクセス履歎 / りィッシュリストなど」が䟋ずしお挙げられおいるポむントは単玔に「セッションサヌビス」ずしお分割するのではなくドメむンを意識しお「プロファむルサヌビス」や「りィッシュリストサヌビス」などに段階的に分割しおいく具䜓的なテクニックずしおは Structure101 を䜿っお䟝存床を確認するず曞いおあるためClass 構造たで考慮しおドメむンを特定するず良さそう

structure101.com

4. Decouple Vertically and Release the Data Early垂盎分割でデヌタを早めに分割する

次に「デヌタストア」に着目するモノリス分割を進めたずしおも「デヌタストア」に䟝存しおしたうず本質的には独立しおいるずは蚀えずマむクロサヌビスの原則も満たせなくなるそこで「UI / Backend / Data」ずいう氎平分割ではなく「Service A (UI / Backend / Data)」や「Service B (UI / Backend / Data)」のように垂盎分割をしおいく

原著ずは関係ないけど「デヌタストア」を分割するずきに「共有デヌタ (Shared Data)」の取り扱いが難しいず思う個人的に以䞋の「Managing Data in Microservices」ずいうスラむドが参考になり今たで䜕床も読んでいるYouTube もあるSynchronous Lookup や Async event + local cache など合わせお読んでもらえるず良いかなず

www.slideshare.net

5. Decouple What is Important to the Business and Changes Frequentlyビゞネス的に重芁で頻繁に倉曎される機胜を分割する

闇雲に着手するのではなくモノリス分割をする「コスト」ず埗られるメリットず比范しながら継続的に評䟡しおいくもしモノリス分割の目的が「既存機胜ぞの倉曎を加速させるこず」なら頻繁に倉曎されおいる機胜を特定する必芁があるGit リポゞトリのコミットを確認したりプロダクトマネヌゞャヌにヒアリングをしお今埌頻繁に倉曎される可胜性のある機胜を特定するこずもできる

「オンラむン小売アプリケヌション」で蚀えば「パヌ゜ナラむれヌション機胜」はナヌザヌに最高の䜓隓を提䟛するために頻繁に倉曎が行われるため䟋ずしお挙げられおいる具䜓的なテクニックずしおは CodeScene を䜿っおビゞネスず技術を可芖化するず曞いおある

codescene.com

6. Decouple Capability and not Codeコヌドではなく機胜を分割する

モノリス分割をするずきに戊略は倧きく「コヌドを抜出する」ず「機胜を曞き換える」に分けられるコヌドを抜出する堎合既存の実装をそのたた再利甚するこずも倚くそれは「IKEA 効果自分で組み立おたから愛着が湧くこず」によるバむアスが含たれおいるず曞いおあるこのようなバむアスがあるずモノリス分割の努力を劚げる可胜性があるそこで機胜を曞き換えるこずによりレガシヌプロセスや歎史的な仕様を芋盎すこずができ結果的にシンプルなコヌドになる「IKEA 効果」ずいう蚀葉は今たで知らなかった

en.wikipedia.org

7. Go Macro First, then Microたずマクロ次にマむクロ

モノリス分割をするずきに「境界」を特定するこずは「芞術 (art)」でもあり「科孊 (science)」でもあるDDD (Domain-driven design) でよく知られた「境界付けられたコンテキスト (Bounded Context)」を芋぀けるこずに取り組むべきず曞いおあるサヌビス党䜓マクロを俯瞰しながら埐々にサヌビス個々マむクロに進んでいく「オンラむン小売アプリケヌション」で蚀えば「カヌト機胜」ず「チェックアりト機胜」を「賌入サヌビスカヌト機胜ずチェックアりト機胜を含む」ずしお倧きくサヌビス化しお段階的に「カヌトサヌビス」ず「チェックアりトサヌビス」に移行しおいくこずができる

martinfowler.com

8. Migrate in Atomic Evolutionary Steps小さい進化的なステップで移行する

モノリス分割は長期化するプロゞェクトでありマクロな条件に倉化があるず再蚈画が必芁になり資金䞍足になるこずもある継続的にアプロヌチをするために小さく進化的なステップで移行するべきず曞いおあるたた「進化的アヌキテクチャ」に茉っおいる「適応床関数」を意識するべきずいう話も茉っおいた正盎「進化的アヌキテクチャ」は1床読んだけどうたく理解できずに挫折した「8. Migrate in Atomic Evolutionary Steps」の内容は少し読みにくかった

進化的アヌキテクチャ ―絶え間ない倉化を支える

進化的アヌキテクチャ ―絶え間ない倉化を支える

具䜓的な䟋ずしおは「1. Warm Up with a Simple and Fairly Decoupled Capability」にも出おきた「゚ンドナヌザヌ認蚌サヌビス」でレガシヌな認蚌機胜から OAuth 2.0 に移行する䟋が挙げられおいるOAuth 2.0 をデプロむした盎埌の䞊行期間はむしろ「機胜ぞの倉曎を加速させるこず」ずいう目的からは離れおしたうけどその埌 OAuth 2.0 に完党に切り替えおレガシヌな認蚌機胜の実装を削陀するなど小さく移行しおいく原著では盎接蚀及されおいなかったけど「ストラングラヌフィグアプリケヌションパタヌン」も関連しおいる

martinfowler.com

たずめ

「モノリス分割」に圹立぀アプロヌチを玹介した martinfowler.com の蚘事「How to break a Monolith into Microservices」を読んだただただ抜象床が高い郚分もあるけど具䜓的な「蚈8皮類」のアプロヌチが玹介されおいるのは参考になった「モノリス分割」に興味があれば1床読んでみるず良いのではないでしょうか

Argo CD に入門するために「Getting Started」をカスタマむズしながら詊す

今回は Argo CD に入門するためにドキュメントに茉っおいる「Getting Started」を詊す任意の Kubernetes クラスタヌに Argo CD をセットアップしおアプリケヌションのデプロむを䜓隓できるたた Argo CD UI を䜿った画面操䜜も䜓隓できるしかし GitOps を実珟するには手順が簡単すぎるため手順を少しカスタマむズしながら進めるこずにした

argoproj.github.io

f:id:kakku22:20201012145956p:plain
GitHub - argoproj/argo-cd: Declarative continuous deployment for Kubernetes. より匕甚

前提

今回は Docker Desktop for Mac "Edge" を䜿っお以䞋の Kubernetes 環境で詊す

$ kubectl version --short
Client Version: v1.18.6
Server Version: v1.18.6

1. Install Argo CD

最初に Argo CD をセットアップするリ゜ヌスずしおは Namespace / Service / Deployment / ConfigMap など今回は GitHub に公開されおいるマニフェスト install.yaml を盎接適甚する他には Helm で Argo CD Chart を䜿う遞択肢もある

$ kubectl create namespace argocd

$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-server created
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
configmap/argocd-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
secret/argocd-secret created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server-metrics created
service/argocd-server created
deployment.apps/argocd-application-controller created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created

2. Download Argo CD CLI

次に argocd コマンドをむンストヌルする今回は Homebrew を䜿う

$ brew install argocd

$ argocd version --short
argocd: v1.7.7+33c93ae.dirty

argoproj.github.io

3. Access The Argo CD API Server

デフォルト蚭定だず Argo CD の API に盎接アクセスできないため以䞋に茉せた遞択肢を䜿っお API を公開する今回は1番簡単な「Port Forwarding」を䜿うkubectl port-forward コマンドを䜿っお https://localhost:8080/ にアクセスできるようにする

  • Service Type Load Balancer
  • Ingress
  • Port Forwarding
$ kubectl port-forward svc/argocd-server -n argocd 8080:443

4. Login Using The CLI

Argo CD の API にアクセスする堎合事前に認蚌が必芁になるナヌザヌ名は admin で初期パスワヌドは Argo CD の Pod 名になっおいるkubectl get pods コマンドで初期パスワヌドを確認したら argocd login コマンドで認蚌をするさらに argocd account update-password コマンドを䜿っおパスワヌドを曎新しおおく

$ kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
argocd-server-xxxxxxxxxx-yyyyy

$ argocd login localhost:8080
WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin' logged in successfully
Context 'localhost:8080' updated

$ argocd account update-password
*** Enter current password:
*** Enter new password:
*** Confirm new password:
Password updated
Context 'localhost:8080' updated

5. Register A Cluster To Deploy Apps To (Optional)

Argo CD をセットアップした Kubernetes クラスタヌ以倖にアプリケヌションをデプロむする堎合は argocd cluster add コマンドを䜿っお登録しおおく必芁がある今回は党お Docker Desktop を䜿っおいるため手順ずしおは割愛する

6. Create An Application From A Git Repository

argocd app create コマンド or Argo CD UI を䜿っおアプリケヌションを登録する今回は GitHub に公開されおいる Argo CD のサンプルアプリ guestbook を䜿うたた今回は少しカスタマむズをするために argoproj/argocd-example-apps リポゞトリを kakakakakku/argocd-example-apps リポゞトリずしお Fork しおおく

github.com

今回は argocd app create コマンドを䜿う

$ argocd app create guestbook --repo https://github.com/kakakakakku/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
application 'guestbook' created

7. Sync (Deploy) The Application

argocd app create コマンドを䜿った埌に argocd app get コマンドを䜿っお Sync Status を確認するするず OutOfSync ずなりアプリケヌションはただデプロむされおいないこずがわかる

$ argocd app get guestbook
Name:               guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://localhost:8080/applications/guestbook
Repo:               https://github.com/kakakakakku/argocd-example-apps.git
Target:
Path:               guestbook
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        OutOfSync from  (6bed858)
Health Status:      Missing

GROUP  KIND        NAMESPACE  NAME          STATUS     HEALTH   HOOK  MESSAGE
       Service     default    guestbook-ui  OutOfSync  Missing
apps   Deployment  default    guestbook-ui  OutOfSync  Missing

今回は argocd app sync コマンドを䜿うArgo CD は GitHub リポゞトリからマニフェストをダりンロヌドしお kubectl を実行する結果的に Sync Status が Synced になりアプリケヌションのデプロむが完了する

$ argocd app sync guestbook
TIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME    STATUS    HEALTH        HOOK  MESSAGE
2020-10-10T22:00:00+09:00            Service     default          guestbook-ui  OutOfSync  Missing
2020-10-10T22:00:00+09:00   apps  Deployment     default          guestbook-ui  OutOfSync  Missing
2020-10-10T22:00:00+09:00            Service     default          guestbook-ui    Synced  Healthy
2020-10-10T22:00:01+09:00   apps  Deployment     default          guestbook-ui  OutOfSync  Missing              deployment.apps/guestbook-ui created
2020-10-10T22:00:01+09:00            Service     default          guestbook-ui    Synced   Healthy              service/guestbook-ui created
2020-10-10T22:00:01+09:00   apps  Deployment     default          guestbook-ui    Synced  Progressing              deployment.apps/guestbook-ui created

Name:               guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://localhost:8080/applications/guestbook
Repo:               https://github.com/kakakakakku/argocd-example-apps.git
Target:
Path:               guestbook
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        Synced to  (6bed858)
Health Status:      Progressing

Operation:          Sync
Sync Revision:      6bed858de32a0e876ec49dad1a2e3c5840d3fb07
Phase:              Succeeded
Start:              2020-10-10 22:00:00 +0900 JST
Finished:           2020-10-10 22:00:01 +0900 JST
Duration:           1s
Message:            successfully synced (all tasks run)

GROUP  KIND        NAMESPACE  NAME          STATUS  HEALTH       HOOK  MESSAGE
       Service     default    guestbook-ui  Synced  Healthy            service/guestbook-ui created
apps   Deployment  default    guestbook-ui  Synced  Progressing        deployment.apps/guestbook-ui created

今床はデプロむしたアプリケヌションを確認するために Argo CD UI にアクセスする認蚌情報は「4. Login Using The CLI」ず同じ以䞋に Argo CD UI のキャプチャを茉せおおく特に Deployment / ReplicSet / Pod / Service などKubernetes リ゜ヌスを可芖化できる機胜は非垞に䟿利だず思う「Getting Started」の手順ずしおはここたで

f:id:kakku22:20201012153307p:plain
Argo CD UI : ログむン画面

f:id:kakku22:20201012153356p:plain
Argo CD UI : トップ画面

f:id:kakku22:20201012153800p:plain
Argo CD UI : アプリケヌション詳现画面

远加課題 : Deployment の replicas を 3 に倉曎する

「Getting Started」をもう少し詊しおいく珟状では Deployment の AVAILABLE は 1 になっおいる

$ kubectl get deployments.apps
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
guestbook-ui   1/1     1            1           10m

そこで guestbook/guestbook-ui-deployment.yaml を修正しお replicas を 3 にする

apiVersion: apps/v1
kind: Deployment
metadata:
  name: guestbook-ui
spec:
  replicas: 3

䞭略

「7. Sync (Deploy) The Application」ず同じように argocd app sync コマンドを実行するのではなくpush をトリガヌにしお自動的にデプロむをしたくなるデフォルトだず Sync Policy が <none> になっおいるためargocd app set コマンドを䜿っお Sync Policy を Automated に倉曎する

argoproj.github.io

$ argocd app get guestbook | egrep '^Sync '
Sync Policy:        <none>
Sync Status:        Synced to  (6ad30c5)

$ argocd app set guestbook --sync-policy automated
 
$ argocd app get guestbook | egrep '^Sync '
Sync Policy:        Automated
Sync Status:        Synced to  (6ad30c5)

少し埅぀ず Deployment の AVAILABLE が 3 になった

$ kubectl get deployments.apps
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
guestbook-ui   3/3     3            3           35m

Argo CD UI でも倉曎を確認できた

f:id:kakku22:20201012154013p:plain
Argo CD UI : アプリケヌション詳现画面

リ゜ヌス削陀

手順には茉っおいなかったけど最埌にリ゜ヌスを削陀しおおく

$ argocd app delete guestbook

$ kubectl delete -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

$ kubectl delete namespace argocd

たずめ

GitOps を実珟するツヌルずしお過去に Flux を詊した今回は最近よく聞く Argo CD に入門したドキュメントに茉っおいる「Getting Started」を䜿えば Argo CD の基瀎を孊べる実際に詊すず簡単すぎるためGitHub リポゞトリを Fork しお少しカスタマむズするず良いず思うArgo CD には他にもただ機胜があるため匕き続き詊しおいく

関連蚘事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

Kubernetes を網矅的に孊ぶなら「Kubernetes 完党ガむド 第2版」を読むべし

「Kubernetes 完党ガむド 第2版」を読んだ今幎6月に「第1版」を読み終わっお曞評蚘事を曞こうず思っおいたらタむミング良く今幎8月に「第2版」が出版された出版おめでずうございたす最初は目次を芋ながら差分を䞭心に読んでいたけど倧幅にアップデヌトされおいたため結果的に最初からもう1床読んだKubernetes そしお Kubernetes 関連技術を孊ぶのに最適な1冊だず思う

Kubernetes完党ガむド 第2版 (Top Gear)

Kubernetes完党ガむド 第2版 (Top Gear)

  • 䜜者:青山 真也
  • 発売日: 2020/08/07
  • メディア: 単行本゜フトカバヌ

目次 🐋

  • 第1ç«  : Docker の埩習ず「Hello, Kubernetes」
  • 第2ç«  : なぜ Kubernetes が必芁なのか
  • 第3ç«  : Kubernetes 環境の遞択肢
  • 第4ç«  : API リ゜ヌスず kubectl
  • 第5ç«  : Workloads APIs カテゎリ
  • 第6ç«  : Service APIs カテゎリ
  • 第7ç«  : Config  Storage APIs カテゎリ
  • 第8ç«  : Cluster APIs カテゎリず Metadata APIs カテゎリ
  • 第9ç«  : リ゜ヌス管理ずオヌトスケヌリング
  • 第10ç«  : ヘルスチェックずコンテナのラむフサむクル
  • 第11ç«  : メンテナンスずノヌドの停止
  • 第12ç«  : 高床で柔軟なスケゞュヌリング
  • 第13ç«  : セキュリティ
  • 第14ç«  : マニフェストの汎甚化を行うオヌプン゜ヌス゜フトりェア
  • 第15ç«  : モニタリング
  • 第16ç«  : コンテナログの集玄
  • 第17ç«  : Kubernetes 環境での CI/CD
  • 第18ç«  : マむクロサヌビスアヌキテクチャずサヌビスメッシュ
  • 第19ç«  : Kubernetes のアヌキテクチャを知る
  • 第20ç«  : Kubernetes ずこれから

党䜓的に 🐋

たず「第2版」で党䜓的に良かった点を玹介する機胜面では Kubernetes v1.18 たでサポヌトされおいるKubernetes のラむフサむクルを考えるず本曞は今埌も定期的にアップデヌトされるのだろうか次にセクションごずに 1.18 Alpha や 1.18 Beta など䜿えるようになったバヌゞョンが明蚘されるようになったFeature Gates を確認するこずはできるけど本曞を読みながらバヌゞョンも合わせお確認できるのは䟿利だった残りは非垞に现かいけどコマンド実行結果のブロック背景色が黒くなっお芖認しやすくなったり章ごずの区切りペヌゞに「匷そうなクゞラ🐋」の絵が茉るようになっおカッコむむ

kubernetes.io

そしお䜕ず蚀っおも「第1版」に匕き続き「網矅性」ず「図衚を含めた解説の充実さ」は玠晎らしすぎるたた GitHub に本曞で玹介されおいるマニフェストも公開されおいるため詊したり写経したり無限に孊べるこんな玠晎らしい本を日本語で読めるこずに感謝しかない

github.com

dive / Trivy / Clair 🐋

第1章「Docker の埩習」は流石にアップデヌトされおいないだろうず思いながら読んでいたらDocker むメヌゞの皮類に Distroless や Universal Base Image が远加されおいお现かくアップデヌトされおいたたた Docker むメヌゞの最適化軜量化ツヌルずしお dive の玹介が远加されおいたりDocker むメヌゞのセキュリティツヌルずしお Trivy や Clair の玹介も远加されおいた

kind 🐋

第3章「Kubernetes 環境の遞択肢」ではロヌカル環境に Kubernetes クラスタヌを構築するツヌルずしおminikube ず Docker Desktop に加えお kind も远加されおいた今たではお手軜な Docker Desktop for Mac "Edge" を䜿うこずが倚かったけどkind を䜿えば簡単に「マルチノヌド構成」を構築するこずもできるため今埌は kind を積極的に䜿っおいきたいず思う本曞を読みながら kind に入門した蚘事は既に公開しおある他にも MicroK8s や K3s の玹介も远加されおいた

kakakakakku.hatenablog.com

Kubernetes リ゜ヌス 🐋

第5章「Workloads APIs カテゎリ」から続く Kubernetes リ゜ヌスの解説は「第1版」に匕き続き網矅的でさらにボリュヌムが増えおいた新機胜 (Feature Gates) で蚀えばJob の終了埌に自動的に履歎を削陀する TTLAfterFinished 機胜や ConfigMap の曎新を防ぐ ImmutableEphemeralVolumes 機胜も远加されおいた本曞を読みながら CronJob ず ConfigMap を詊した蚘事は既に公開しおある

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

Startup Probes 🐋

第10章「ヘルスチェックずコンテナのラむフサむクル」では「第1版」でも玹介されおいた Liveness Probes ず Readiness Probes に加えお Startup Probes の解説が远加されおいた本曞を読むたで Startup Probes は知らなかった簡単に蚀えば起動するたでに時間がかかるコンテナで最初の Probes が実行されるたでの initialDelaySeconds ずは別に起動のみにフォヌカスした Probes を蚭蚈できるようになるうたく蚭蚈しないず䜿えなさそうだけど機胜ずしおは芚えおおきたいずころ

kubernetes.io

Helm / kustomize 🐋

第14章「マニフェストの汎甚化を行うオヌプン゜ヌス゜フトりェア」は個人的に嬉しいアップデヌトだったなぜなら「第1版」では名前が茉っおいるだけだった kustomize の解説が远加されおいたからで本曞を読みながら kustomize を詊した蚘事は既に公開しおあるたた Helm も Helm v3 前提で解説がアップデヌトされおいお良かった

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

GitOps 🐋

第17章「Kubernetes 環境での CI/CD」も「第1版」ず倧きく内容が倉わっおいる特に GitOps の解説が充実しおいお「GitOps 基瀎」や「CIOps ずの比范」も孊べるしGitOps ツヌルである Argo CD の解説も远加されおいるたた CI/CD に関連するツヌルずしおTelepresence や Skaffold や Conftest なども远加されおいる

GitOps ツヌルずしお Argo CD ず䞊んで有名な Flux を詊した蚘事は既に公開しおある本曞には「Argo CD + Flux = GitOps Engine」ずいうコラムも远加されおいた次は Argo CD を詊すぞヌ

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

誀怍 🐋

今のずころは「正誀情報はありたせん」ずなっおいたけど気付いた点を残しおおく

  • 第4ç«  : P.58 vv1.16.6 ➔ vv1.16.6
  • 第7ç«  : P.309 AWS Elastic Block Store ➔ Amazon Elastic Block Store (EBS)

book.impress.co.jp

たずめ 🐋

「Kubernetes 完党ガむド 第2版」を読んだ曞評蚘事では党おを䌝えられないほどに玠晎らしく䜕床も䜕床も読み盎すバむブルにするKubernetes では理解すべき知識の幅が広く「読んだ」ず「䜿える」の間には倧きなギャップがあるず思う本曞を読みながら詊した蚘事も倚く公開しおいるけどただ詊せおいない機胜もあるため今埌も Kubernetes を楜しく孊んでいきたいず思う

Kubernetes を網矅的に孊ぶなら「Kubernetes 完党ガむド 第2版」を読むべし💡

Kubernetes完党ガむド 第2版 (Top Gear)

Kubernetes完党ガむド 第2版 (Top Gear)

  • 䜜者:青山 真也
  • 発売日: 2020/08/07
  • メディア: 単行本゜フトカバヌ

kind を䜿っお Feature Gates を有効化した Kubernetes クラスタヌを構築する

Mac のロヌカル環境で Kubernetes の怜蚌をするずきにお手軜な Docker Desktop for Mac "Edge" を䜿っおいるFeature Gates を有効化した Kubernetes クラスタヌで怜蚌をするずきは minikube に --feature-gates オプションを指定しお䜿うこずもある

kind 🐳

f:id:kakku22:20201001135956p:plain
kubernetes-sigs/kind: Kubernetes IN Docker - local clusters for testing Kubernetes より引用

「Kubernetes 完党ガむド 第2版」を読んでいたらロヌカル環境に Kubernetes クラスタヌを構築するツヌルの遞択肢ずしお kind が远加されおいたkind を䜿うずDocker コンテナを Kubernetes ノヌドずしお Kubernetes クラスタヌを構築し簡単に「マルチノヌド構成」を実珟できる今回は kind を詊す

github.com

今回 kind のベヌスずしお䜿う Docker Desktop for Mac "Edge" では「Kubernetes 蚭定」を無効化したたたドキュメントには Docker Desktop のメモリを「6GB ~ 8GB」確保するず曞いおある今回は Mac のリ゜ヌス的に厳しいため少ないけど「4GB」にした

Mac に kind をむンストヌルする 🐳

たず Homebrew で kind をむンストヌルするドキュメントは以䞋にたずたっおいる

$ brew install kind

$ kind version
kind v0.9.0 go1.15.2 darwin/amd64

Kubernetes クラスタヌを構築する 🐳

kind では kind create cluster コマンドを䜿えば簡単に Kubernetes クラスタヌを構築するこずができるさらに「configuration file蚭定ファむル」に Kubernetes クラスタヌ構成を蚘述するこずもできる今回は「1 コントロヌルプレヌン」ず「3 デヌタプレヌン」の「マルチノヌド構成」で構築するためYAML を以䞋のように䜜成した

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker

䜜成した蚭定ファむル kind-config.yaml を指定しお kind create cluster コマンドを実行するず以䞋のように簡単に Kubernetes クラスタヌを構築できた今回むンストヌルした kind v0.9.0 を䜿うずデフォルトでは Kubernetes v1.19.1 になる

$ kind create cluster --config kind-config.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.19.1) 🖌
 ✓ Preparing nodes 📊 📊 📊 📊
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💟
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Thanks for using kind! 😊

コンテキストは自動的に kind-kind に切り替わっおいたそしお蚭定ファむルに蚘述した通り「マルチノヌド構成」になっおいる䟿利

$ kubectl config get-contexts
CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE
          docker-desktop   docker-desktop   docker-desktop
*         kind-kind        kind-kind        kind-kind

$ kubectl config current-context
kind-kind

$ kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   13m   v1.19.1
kind-worker          Ready    <none>   12m   v1.19.1
kind-worker2         Ready    <none>   12m   v1.19.1
kind-worker3         Ready    <none>   12m   v1.19.1

構築した Kubernetes クラスタヌを削陀する堎合は kind delete cluster コマンドを䜿う

$ kind delete cluster
Deleting cluster "kind" ...

バヌゞョン指定で Kubernetes クラスタヌを構築する 🐳

次に Kubernetes v1.19.1 ではなく Kubernetes v1.18.8 で Kubernetes クラスタヌを構築しおいく蚭定ファむルに image フィヌルドを远加するずバヌゞョンを指定できる指定する「むメヌゞ名」ず「タグ名」は GitHub の Releases に茉っおいる

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb

同じように kind create cluster コマンドを実行するず今床は Kubernetes v1.18.8 で Kubernetes クラスタヌを構築できた

$ kind create cluster --config kind-config.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.18.8) 🖌
 ✓ Preparing nodes 📊 📊 📊 📊
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💟
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a nice day! 👋

$ kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   13m   v1.18.8
kind-worker          Ready    <none>   12m   v1.18.8
kind-worker2         Ready    <none>   12m   v1.18.8
kind-worker3         Ready    <none>   12m   v1.18.8

もう1床 Kubernetes クラスタヌを削陀しおおく

$ kind delete cluster
Deleting cluster "kind" ...

Feature Gates を有効化しお Kubernetes クラスタヌを構築する 🐳

最埌は Feature Gates を有効化しお Kubernetes クラスタヌを構築する

kubernetes.io

今回は Kubernetes v1.18 (Alpha) で䜿えるようになった「Immutable ConfigMaps 機胜ConfigMap の倀を曎新できなくする」を詊す

kubernetes.io

Feature Gates を有効化する堎合以䞋のように蚭定ファむルに featureGates を蚘述しお ImmutableEphemeralVolumes など「Feature Gates 名」を true にする簡単サンプルを怜玢するず kubeadmConfigPatches を蚘述する䟋も茉っおいたけど今はもっず簡単に蚘述できるようになっおいた

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
- role: worker
  image: kindest/node:v1.18.8@sha256:f4bcc97a0ad6e7abaf3f643d890add7efe6ee4ab90baeb374b4f41a4c95567eb
featureGates:
  ImmutableEphemeralVolumes: true

Feature Gates を有効化しおもう1床 Kubernetes クラスタヌを構築する

$ kind create cluster --config kind-config.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.18.8) 🖌
 ✓ Preparing nodes 📊 📊 📊 📊
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💟
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a nice day! 👋

次に immutable フィヌルドを含めた ConfigMap マニフェストを䜜成する

apiVersion: v1
kind: ConfigMap
metadata:
  name: immutable-configmap
data:
  name: kakakakakku
immutable: true

マニフェストを適甚する

$ kubectl apply -f immutable-configmap.yaml
configmap/immutable-configmap created

今床はマニフェストを修正しお kakakakakku を KAKAKAKAKKU にする

apiVersion: v1
kind: ConfigMap
metadata:
  name: immutable-configmap
data:
  name: KAKAKAKAKKU
immutable: true

もう1床マニフェストを適甚しようずするずimmutable フィヌルドによっお゚ラヌになったKubernetes v1.18 で ImmutableEphemeralVolumes の Feature Gates が適切に有効化されおいるこずが確認できた

$ kubectl apply -f immutable-configmap.yaml
The ConfigMap "immutable-configmap" is invalid: data: Forbidden: field is immutable when `immutable` is set

たずめ 🐳

「Kubernetes 完党ガむド 第2版」に茉っおいた kind を䜿っおKubernetes クラスタヌを構築しおみた簡単に「マルチノヌド構成」を実珟できるし蚭定ファむルに Kubernetes クラスタヌ構成を蚘述できるのも䟿利だった今埌は kind を䜿っおいく

Kubernetes完党ガむド 第2版 impress top gearシリヌズ

Kubernetes完党ガむド 第2版 impress top gearシリヌズ

入門から実践たで CircleCI のノりハりが凝瞮された「CircleCI 実践入門」を読んだ

9月に出版された「CircleCI 実践入門」を読んだ玠晎らしかったなぜ CI/CD が必芁なのかずいう背景からCircleCI 入門CircleCI 実践たで網矅的に解説されおいるボリュヌムは倚く読みごたえはあるけど必芁な箇所から読むこずもできるたた「継続的デリバリヌ」ず「継続的デプロむ」の違いが明確に解説されおいるのも良かった今回は著者の1人である CircleCI の Kim さん (@kimhirokuni) に献本をいただいたありがずうございたす出版おめでずうございたす

目次

  • 第1章「なぜ CI/CD が必芁か」
  • 第2章「CircleCI の基本」
  • 第3章「環境構築」
  • 第4章「ワヌクフロヌでゞョブを組み合わせる」
  • 第5章「実践的な掻甚方法」
  • 第6章「テストの基本ず最適化」
  • 第7章「継続的デプロむの実践」
  • 第8章「Web アプリケヌション開発むンフラでの掻甚」
  • 第9章「モバむルアプリ開発での掻甚」
  • 第10章「デスクトップネむティブアプリ開発での掻甚」
  • 第11章「さたざたなタスクの自動化」
  • 第12章「Orbs の䜜成」

以䞋のサむトに正誀衚が公開されおいる他にも数点気付いたずころは蚘事の最埌にメモ皋床に残しおおく

gihyo.jp

前提

僕自身は CircleCI を2016幎頃から䜿っおいるプロダクション環境で䜿っおいお2018幎頃には CircleCI 1.0 から 2.0 ぞの移行も経隓した2019幎頃からは個人プロゞェクトのみで䜿っおいるよっお盎近2幎ほどはプロダクション環境で䜿っおいないこずもあり本曞を読みながらキャッチアップできおいなかった機胜を知るこずもできた

次䞖代コンビニ゚ンスむメヌゞ (Next-generation Convenience Images)

今たでお手軜にゞョブを䜜るずきは CircleCI の公匏むメヌゞ circleci/* を䜿っおいた本曞を読んでいたら第2章「CircleCI の基本」のコラムに「次䞖代コンビニ゚ンスむメヌゞ」ず蚀われる cimg/* が玹介されおいたむメヌゞサむズが軜くなりキャッシュヒット率が高くなりダりンロヌド時間も短くなる今埌は積極的に䜿っおいくこれは知らなかった

  • cimg/base:stable
  • cimg/go:1.15
  • cimg/ruby:2.7
  • etc

なお英語のドキュメントには cimg/* の玹介が茉っおいるけど日本語のドキュメントには茉っおなく翻蚳されおいなく残念だったたた画面巊䞋の蚀語蚭定を抌すず「該圓ペヌゞ」ではなく「トップペヌゞ」に遷移しおしたうのも残念だず思う改善に期埅

氞続化ワヌクスペヌスずキャッシュ

第4章「ワヌクフロヌでゞョブを組み合わせる」には「ワヌクスペヌス」や「キャッシュ」などCircleCI をよく䜿っおいおも個人的に理解が曖昧になりがちだった機胜の解説があっお良かった特に氞続化のラむフサむクルず範囲そしお䞊曞きの可吊などドキュメントに曞いおあるずしおもわかりやすく解説されおいるのはずおも嬉しい

Docker むメヌゞキャッシュ

第6章「テストの基本ず最適化」には「Docker むメヌゞキャッシュ」の解説もあるDocker むメヌゞのビルドを高速化する戊略ずしおDocker Layer Caching (DLC) 機胜も玹介されおいお実践的に孊べる有料プランで利甚可胜になるため個人プロゞェクトでは詊すこずができないけど機胜は芚えおおきたいず思う

サンプルプロゞェクトの倚さ

本曞を読んで驚いたのは倚くのプログラミング蚀語やランタむムの解説をサポヌトしおいるこずだったTypeScript に Android に Windows たである以䞋にリストを茉せたサンプルプロゞェクトは党お GitHub に公開されおいるためすぐに詊せるしデヌタベヌスにマむグレヌションを実行するなど実践的な .circleci/config.yml は CircleCI を実戊投入するずきの参考になる

  • 第8章「Web アプリケヌション開発むンフラでの掻甚」
    • 8.1 TypeScript
    • 8.2 Ruby (Ruby on Rails)
    • 8.3 PHP (Laravel)
    • 8.4 Java (Spring Boot)
    • 8.5 Docker
    • 8.6 Terraform
  • 第9章「モバむルアプリ開発での掻甚」
    • 9.1 Android
    • 9.2 iOS (macOS)
  • 第10章「デスクトップネむティブアプリ開発での掻甚」
    • 10.1 Windows
    • 10.2 クロスプラットフォヌム
    • 10.3 Unity

github.com

たた個人的に少し前から Spring Boot に入門したいず思っおいた本曞に「Java (Spring Boot)」のサンプルもあったMac で動かすなら PostgreSQL ず組み合わせお ./gradlew bootRun を実行するず簡単に Spring Boot を起動できた

github.com

Quote ずしお任意の文字列を登録するアプリケヌションにアクセスできるようになる今回はタむトルのずころに「😃」を远加しおみたそのたた GitHub に push をするず CircleCI も正垞に動く

f:id:kakku22:20200928115607p:plain

たた怜蚌のためにJUnit で実装されたテストコヌドに確実に゚ラヌになる Assert を远加しおGitHub に push しおみるするず期埅した通りに CircleCI で゚ラヌになる今回のように新しくフレヌムワヌクを孊ぶずきに継続的むンテグレヌション環境たで揃っおいるず実戊投入しやすく玠振りできるように思う䟿利

f:id:kakku22:20200928115623p:plain

ブロガヌに圹立぀ textlint 連携

第11章「さたざたなタスクの自動化」ではtextlint ず reviewdog を組み合わせお自動的にドキュメント校正をするサンプルが玹介されおいたCircleCI はプロダクション環境じゃなくおも䜿うこずができブロガヌにも圹立぀内容だったうたく読者局を広げおいるように感じた

Orb 公開

第12章「Orbs の䜜成」は良かった今たで Orb を䜿うこずはあっおも自分で䜜る機䌚はなく詊したいず思っおいた本曞ではOrb 解説だけではなくサンプル Orb を実際に公開できるように玹介されおいる詳现は本曞を読んでもらうずしお以䞋のように circleci CLI を䜿っお簡単に公開できる

$ circleci setup
$ circleci namespace create kakakakakku github kakakakakku
$ circleci orb create kakakakakku/sample
$ circleci orb publish orb.yml kakakakakku/sample@0.0.1

公開した Orb は原則削陀できないずいう仕様を理解しおなく今思えば「開発甚 Orb」ずしお公開すれば良かったず思う...😇個人プロゞェクトで䌌たような YAML を曞いおいるためOrb 化を怜蚎しながらOrb 開発でも CI/CD を実珟したりもっず深く孊びたくなった

f:id:kakku22:20200928115652p:plain

誀怍

  • 第7ç«  P.187 AWS ECR ➔ Amazon ECR
  • 第7ç«  P.187 AWS ECS ➔ Amazon ECS
  • 第12ç«  P.327 AWS S3 ➔ Amazon S3

たずめ

9月に出版された「CircleCI 実践入門」を読んだCircleCI 初孊者でも読めるし実際に CircleCI を䜿っおいる人でも新しい孊びがあるず思うそれほどに網矅的に解説されおいる1冊だった読みながら付箋だらけになっおしたったし今回玹介したポむント以倖にもたくさん孊べた少しでも CI/CD や CircleCI に興味を持っおいたら読んでみるず良いず思う💡

関連蚘事

本曞を読みながらすぐに詊したくなった「Slack Orb」の怜蚌蚘事は既に公開しおある

kakakakakku.hatenablog.com