@k2works/claude-code-booster 4.15.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (758) hide show
  1. package/README.md +19 -0
  2. package/lib/assets/.claude/skills/apply-okf/SKILL.md +88 -0
  3. package/lib/assets/.claude/skills/apply-okf/evals/evals.json +8 -0
  4. package/lib/assets/.claude/skills/apply-okf/scripts/__pycache__/okf_apply.cpython-314.pyc +0 -0
  5. package/lib/assets/.claude/skills/apply-okf/scripts/okf_apply.py +397 -0
  6. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/benchmark.json +20 -0
  7. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/benchmark.md +13 -0
  8. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/eval_metadata.json +14 -0
  9. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/grading.json +39 -0
  10. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/adr/001-db.md +12 -0
  11. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/adr/002-cache-strategy.md +20 -0
  12. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/adr/index.md +4 -0
  13. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/design/data-model.md +12 -0
  14. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/design/index.md +3 -0
  15. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/index.md +10 -0
  16. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/log.md +7 -0
  17. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/operation/deploy-old.md +12 -0
  18. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/operation/deploy.md +12 -0
  19. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/operation/index.md +4 -0
  20. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  21. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/report.md +76 -0
  22. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/grading.json +39 -0
  23. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/adr/001-db.md +12 -0
  24. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/adr/002-cache-strategy.md +20 -0
  25. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/adr/index.md +4 -0
  26. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/design/data-model.md +12 -0
  27. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/design/index.md +3 -0
  28. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/index.md +10 -0
  29. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/log.md +7 -0
  30. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/operation/deploy-old.md +12 -0
  31. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/operation/deploy.md +12 -0
  32. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/operation/index.md +4 -0
  33. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  34. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/report.md +22 -0
  35. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/eval_metadata.json +13 -0
  36. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/grading.json +34 -0
  37. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/adr/001-db.md +12 -0
  38. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/adr/002-cache-strategy.md +11 -0
  39. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/adr/index.md +3 -0
  40. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/design/data-model.md +14 -0
  41. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/design/index.md +3 -0
  42. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/index.md +10 -0
  43. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/log.md +7 -0
  44. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/operation/deploy-old.md +12 -0
  45. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/operation/deploy.md +12 -0
  46. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/operation/index.md +4 -0
  47. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  48. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/report.md +61 -0
  49. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/grading.json +34 -0
  50. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/adr/001-db.md +12 -0
  51. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/adr/002-cache-strategy.md +11 -0
  52. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/adr/index.md +3 -0
  53. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/design/data-model.md +13 -0
  54. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/design/index.md +3 -0
  55. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/index.md +10 -0
  56. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/log.md +7 -0
  57. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/operation/deploy-old.md +12 -0
  58. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/operation/deploy.md +12 -0
  59. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/operation/index.md +4 -0
  60. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  61. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/report.md +18 -0
  62. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/eval_metadata.json +13 -0
  63. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/grading.json +34 -0
  64. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/adr/001-db.md +12 -0
  65. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/adr/002-cache-strategy.md +11 -0
  66. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/adr/index.md +3 -0
  67. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/design/data-model.md +12 -0
  68. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/design/index.md +3 -0
  69. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/index.md +10 -0
  70. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/log.md +7 -0
  71. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/operation/deploy-old.md +13 -0
  72. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/operation/deploy.md +12 -0
  73. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/operation/index.md +7 -0
  74. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  75. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/report.md +83 -0
  76. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/grading.json +34 -0
  77. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/adr/001-db.md +12 -0
  78. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/adr/002-cache-strategy.md +11 -0
  79. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/adr/index.md +3 -0
  80. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/design/data-model.md +12 -0
  81. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/design/index.md +3 -0
  82. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/index.md +10 -0
  83. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/log.md +7 -0
  84. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/operation/deploy-old.md +14 -0
  85. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/operation/deploy.md +12 -0
  86. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/operation/index.md +4 -0
  87. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  88. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/report.md +15 -0
  89. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/review.html +1325 -0
  90. package/lib/assets/.claude/skills/closing-iteration/SKILL.md +16 -0
  91. package/lib/assets/.claude/skills/creating-adr/SKILL.md +4 -0
  92. package/lib/assets/.claude/skills/creating-journal/SKILL.md +12 -1
  93. package/lib/assets/.claude/skills/creating-manual/SKILL.md +199 -199
  94. package/lib/assets/.claude/skills/migrating-okf/SKILL.md +149 -0
  95. package/lib/assets/.claude/skills/migrating-okf/evals/evals.json +23 -0
  96. package/lib/assets/.claude/skills/migrating-okf/scripts/__pycache__/okf_check.cpython-314.pyc +0 -0
  97. package/lib/assets/.claude/skills/migrating-okf/scripts/okf_check.py +468 -0
  98. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/benchmark.json +20 -0
  99. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/benchmark.md +13 -0
  100. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/eval_metadata.json +15 -0
  101. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/grading.json +44 -0
  102. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/adr/index.md +10 -0
  103. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/index.md +15 -0
  104. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/log.md +5 -0
  105. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +966 -0
  106. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference/index.md +6 -0
  107. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +261 -0
  108. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +480 -0
  109. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +681 -0
  110. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/report.md +85 -0
  111. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/grading.json +44 -0
  112. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/adr/index.md +8 -0
  113. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/index.md +11 -0
  114. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/log.md +7 -0
  115. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +964 -0
  116. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference/index.md +9 -0
  117. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +250 -0
  118. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +469 -0
  119. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +677 -0
  120. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/report.md +49 -0
  121. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/eval_metadata.json +13 -0
  122. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/grading.json +34 -0
  123. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/knowledge_after/index.md +7 -0
  124. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/knowledge_after/log.md +7 -0
  125. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/knowledge_after/metrics/churn.md +9 -0
  126. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/knowledge_after/metrics/income-statement.md +15 -0
  127. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/report.md +147 -0
  128. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/review.html +1325 -0
  129. package/lib/assets/.claude/skills/opening-iteration/SKILL.md +15 -0
  130. package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +4 -1
  131. package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +2 -0
  132. package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +3 -1
  133. package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +4 -1
  134. package/lib/assets/.claude/skills/planning-releases/SKILL.md +2 -0
  135. package/lib/assets/.env.example +9 -0
  136. package/lib/assets/AGENTS.md +8 -0
  137. package/lib/assets/CLAUDE.md +218 -201
  138. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +9 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +9 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +9 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +9 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +9 -0
  143. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +9 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +9 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +10 -1
  146. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +9 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +9 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +9 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +9 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +9 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +9 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +9 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +9 -0
  154. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +9 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +9 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +10 -1
  157. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +9 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +9 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +9 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +9 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +9 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +9 -0
  163. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +9 -0
  164. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +9 -0
  165. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +9 -0
  166. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +9 -0
  167. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +9 -0
  168. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +9 -0
  169. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +9 -0
  170. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +9 -0
  171. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +9 -0
  172. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +9 -0
  173. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +9 -0
  174. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +9 -0
  175. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +9 -0
  176. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +9 -0
  177. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +9 -0
  178. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +9 -0
  179. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +9 -0
  180. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +9 -0
  181. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +9 -0
  182. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +3 -3
  183. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +9 -0
  184. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +9 -0
  185. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +9 -0
  186. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +9 -0
  187. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +9 -0
  188. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +9 -0
  189. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +9 -0
  190. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +9 -0
  191. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +9 -0
  192. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +9 -0
  193. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +9 -0
  194. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +9 -0
  195. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +9 -0
  196. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +9 -0
  197. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +9 -0
  198. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +9 -0
  199. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +9 -0
  200. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +9 -0
  201. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +9 -0
  202. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +9 -0
  203. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +9 -0
  204. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +9 -0
  205. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +22 -22
  206. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +9 -0
  207. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +9 -0
  208. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +9 -0
  209. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +9 -0
  210. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +9 -0
  211. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +9 -0
  212. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +9 -0
  213. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +9 -0
  214. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +9 -0
  215. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +9 -0
  216. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +9 -0
  217. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +9 -0
  218. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +9 -0
  219. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +9 -0
  220. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +9 -0
  221. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +9 -0
  222. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +9 -0
  223. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +9 -0
  224. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +9 -0
  225. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +9 -0
  226. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +9 -0
  227. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +9 -0
  228. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +9 -0
  229. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +9 -0
  230. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +9 -0
  231. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +9 -0
  232. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +9 -0
  233. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +9 -0
  234. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +9 -0
  235. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +9 -0
  236. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +9 -0
  237. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +9 -0
  238. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +9 -0
  239. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +9 -0
  240. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +9 -0
  241. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +9 -0
  242. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +9 -0
  243. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +9 -0
  244. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +9 -0
  245. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +9 -0
  246. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +9 -0
  247. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +9 -0
  248. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +9 -0
  249. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +9 -0
  250. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +9 -0
  251. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +9 -0
  252. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +9 -0
  253. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +9 -0
  254. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +9 -0
  255. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +9 -0
  256. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +9 -0
  257. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +9 -0
  258. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +9 -0
  259. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +9 -0
  260. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +9 -0
  261. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +9 -0
  262. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +9 -0
  263. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +9 -0
  264. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +9 -0
  265. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +9 -0
  266. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +9 -0
  267. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +9 -0
  268. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +9 -0
  269. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +9 -0
  270. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +9 -0
  271. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +9 -0
  272. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +9 -0
  273. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +9 -0
  274. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +9 -0
  275. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +9 -0
  276. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +9 -0
  277. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +9 -0
  278. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +9 -0
  279. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +9 -0
  280. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +9 -0
  281. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +9 -0
  282. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +9 -0
  283. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +9 -0
  284. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +9 -0
  285. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +9 -0
  286. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +9 -0
  287. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +9 -0
  288. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +9 -0
  289. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +9 -0
  290. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +9 -0
  291. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +9 -0
  292. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +9 -0
  293. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +9 -0
  294. package/lib/assets/docs/article/getting-start-docker-kubernetes/01-container-and-docker-basics.md +341 -332
  295. package/lib/assets/docs/article/getting-start-docker-kubernetes/02-container-deployment.md +785 -776
  296. package/lib/assets/docs/article/getting-start-docker-kubernetes/03-practical-container-build-deploy.md +466 -457
  297. package/lib/assets/docs/article/getting-start-docker-kubernetes/04-multi-container-application.md +878 -869
  298. package/lib/assets/docs/article/getting-start-docker-kubernetes/05-kubernetes-introduction.md +585 -576
  299. package/lib/assets/docs/article/getting-start-docker-kubernetes/06-kubernetes-deploy-cluster.md +620 -611
  300. package/lib/assets/docs/article/getting-start-docker-kubernetes/07-kubernetes-advanced.md +621 -612
  301. package/lib/assets/docs/article/getting-start-docker-kubernetes/08-kubernetes-packaging.md +518 -509
  302. package/lib/assets/docs/article/getting-start-docker-kubernetes/09-container-operations.md +546 -537
  303. package/lib/assets/docs/article/getting-start-docker-kubernetes/10-optimal-container-image.md +640 -631
  304. package/lib/assets/docs/article/getting-start-docker-kubernetes/11-continuous-delivery.md +607 -598
  305. package/lib/assets/docs/article/getting-start-docker-kubernetes/12-container-use-cases.md +463 -454
  306. package/lib/assets/docs/article/getting-start-docker-kubernetes/13-case-monolith-compose-vs-kustomize.md +346 -337
  307. package/lib/assets/docs/article/getting-start-docker-kubernetes/14-case-event-driven-kustomize-vs-helm.md +324 -315
  308. package/lib/assets/docs/article/getting-start-docker-kubernetes/15-case-escqrs-axon-kustomize-vs-helm.md +297 -288
  309. package/lib/assets/docs/article/getting-start-docker-kubernetes/16-case-escqrs-kafka-kustomize-vs-helm.md +256 -247
  310. package/lib/assets/docs/article/getting-start-docker-kubernetes/17-case-comparison-summary.md +141 -132
  311. package/lib/assets/docs/article/getting-start-docker-kubernetes/18-case-load-testing.md +303 -294
  312. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-a-dev-tools-setup.md +274 -265
  313. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-b-orchestration-environments.md +530 -521
  314. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-c-tips.md +519 -510
  315. package/lib/assets/docs/article/getting-start-docker-kubernetes/outline.md +220 -211
  316. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +9 -0
  317. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +9 -0
  318. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +9 -0
  319. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +9 -0
  320. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +9 -0
  321. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +9 -0
  322. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +9 -0
  323. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +9 -0
  324. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +9 -0
  325. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +9 -0
  326. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +9 -0
  327. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +9 -0
  328. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +9 -0
  329. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +9 -0
  330. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +9 -0
  331. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +9 -0
  332. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +9 -0
  333. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +9 -0
  334. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +9 -0
  335. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +9 -0
  336. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +9 -0
  337. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +9 -0
  338. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +9 -0
  339. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +9 -0
  340. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +9 -0
  341. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +9 -0
  342. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +9 -0
  343. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +9 -0
  344. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +9 -0
  345. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +9 -0
  346. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +9 -0
  347. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +9 -0
  348. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +9 -0
  349. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +9 -0
  350. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +9 -0
  351. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +9 -0
  352. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +2 -2
  353. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +9 -0
  354. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +9 -0
  355. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +9 -0
  356. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +9 -0
  357. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +9 -0
  358. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +9 -0
  359. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +9 -0
  360. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +9 -0
  361. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +9 -0
  362. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +9 -0
  363. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +9 -0
  364. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +9 -0
  365. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +9 -0
  366. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +9 -0
  367. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +9 -0
  368. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +9 -0
  369. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +9 -0
  370. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +9 -0
  371. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +8 -0
  372. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +8 -0
  373. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +8 -0
  374. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +8 -0
  375. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +8 -0
  376. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +8 -0
  377. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +9 -0
  378. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +9 -0
  379. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +9 -0
  380. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +9 -0
  381. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +9 -0
  382. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +9 -0
  383. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +9 -0
  384. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +9 -0
  385. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +9 -0
  386. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +9 -0
  387. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +9 -0
  388. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +9 -0
  389. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +9 -0
  390. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +9 -0
  391. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +9 -0
  392. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +9 -0
  393. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +9 -0
  394. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +9 -0
  395. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +9 -0
  396. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +9 -0
  397. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +9 -0
  398. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +9 -0
  399. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +9 -0
  400. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +9 -0
  401. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +9 -0
  402. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +9 -0
  403. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +9 -0
  404. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +9 -0
  405. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +9 -0
  406. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +9 -0
  407. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +9 -0
  408. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +9 -0
  409. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +9 -0
  410. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +9 -0
  411. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +9 -0
  412. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +9 -0
  413. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +9 -0
  414. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +9 -0
  415. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +9 -0
  416. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +9 -0
  417. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +9 -0
  418. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +9 -0
  419. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +9 -0
  420. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +9 -0
  421. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +9 -0
  422. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +9 -0
  423. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +9 -0
  424. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +9 -0
  425. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +8 -0
  426. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +8 -0
  427. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +8 -0
  428. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +8 -0
  429. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +8 -0
  430. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +8 -0
  431. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +9 -0
  432. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +9 -0
  433. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +9 -0
  434. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +9 -0
  435. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +9 -0
  436. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +9 -0
  437. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +9 -0
  438. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +9 -0
  439. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +9 -0
  440. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +9 -0
  441. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +9 -0
  442. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +9 -0
  443. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +9 -0
  444. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +9 -0
  445. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +9 -0
  446. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +9 -0
  447. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +9 -0
  448. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +9 -0
  449. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +9 -0
  450. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +9 -0
  451. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +9 -0
  452. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +9 -0
  453. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +9 -0
  454. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +9 -0
  455. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +9 -0
  456. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +9 -0
  457. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +9 -0
  458. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +9 -0
  459. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +9 -0
  460. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +9 -0
  461. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +9 -0
  462. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +9 -0
  463. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +9 -0
  464. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +9 -0
  465. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +9 -0
  466. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +9 -0
  467. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +9 -0
  468. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +9 -0
  469. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +9 -0
  470. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +9 -0
  471. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +9 -0
  472. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +9 -0
  473. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +9 -0
  474. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +9 -0
  475. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +9 -0
  476. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +9 -0
  477. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +9 -0
  478. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +9 -0
  479. package/lib/assets/docs/article/grokking-concurrency/all/index.md +0 -1
  480. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +9 -0
  481. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +9 -0
  482. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +9 -0
  483. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +9 -0
  484. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +9 -0
  485. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +9 -0
  486. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +9 -0
  487. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +9 -0
  488. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +0 -10
  489. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +6 -7
  490. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +6 -7
  491. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +6 -7
  492. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +6 -7
  493. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +6 -7
  494. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +6 -7
  495. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +6 -7
  496. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +6 -7
  497. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +0 -10
  498. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +6 -7
  499. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +6 -7
  500. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +6 -7
  501. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +6 -7
  502. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +6 -7
  503. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +6 -7
  504. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +6 -7
  505. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +6 -7
  506. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +0 -10
  507. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +6 -7
  508. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +6 -7
  509. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +6 -7
  510. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +6 -7
  511. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +6 -7
  512. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +6 -7
  513. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +6 -7
  514. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +6 -7
  515. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +0 -10
  516. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +6 -7
  517. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +6 -7
  518. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +6 -7
  519. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +6 -7
  520. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +6 -7
  521. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +6 -7
  522. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +6 -7
  523. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +6 -7
  524. package/lib/assets/docs/article/grokking-concurrency/java/index.md +0 -10
  525. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +8 -9
  526. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +8 -9
  527. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +7 -8
  528. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +8 -9
  529. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +7 -8
  530. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +6 -7
  531. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +6 -7
  532. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +6 -7
  533. package/lib/assets/docs/article/grokking-concurrency/python/index.md +0 -10
  534. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +7 -8
  535. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +10 -11
  536. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +8 -9
  537. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +8 -9
  538. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +9 -10
  539. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +9 -10
  540. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +9 -10
  541. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +8 -9
  542. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +0 -10
  543. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +6 -7
  544. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +6 -7
  545. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +6 -7
  546. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +6 -7
  547. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +6 -7
  548. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +6 -7
  549. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +6 -7
  550. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +6 -7
  551. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +0 -10
  552. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +6 -7
  553. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +6 -7
  554. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +6 -7
  555. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +6 -7
  556. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +6 -7
  557. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +6 -7
  558. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +6 -7
  559. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +6 -7
  560. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +9 -0
  561. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +9 -0
  562. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +9 -0
  563. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +9 -0
  564. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +9 -0
  565. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +9 -0
  566. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +9 -0
  567. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +9 -0
  568. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +9 -0
  569. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +9 -0
  570. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +9 -0
  571. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +9 -0
  572. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +9 -0
  573. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +9 -0
  574. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +9 -0
  575. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +9 -0
  576. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +9 -0
  577. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +9 -0
  578. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +9 -0
  579. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +9 -0
  580. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +9 -0
  581. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +9 -0
  582. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +9 -0
  583. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +9 -0
  584. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +9 -0
  585. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +9 -0
  586. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +9 -0
  587. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +9 -0
  588. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +9 -0
  589. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +9 -0
  590. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +9 -0
  591. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +9 -0
  592. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +9 -0
  593. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +9 -0
  594. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +9 -0
  595. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +9 -0
  596. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +9 -0
  597. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +9 -0
  598. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +9 -0
  599. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +9 -0
  600. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +9 -0
  601. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +9 -0
  602. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +9 -0
  603. package/lib/assets/docs/article/grokkingfp/java/part-1.md +9 -0
  604. package/lib/assets/docs/article/grokkingfp/java/part-2.md +9 -0
  605. package/lib/assets/docs/article/grokkingfp/java/part-3.md +9 -0
  606. package/lib/assets/docs/article/grokkingfp/java/part-4.md +9 -0
  607. package/lib/assets/docs/article/grokkingfp/java/part-5.md +9 -0
  608. package/lib/assets/docs/article/grokkingfp/java/part-6.md +9 -0
  609. package/lib/assets/docs/article/grokkingfp/python/part-1.md +9 -0
  610. package/lib/assets/docs/article/grokkingfp/python/part-2.md +9 -0
  611. package/lib/assets/docs/article/grokkingfp/python/part-3.md +9 -0
  612. package/lib/assets/docs/article/grokkingfp/python/part-4.md +9 -0
  613. package/lib/assets/docs/article/grokkingfp/python/part-5.md +9 -0
  614. package/lib/assets/docs/article/grokkingfp/python/part-6.md +9 -0
  615. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +9 -0
  616. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +9 -0
  617. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +9 -0
  618. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +9 -0
  619. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +9 -0
  620. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +9 -0
  621. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +9 -0
  622. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +9 -0
  623. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +9 -0
  624. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +9 -0
  625. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +9 -0
  626. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +9 -0
  627. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +9 -0
  628. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +9 -0
  629. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +9 -0
  630. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +9 -0
  631. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +9 -0
  632. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +9 -0
  633. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +9 -0
  634. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +9 -0
  635. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +9 -0
  636. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +9 -0
  637. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +9 -0
  638. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +9 -0
  639. package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +9 -0
  640. package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +9 -0
  641. package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +9 -0
  642. package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +9 -0
  643. package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +9 -0
  644. package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +9 -0
  645. package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +9 -0
  646. package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +9 -0
  647. package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +9 -0
  648. package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +9 -0
  649. package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +9 -0
  650. package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +9 -0
  651. package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +9 -0
  652. package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +9 -0
  653. package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +9 -0
  654. package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +9 -0
  655. package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +9 -0
  656. package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +9 -0
  657. package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +9 -0
  658. package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +9 -0
  659. package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +9 -0
  660. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +9 -0
  661. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +9 -0
  662. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +9 -0
  663. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +9 -0
  664. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +9 -0
  665. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +9 -0
  666. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +9 -0
  667. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +9 -0
  668. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +9 -0
  669. package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +9 -0
  670. package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +9 -0
  671. package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +9 -0
  672. package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +9 -0
  673. package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +9 -0
  674. package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +9 -0
  675. package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +9 -0
  676. package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +8 -0
  677. package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +8 -0
  678. package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +8 -0
  679. package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +8 -0
  680. package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +9 -0
  681. package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +9 -0
  682. package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +9 -0
  683. package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +9 -0
  684. package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +9 -0
  685. package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +9 -0
  686. package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +9 -0
  687. package/lib/assets/docs/article/practical-database-design/study/study2-1.md +9 -0
  688. package/lib/assets/docs/article/practical-database-design/study/study2-2.md +9 -0
  689. package/lib/assets/docs/article/practical-database-design/study/study2-3.md +9 -0
  690. package/lib/assets/docs/article/practical-database-design/study/study2-4.md +9 -0
  691. package/lib/assets/docs/article/practical-database-design/study/study2-5.md +9 -0
  692. package/lib/assets/docs/article/practical-database-design/study/study3-1.md +9 -0
  693. package/lib/assets/docs/article/practical-database-design/study/study3-2.md +9 -0
  694. package/lib/assets/docs/article/practical-database-design/study/study3-3.md +9 -0
  695. package/lib/assets/docs/article/practical-database-design/study/study3-4.md +9 -0
  696. package/lib/assets/docs/article/practical-database-design/study/study3-5.md +9 -0
  697. package/lib/assets/docs/article/practical-database-design/study/study4-1.md +9 -0
  698. package/lib/assets/docs/article/practical-database-design/study/study4-2.md +9 -0
  699. package/lib/assets/docs/article/practical-database-design/study/study4-3.md +9 -0
  700. package/lib/assets/docs/article/practical-database-design/study/study4-4.md +9 -0
  701. package/lib/assets/docs/article/practical-database-design/study/study4-5.md +9 -0
  702. package/lib/assets/docs/index.md +4 -0
  703. package/lib/assets/docs/log.md +5 -0
  704. package/lib/assets/docs/operation/index.md +15 -1
  705. package/lib/assets/docs/reference/CodexCLIMCP/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/343/203/225/343/203/255/343/203/274.md +13 -4
  706. package/lib/assets/docs/reference/CodexCLIMCP/343/202/265/343/203/274/343/203/220/343/203/274/350/250/255/345/256/232/346/211/213/351/240/206.md +10 -0
  707. package/lib/assets/docs/reference/Java/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +11 -1
  708. package/lib/assets/docs/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  709. package/lib/assets/docs/reference/SonarQube/343/203/255/343/203/274/343/202/253/343/203/253/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +10 -0
  710. package/lib/assets/docs/reference/TypeScript/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +11 -1
  711. package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  712. package/lib/assets/docs/reference/Vim/346/223/215/344/275/234/343/203/236/343/203/213/343/203/245/343/202/242/343/203/253.md +177 -168
  713. package/lib/assets/docs/reference/index.md +54 -53
  714. package/lib/assets/docs/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +7 -8
  715. package/lib/assets/docs/reference//343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  716. package/lib/assets/docs/reference//343/202/244/343/203/263/343/203/225/343/203/251/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  717. package/lib/assets/docs/reference//343/202/250/343/202/257/343/202/271/343/203/210/343/203/252/343/203/274/343/203/240/343/203/227/343/203/255/343/202/260/343/203/251/343/203/237/343/203/263/343/202/260.md +6 -7
  718. package/lib/assets/docs/reference//343/202/263/343/203/274/343/203/207/343/202/243/343/203/263/343/202/260/343/201/250/343/203/206/343/202/271/343/203/210/343/202/254/343/202/244/343/203/211.md +10 -1
  719. package/lib/assets/docs/reference//343/203/206/343/202/271/343/203/210/346/210/246/347/225/245/343/202/254/343/202/244/343/203/211.md +10 -1
  720. package/lib/assets/docs/reference//343/203/207/343/203/274/343/202/277/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  721. package/lib/assets/docs/reference//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  722. package/lib/assets/docs/reference//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/345/210/206/346/236/220/343/202/254/343/202/244/343/203/211.md +9 -0
  723. package/lib/assets/docs/reference//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +10 -1
  724. package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +9 -0
  725. package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/203/273/343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273/343/202/254/343/202/244/343/203/211.md +7 -8
  726. package/lib/assets/docs/reference//343/203/255/343/202/270/343/202/253/343/203/253/343/202/267/343/203/263/343/202/255/343/203/263/343/202/260.md +9 -0
  727. package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +10 -1
  728. package/lib/assets/docs/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +10 -0
  729. package/lib/assets/docs/reference//347/265/214/345/226/266/346/210/246/347/225/245/345/210/206/346/236/220/343/202/254/343/202/244/343/203/211.md +9 -0
  730. package/lib/assets/docs/reference//350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +10 -1
  731. package/lib/assets/docs/reference//350/250/200/350/252/236/345/210/245/351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +9 -0
  732. package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +10 -1
  733. package/lib/assets/docs/reference//351/201/213/347/224/250/343/202/271/343/202/257/343/203/252/343/203/227/343/203/210/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +9 -0
  734. package/lib/assets/docs/reference//351/201/213/347/224/250/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +10 -1
  735. package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +9 -0
  736. package/lib/assets/docs/reference//351/235/236/346/251/237/350/203/275/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +10 -1
  737. package/lib/assets/docs/template/ADR.md +9 -0
  738. package/lib/assets/docs/template/AWS/343/202/271/343/203/206/343/203/274/343/202/270/343/203/263/343/202/260/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +9 -0
  739. package/lib/assets/docs/template/AWS/343/203/227/343/203/255/343/203/200/343/202/257/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +9 -0
  740. package/lib/assets/docs/template/README.md +9 -0
  741. package/lib/assets/docs/template//343/201/276/343/201/232/343/201/223/343/202/214/343/202/222/350/252/255/343/202/202/343/201/206/343/203/252/343/202/271/343/203/210.md +9 -0
  742. package/lib/assets/docs/template//343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +9 -0
  743. package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +10 -1
  744. package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273.md +11 -2
  745. package/lib/assets/docs/template//343/202/244/343/203/263/343/202/273/343/203/227/343/202/267/343/203/247/343/203/263/343/203/207/343/203/203/343/202/255.md +9 -0
  746. package/lib/assets/docs/template//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243.md +9 -0
  747. package/lib/assets/docs/template//343/203/252/343/203/252/343/203/274/343/202/271/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +9 -0
  748. package/lib/assets/docs/template//343/203/252/343/203/252/343/203/274/343/202/271/350/250/210/347/224/273.md +289 -280
  749. package/lib/assets/docs/template//344/272/213/344/276/213/345/210/206/346/236/220.md +9 -0
  750. package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +9 -0
  751. package/lib/assets/docs/template//345/256/214/345/205/250/345/275/242/345/274/217/343/201/256/343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271.md +7 -8
  752. package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +7 -8
  753. package/lib/assets/docs/template//350/250/255/350/250/210.md +10 -1
  754. package/lib/assets/docs/template//351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +9 -0
  755. package/lib/assets/gulpfile.js +4 -2
  756. package/lib/assets/ops/scripts/okf.js +272 -0
  757. package/lib/assets/package.json +2 -0
  758. package/package.json +1 -1
@@ -1,521 +1,530 @@
1
- # 付録 B さまざまなコンテナオーケストレーション環境
2
-
3
- ## はじめに
4
-
5
- 本編では、ローカル環境(Docker Desktop の Kubernetes や kind など)を使ってコンテナアプリケーションをデプロイする方法を学びました。ローカル環境は学習や開発には最適ですが、本番運用ではノードの冗長化、可用性、スケーラビリティ、ネットワークやストレージの管理など、自前で面倒を見るには負担の大きい要素がいくつもあります。
6
-
7
- そこで実際の本番運用では、クラウドベンダーが提供する「マネージドなオーケストレーション環境」を利用するのが一般的です。マネージド環境では、コントロールプレーン(Kubernetes の API サーバーや etcd など)の運用をベンダーに任せられるため、利用者はワーカーノードとアプリケーションの管理に集中できます。
8
-
9
- この付録では、ローカルから本番のマネージド環境へ移行するという観点で、次の 5 つの環境を概観します。
10
-
11
- - B.1 Google Kubernetes Engine(GKE)
12
- - B.2 Amazon Elastic Kubernetes Service(EKS)
13
- - B.3 Azure Kubernetes Service(AKS)
14
- - B.4 オンプレミス環境での Kubernetes クラスタの構築
15
- - B.5 Amazon Elastic Container Service(ECS)
16
-
17
- このうち GKE・EKS・AKS は 3 大クラウドが提供するマネージド Kubernetes であり、本編で書いた Kubernetes マニフェストをほぼそのまま流用できます。一方で ECS は Kubernetes ではない AWS 独自のオーケストレーション環境であり、概念や定義ファイルが異なります。Kubernetes の知識をそのまま活かせるかどうかが、両者を選ぶ際の大きな分かれ目になります。
18
-
19
- ### マネージド環境の比較
20
-
21
- ローカル環境と 3 大クラウドのマネージド Kubernetes、そして非 Kubernetes の ECS を比較すると次のようになります。
22
-
23
- | 項目 | ローカル(Docker Desktop / kind) | GKE | EKS | AKS | ECS |
24
- | :--- | :--- | :--- | :--- | :--- | :--- |
25
- | 提供元 | 自分の PC | Google Cloud | AWS | Microsoft Azure | AWS |
26
- | オーケストレーター | Kubernetes | Kubernetes | Kubernetes | Kubernetes | ECS(独自) |
27
- | コントロールプレーン | 自前 | マネージド | マネージド | マネージド | マネージド |
28
- | 主な構築ツール | docker / kind | gcloud / Terraform | eksctl / Terraform | az / Terraform | CDK / Terraform |
29
- | マニフェストの再利用 | ― | 高い | 高い | 高い | 不可(独自定義) |
30
- | ロードバランサ | ― | Cloud Load Balancing | ELB(ALB/NLB) | Azure Load Balancer / Application Gateway | ELB(ALB/NLB) |
31
- | 主な用途 | 学習・開発 | 本番運用 | 本番運用 | 本番運用 | 本番運用 |
32
-
33
- 各クラウドの Kubernetes は API レベルで互換性があるため、Service や Ingress のような環境依存しやすい部分を除けば、本編のマニフェストはどのクラウドへ持っていってもほぼ動作します。以降の各節では、それぞれの環境の特徴と構築手順を見ていきます。
34
-
35
- なお本文中では、本リポジトリ(getting-started-docker-kubernetes)に実在するスクリプトやマニフェストを引用した箇所と、実コードのない一般論・例とを明確に区別します。実コードのない手順には「例」と明記します。
36
-
37
- ---
38
-
39
- ## B.1 Google Kubernetes Engine(GKE)
40
-
41
- GKE は Google Cloud が提供するマネージド Kubernetes です。Kubernetes は元々 Google 社内のコンテナ基盤 Borg の知見を基に開発された経緯があり、GKE はその本家とも言える環境です。Autopilot モード(ノードの管理まで Google に任せるモード)と Standard モード(ノードを自分で管理するモード)の 2 種類があります。
42
-
43
- 本リポジトリには GKE 用の構築スクリプトは含まれていないため、ここで示すコマンドは一般的な手順の「例」です。実際のオプションやリージョン名などは、利用する Google Cloud プロジェクトの状況に合わせて読み替えてください。
44
-
45
- ### gcloud によるクラスタ作成(例)
46
-
47
- GKE のクラスタは `gcloud` CLI で作成します。次は Standard モードでクラスタを作成する例です。
48
-
49
- ```bash
50
- # プロジェクトとデフォルトのリージョン/ゾーンを設定する(例)
51
- gcloud config set project YOUR_PROJECT_ID
52
- gcloud config set compute/zone asia-northeast1-a
53
-
54
- # GKE クラスタを作成する(例)
55
- gcloud container clusters create taskapp-cluster \
56
- --num-nodes=2 \
57
- --machine-type=e2-medium \
58
- --release-channel=regular
59
- ```
60
-
61
- Autopilot モードを使う場合は、ノード数やマシンタイプを指定せずに次のように作成します。
62
-
63
- ```bash
64
- # Autopilot モードでクラスタを作成する(例)
65
- gcloud container clusters create-auto taskapp-cluster \
66
- --region=asia-northeast1
67
- ```
68
-
69
- ### kubeconfig の取得とデプロイ(例)
70
-
71
- クラスタを作成したら、`kubectl` から接続するための認証情報(kubeconfig)を取得します。
72
-
73
- ```bash
74
- # kubectl がクラスタへ接続できるよう認証情報を取得する(例)
75
- gcloud container clusters get-credentials taskapp-cluster
76
-
77
- # 接続確認(例)
78
- kubectl get nodes
79
-
80
- # 本編で作成したマニフェストを適用する(例)
81
- kubectl apply -f k8s/
82
- ```
83
-
84
- GKE では、`type: LoadBalancer` の Service を作成すると Google Cloud のロードバランサが自動的にプロビジョニングされ、外部 IP アドレスが払い出されます。本編で学んだ Service や Deployment のマニフェストは基本的にそのまま利用できる点が、マネージド Kubernetes の大きな利点です。
85
-
86
- ---
87
-
88
- ## B.2 Amazon Elastic Kubernetes Service(EKS)
89
-
90
- EKS は AWS が提供するマネージド Kubernetes です。EKS のクラスタ構築には、AWS 公式が推奨する CLI ツール `eksctl` を使うと宣言的かつ簡潔に記述できます。
91
-
92
- 本リポジトリには、AWS CloudShell 上で EKS を構築するための実スクリプトが含まれています。ここでは出典として `cloudshell/aws/eks/create-eks.sh` と `cloudshell/aws/eks/setup-tools.sh` を引用しながら解説します。
93
-
94
- ### eksctl のインストール
95
-
96
- `cloudshell/aws/eks/setup-tools.sh` は、eksctl の最新版をダウンロードして配置するスクリプトです。
97
-
98
- ```bash
99
- #!/usr/bin/env bash
100
-
101
- set -o errexit
102
- set -o nounset
103
- set -o pipefail
104
-
105
- curl -s --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
106
- sudo mv /tmp/eksctl /usr/local/bin
107
- ```
108
-
109
- GitHub のリリースから tarball を取得して `/usr/local/bin` へ展開するだけのシンプルなスクリプトです。`set -o errexit / nounset / pipefail` を冒頭で指定し、途中でエラーが起きたらすぐに止まるようにしている点が堅牢なスクリプトの作法です。
110
-
111
- ### ClusterConfig によるクラスタ定義
112
-
113
- `cloudshell/aws/eks/create-eks.sh` は、eksctl の `ClusterConfig` を動的に生成して EKS クラスタを構築するスクリプトです。スクリプトは `-n`(クラスタ名)と `-r`(リージョン)を引数で受け取り、ヒアドキュメントで `cluster.yaml` を組み立てます。生成される `ClusterConfig` の中核部分は次のとおりです。
114
-
115
- ```yaml
116
- apiVersion: eksctl.io/v1alpha5
117
- kind: ClusterConfig
118
-
119
- metadata:
120
- name: ${CLUSTER_NAME}
121
- region: ${DEFAULT_REGION}
122
- version: latest
123
-
124
- addons:
125
- - name: vpc-cni
126
- version: latest
127
- - name: coredns
128
- version: latest
129
- - name: kube-proxy
130
- version: latest
131
-
132
- managedNodeGroups:
133
- - name: workers
134
- labels: { role: workers }
135
- instanceType: t3.medium
136
- desiredCapacity: 1
137
- privateNetworking: true
138
- ```
139
-
140
- このマニフェストには、EKS クラスタを構成するうえで重要な要素が詰まっています。
141
-
142
- - `addons`: クラスタにインストールするアドオンを指定します。ここでは Kubernetes の動作に欠かせない 3 つを宣言しています。
143
- - `vpc-cni`: Pod に AWS VPC のネットワークを割り当てる CNI(Container Network Interface)プラグインです。
144
- - `coredns`: クラスタ内の DNS(サービスディスカバリ)を担うコンポーネントです。
145
- - `kube-proxy`: 各ノードで Service への通信を適切な Pod へ転送するコンポーネントです。
146
- - `managedNodeGroups`: ワーカーノードのグループを定義します。`instanceType: t3.medium` のインスタンスを `desiredCapacity: 1` 台起動し、`privateNetworking: true` によってノードをプライベートサブネットに配置します。マネージドノードグループは、ノードのライフサイクル(作成・更新・削除)を AWS が管理してくれる仕組みです。
147
-
148
- ### クラスタの作成と IAM 権限の付与
149
-
150
- クラスタ定義を生成したあと、`create-eks.sh` は実際にクラスタを作成し、IAM ユーザーへ操作権限を付与します。スクリプトの後半部分は次のようになっています。
151
-
152
- ```bash
153
- AWS_ACCOUNT_ID=`aws sts get-caller-identity | jq -r ".Account"`
154
-
155
- # (中略:cluster.yaml と eks-update-kubeconfig.json を生成)
156
-
157
- IAM_USER_NAME=gihyo-`head /dev/urandom | tr -dc a-z0-9 | head -c 6`
158
- aws iam create-user --user-name $IAM_USER_NAME
159
- aws iam put-user-policy --user-name $IAM_USER_NAME \
160
- --policy-name eksUpdateConfigPolicy \
161
- --policy-document file://eks-update-kubeconfig.json
162
-
163
- eksctl create cluster --config-file ./cluster.yaml
164
- eksctl create iamidentitymapping --cluster ${CLUSTER_NAME} \
165
- --arn arn:aws:iam::${AWS_ACCOUNT_ID}:user/${IAM_USER_NAME} \
166
- --username ${IAM_USER_NAME} \
167
- --group system:masters
168
- ```
169
-
170
- この処理の流れは次のとおりです。
171
-
172
- 1. `aws sts get-caller-identity` で現在の AWS アカウント ID を取得します。
173
- 2. ランダムなサフィックスを付けた IAM ユーザー(`gihyo-xxxxxx`)を作成し、`eks-update-kubeconfig.json` で定義したポリシー(`eks:DescribeCluster` と `eks:ListClusters` を許可するもの)をインラインポリシーとして付与します。これにより、このユーザーは kubeconfig の更新に必要な情報を取得できるようになります。
174
- 3. `eksctl create cluster --config-file ./cluster.yaml` で、先ほどの `ClusterConfig` に基づいてクラスタを作成します。VPC やサブネット、ノードグループなどが一括で構築されます。
175
- 4. `eksctl create iamidentitymapping` で IAM identity mapping を作成します。これは「AWS の IAM ユーザー」と「Kubernetes 内の権限(グループ)」を結びつける EKS 独自の仕組みです。ここでは作成した IAM ユーザーを `system:masters` グループにマッピングし、クラスタ管理者権限を与えています。
176
-
177
- EKS では、AWS の認証(IAM)と Kubernetes の認可(RBAC)が分離しているため、この IAM identity mapping が「誰がクラスタを操作できるか」を決める要となります。EKS を扱ううえで特に押さえておきたいポイントです。
178
-
179
- ### kubeconfig の更新(例)
180
-
181
- クラスタ作成後は、次のコマンドで `kubectl` の接続情報を更新します(一般的な手順の例)。
182
-
183
- ```bash
184
- # kubectl がクラスタへ接続できるよう kubeconfig を更新する(例)
185
- aws eks update-kubeconfig --name CLUSTER_NAME --region REGION
186
- kubectl get nodes
187
- ```
188
-
189
- ---
190
-
191
- ## B.3 Azure Kubernetes Service(AKS)
192
-
193
- AKS は Microsoft Azure が提供するマネージド Kubernetes です。本リポジトリには、本編のタスク管理アプリ(taskapp)を AKS へデプロイするためのマニフェストが `apps/taskapp/k8s/plain/aks/` に含まれています。ここではそれらを引用しながら、ローカル版(`apps/taskapp/k8s/plain/local/`)との差分を見ていきます。
194
-
195
- ### ローカル版との差分
196
-
197
- AKS 版とローカル版は、ほとんどのマニフェストが共通です。実際にファイルを比較すると、`api.yaml`・`mysql.yaml`・`migrator.yaml` はローカル版と AKS 版で内容が一致しており、Deployment や StatefulSet、Job の定義をそのまま流用できることがわかります。これはマネージド Kubernetes の互換性の高さを示す好例です。
198
-
199
- 差分が現れるのは `web.yaml` の Ingress 定義です。外部からの入口(Ingress)は環境のロードバランサに依存するため、ここだけ環境ごとに書き換える必要があります。
200
-
201
- ローカル版(`apps/taskapp/k8s/plain/local/web.yaml`)の Ingress は、NGINX Ingress Controller を前提としています。
202
-
203
- ```yaml
204
- apiVersion: networking.k8s.io/v1
205
- kind: Ingress
206
- metadata:
207
- name: web
208
- labels:
209
- app: web
210
- spec:
211
- ingressClassName: nginx
212
- rules:
213
- - host: localhost
214
- http:
215
- paths:
216
- - pathType: Prefix
217
- path: /
218
- backend:
219
- service:
220
- name: web
221
- port:
222
- number: 80
223
- ```
224
-
225
- 一方、AKS 版(`apps/taskapp/k8s/plain/aks/web.yaml`)の Ingress は、Azure の Application Gateway Ingress Controller を前提としています。
226
-
227
- ```yaml
228
- apiVersion: networking.k8s.io/v1
229
- kind: Ingress
230
- metadata:
231
- name: web
232
- labels:
233
- app: web
234
- spec:
235
- ingressClassName: azure-application-gateway
236
- rules:
237
- - http:
238
- paths:
239
- - pathType: Prefix
240
- path: /
241
- backend:
242
- service:
243
- name: web
244
- port:
245
- number: 80
246
- ```
247
-
248
- 実ファイルで確認できる差分は次の 2 点です。
249
-
250
- - `ingressClassName` が `nginx`(ローカル)から `azure-application-gateway`(AKS)へ変わっています。AKS では Azure の Application Gateway をクラスタの Ingress として利用するためです。
251
- - ローカル版にあった `host: localhost` の指定が、AKS 版では削除されています。ローカルでは `localhost` というホスト名でアクセスしますが、AKS では Application Gateway に払い出されるパブリックアドレスでアクセスするためです。
252
-
253
- Deployment 本体(コンテナイメージや環境変数など)は両者で完全に共通であり、`ghcr.io/gihyodocker/taskapp-web:v0.1.0` などのイメージ参照もそのままです。つまり「アプリケーションの定義は共通、入口(Ingress)だけ環境に合わせる」という構成になっています。これはマニフェストの保守性を高める良い設計です。
254
-
255
- ### az によるクラスタ作成(例)
256
-
257
- AKS のクラスタは `az` CLI で作成します。次は一般的な手順の「例」です。
258
-
259
- ```bash
260
- # リソースグループを作成する(例)
261
- az group create --name taskapp-rg --location japaneast
262
-
263
- # AKS クラスタを作成する(例)
264
- az aks create \
265
- --resource-group taskapp-rg \
266
- --name taskapp-cluster \
267
- --node-count 2 \
268
- --node-vm-size Standard_B2s \
269
- --generate-ssh-keys
270
-
271
- # kubectl の接続情報を取得する(例)
272
- az aks get-credentials --resource-group taskapp-rg --name taskapp-cluster
273
-
274
- # AKS 用マニフェストを適用する(例)
275
- kubectl apply -f apps/taskapp/k8s/plain/aks/
276
- ```
277
-
278
- Application Gateway Ingress Controller を利用する場合は、クラスタ作成時にアドオンとして有効化するか、後から有効化する必要があります。その有効化が済んでいることが、上記 AKS 版 `web.yaml` の Ingress が機能する前提となります。
279
-
280
- ---
281
-
282
- ## B.4 オンプレミス環境での Kubernetes クラスタの構築
283
-
284
- クラウドのマネージドサービスを使わず、自社のデータセンターや自前のサーバー上に Kubernetes クラスタを構築することもできます。オンプレミスでは、セキュリティ要件や既存資産の活用、ランニングコストの観点から自前構築が選ばれることがあります。その代わり、コントロールプレーンの運用やバージョンアップ、ネットワーク・ストレージ・ロードバランサの整備をすべて自分たちで担う必要があります。
285
-
286
- 本リポジトリにはオンプレミス構築用のスクリプトは含まれていないため、ここで示すのは一般的な構成の「例」です。
287
-
288
- ### kubeadm によるクラスタ構築(例)
289
-
290
- オンプレミスで Kubernetes を構築する標準的なツールが `kubeadm` です。大まかな流れは次のとおりです。
291
-
292
- ```bash
293
- # 各ノードに kubeadm / kubelet / kubectl をインストール後、
294
- # コントロールプレーンノードでクラスタを初期化する(例)
295
- sudo kubeadm init --pod-network-cidr=10.244.0.0/16
296
-
297
- # 一般ユーザーから kubectl を使えるよう kubeconfig を配置する(例)
298
- mkdir -p $HOME/.kube
299
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
300
- sudo chown $(id -u):$(id -g) $HOME/.kube/config
301
-
302
- # ワーカーノードをクラスタに参加させる(例)
303
- # (kubeadm init が出力する join コマンドを各ワーカーで実行する)
304
- sudo kubeadm join CONTROL_PLANE_IP:6443 --token TOKEN \
305
- --discovery-token-ca-cert-hash sha256:HASH
306
- ```
307
-
308
- ### CNI とロードバランサの整備(例)
309
-
310
- `kubeadm init` 直後のクラスタは、Pod 間ネットワークがまだ構成されておらず、ノードは `NotReady` のままです。Pod 同士が通信できるように、CNI プラグインを別途インストールする必要があります。代表的な CNI には次のようなものがあります(例)。
311
-
312
- - Flannel: シンプルで導入が容易なオーバーレイネットワーク。
313
- - Calico: ネットワークポリシーによる細かいアクセス制御に対応。
314
- - Cilium: eBPF を活用した高性能なネットワーキングと可観測性。
315
-
316
- ```bash
317
- # CNI プラグイン(Calico)を適用する(例)
318
- kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/CALICO_VERSION/manifests/calico.yaml
319
- ```
320
-
321
- また、クラウドと違ってオンプレミスには `type: LoadBalancer` の Service に対して外部 IP を払い出す仕組みが標準では存在しません。そこで MetalLB のようなソフトウェアロードバランサを導入し、空き IP アドレスのプールを割り当てることで、`type: LoadBalancer` を機能させます(例)。
322
-
323
- ```yaml
324
- # MetalLB に払い出させる IP アドレスプールの定義(例)
325
- apiVersion: metallb.io/v1beta1
326
- kind: IPAddressPool
327
- metadata:
328
- name: default-pool
329
- namespace: metallb-system
330
- spec:
331
- addresses:
332
- - 192.168.10.240-192.168.10.250
333
- ```
334
-
335
- このように、オンプレミスではマネージド環境が裏側で面倒を見ていた「ネットワーク(CNI)」「ロードバランサ(MetalLB 等)」「ストレージ」を自分で組み立てる必要があります。逆に言えば、これらを理解しておくと、マネージド環境が何をしてくれているのかがより深く理解できます。
336
-
337
- ---
338
-
339
- ## B.5 Amazon Elastic Container Service(ECS)
340
-
341
- ECS は AWS 独自のコンテナオーケストレーション環境であり、Kubernetes ではありません。そのため Kubernetes のマニフェストはそのまま使えませんが、AWS のサービスと密に統合されており、Fargate(サーバーレスでコンテナを実行する仕組み)と組み合わせれば、ノード(EC2 インスタンス)の管理すら不要になります。
342
-
343
- 本リポジトリには、ECS 環境を AWS CDK(TypeScript)で構築する実コードが `cloudshell/aws/ecs/gihyo-ecs/` に含まれています。ここではそのスタック定義 `lib/gihyo-ecs-stack.ts` を引用しながら、ECS の中心概念である Cluster / Task Definition / Service を解説します。
344
-
345
- ### CDK アプリのエントリポイント
346
-
347
- `bin/gihyo-ecs.ts` がアプリのエントリポイントで、`GihyoEcsStack` というスタックをインスタンス化しています。
348
-
349
- ```typescript
350
- #!/usr/bin/env node
351
- import 'source-map-support/register';
352
- import * as cdk from 'aws-cdk-lib';
353
- import { GihyoEcsStack } from '../lib/gihyo-ecs-stack';
354
-
355
- const app = new cdk.App();
356
- new GihyoEcsStack(app, 'GihyoEcsStack', {
357
- // ...
358
- });
359
- ```
360
-
361
- ### Cluster の定義
362
-
363
- `lib/gihyo-ecs-stack.ts` では、まず VPC を作成したうえで、その VPC 上に ECS クラスタを定義しています。
364
-
365
- ```typescript
366
- // ECS
367
- const cluster = new ecs.Cluster(this, 'Cluster', {
368
- vpc: vpc,
369
- });
370
- ```
371
-
372
- ECS の Cluster は、タスク(コンテナ)を実行する論理的なグループです。Kubernetes のクラスタに相当しますが、ECS ではコントロールプレーンを意識する必要はなく、Fargate を使えばノードの存在すら隠蔽されます。
373
-
374
- ### Task Definition の定義
375
-
376
- ECS で「どのコンテナをどう動かすか」を定義するのが Task Definition です。次のコードでは、Fargate 用の Task Definition を作成し、`nginx` と `echo` の 2 つのコンテナを 1 つのタスクにまとめています。
377
-
378
- ```typescript
379
- // ECS TaskDefinition
380
- const echoTaskDefinition = new ecs.FargateTaskDefinition(this, 'TaskDefinitionEcho', {
381
- cpu: 256,
382
- memoryLimitMiB: 512,
383
- });
384
- // "nginx" container
385
- const nginxContainer = echoTaskDefinition.addContainer("EchoConNginx", {
386
- containerName: "nginx",
387
- image: ecs.ContainerImage.fromRegistry('ghcr.io/gihyodocker/simple-nginx-proxy:v0.0.1'),
388
- logging: ecs.LogDrivers.awsLogs({
389
- streamPrefix: 'echo-nginx',
390
- logRetention: log.RetentionDays.ONE_MONTH,
391
- }),
392
- environment: {
393
- NGINX_PORT: "80",
394
- SERVER_NAME: "localhost",
395
- BACKEND_HOST: "localhost:8080",
396
- BACKEND_MAX_FAILS: "3",
397
- BACKEND_FAIL_TIMEOUT: "10s",
398
- },
399
- });
400
- nginxContainer.addPortMappings({
401
- containerPort: 80,
402
- hostPort: 80
403
- })
404
- // "echo" container
405
- const echoContainer = echoTaskDefinition.addContainer("EchoConEcho", {
406
- containerName: "echo",
407
- image: ecs.ContainerImage.fromRegistry('ghcr.io/gihyodocker/echo:v0.0.1-9-gfe27471-slim'),
408
- logging: ecs.LogDrivers.awsLogs({
409
- streamPrefix: 'echo-nginx',
410
- logRetention: log.RetentionDays.ONE_MONTH,
411
- }),
412
- });
413
- echoContainer.addPortMappings({
414
- containerPort: 8080,
415
- hostPort: 8080,
416
- })
417
- ```
418
-
419
- ここでのポイントは次のとおりです。
420
-
421
- - `FargateTaskDefinition` で CPU・メモリを指定しています。タスク単位でリソースを割り当てる点が ECS の特徴です。
422
- - `addContainer` で 1 つのタスクに複数のコンテナ(`nginx` と `echo`)を同居させています。`nginx` がリバースプロキシとなり、`localhost:8080` の `echo` コンテナへ転送する構成です。同じタスク内のコンテナは `localhost` で通信できます。
423
- - `LogDrivers.awsLogs` により、各コンテナのログを CloudWatch Logs へ転送しています。
424
-
425
- ### Service の定義
426
-
427
- Task Definition は「設計図」にすぎません。それを実際に「何個、どう動かし続けるか」を定義するのが Service です。
428
-
429
- ```typescript
430
- // ECS Service
431
- const service = new ecs.FargateService(this, 'ServiceEcho', {
432
- cluster,
433
- taskDefinition: echoTaskDefinition,
434
- desiredCount: 1,
435
- assignPublicIp: true,
436
- securityGroups: [
437
- securityGroupApp,
438
- ]
439
- });
440
- service.attachToApplicationTargetGroup(targetGroup);
441
- ```
442
-
443
- `FargateService` は、指定した Cluster 上で `echoTaskDefinition` のタスクを `desiredCount: 1`(1 つ)だけ常時起動し続けます。タスクが落ちれば自動で再起動され、台数を増やせばスケールアウトします。さらに `attachToApplicationTargetGroup` により、このスタックで作成した ALB(Application Load Balancer)のターゲットグループへ紐づけ、外部からの HTTP リクエストをタスクへ振り分けています。
444
-
445
- ### Kubernetes との対応関係
446
-
447
- ECS の概念は、Kubernetes の概念と次のように対応づけて理解するとわかりやすいでしょう。
448
-
449
- | ECS の概念 | おおよそ対応する Kubernetes の概念 | 役割 |
450
- | :--- | :--- | :--- |
451
- | Cluster | Cluster | コンテナを実行する論理的なグループ |
452
- | Task Definition | Pod のテンプレート(Deployment の `template`) | コンテナ群・リソース・環境変数などの設計図 |
453
- | Task | Pod | 実際に起動するコンテナ群の実行単位 |
454
- | Service | Deployment + Service | タスクを指定数だけ維持し、LB へ振り分ける |
455
- | Fargate | (ノードレス実行) | サーバー管理不要でタスクを実行する基盤 |
456
-
457
- 厳密には ECS の Service は Kubernetes の Deployment(レプリカ維持)と Service(負荷分散)の両方の役割を兼ねている点に注意してください。これらの対応関係を押さえておくと、Kubernetes の知識を ECS へ応用しやすくなります。
458
-
459
- ### PipeCD による ECS デプロイ定義(補足)
460
-
461
- 本リポジトリの `pipecd-examples/ecs/simple/` には、CDK とは別の形式で ECS を定義するファイルもあります。これは継続的デリバリーツール PipeCD 向けの定義で、Task Definition と Service を YAML で記述します。出典として `pipecd-examples/ecs/simple/taskdef.yaml` の主要部を引用します。
462
-
463
- ```yaml
464
- family: nginx-service-fam
465
- executionRoleArn: arn:aws:iam::XXXX:role/ecsTaskExecutionRole
466
- containerDefinitions:
467
- - command: null
468
- cpu: 100
469
- image: XXXX.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:1
470
- memory: 100
471
- mountPoints: []
472
- name: web
473
- portMappings:
474
- - containerPort: 80
475
- compatibilities:
476
- - FARGATE
477
- requiresCompatibilities:
478
- - FARGATE
479
- networkMode: awsvpc
480
- memory: 512
481
- cpu: 256
482
- ```
483
-
484
- Service 側の定義(`pipecd-examples/ecs/simple/servicedef.yaml`)では、起動するタスク数や起動タイプ、ネットワーク設定を記述します。
485
-
486
- ```yaml
487
- serviceName: nginx-service
488
- desiredCount: 2
489
- launchType: FARGATE
490
- networkConfiguration:
491
- awsvpcConfiguration:
492
- assignPublicIp: ENABLED
493
- securityGroups:
494
- - sg-YYYY
495
- subnets:
496
- - subnet-YYYY
497
- - subnet-YYYY
498
- ```
499
-
500
- このように、ECS の構築方法は AWS CDK で記述する方法(`gihyo-ecs`)と、CD ツール向けに宣言的な YAML で記述する方法(PipeCD)など複数あります。いずれの場合も、Task Definition と Service という ECS の基本概念は共通している点を押さえておきましょう。なお `XXXX` や `sg-YYYY` などはプレースホルダであり、実際の値に置き換える必要があります。
501
-
502
- ---
503
-
504
- ## まとめ
505
-
506
- この付録では、ローカル環境から本番のマネージド環境へ移行するという観点で、5 つのコンテナオーケストレーション環境を概観しました。
507
-
508
- - GKE・EKS・AKS は 3 大クラウドが提供するマネージド Kubernetes であり、本編で学んだマニフェストをほぼそのまま再利用できます。差分が出やすいのは Service や Ingress のような環境依存部分で、AKS の例では Ingress の `ingressClassName` だけを `azure-application-gateway` に変えるだけで済みました。
509
- - EKS では `eksctl` の `ClusterConfig` でクラスタを宣言的に定義し、IAM identity mapping で AWS の認証と Kubernetes の認可を結びつける点が特徴です。
510
- - オンプレミスでは `kubeadm` でクラスタを構築し、CNI(Calico など)やソフトウェアロードバランサ(MetalLB)を自分で整備する必要があります。これはマネージド環境が裏で何をしているかを理解する良い機会にもなります。
511
- - ECS は Kubernetes ではない AWS 独自の環境ですが、Cluster / Task Definition / Service という概念を Kubernetes の Cluster / Pod / Deployment+Service に対応づけて理解すれば、既存の知識を活かせます。
512
-
513
- どの環境を選ぶにせよ、本編で身につけたコンテナとオーケストレーションの基礎は共通の土台になります。「変更を楽に安全にできる」状態を保つために、アプリケーションの定義(共通部分)と環境固有の設定(差分部分)を切り分けて管理することが、複数環境を扱ううえでの実践的な指針となります。
514
-
515
- ---
516
-
517
- ### 関連リンク
518
-
519
- - [付録 A 開発ツールのセットアップ](appendix-a-dev-tools-setup.md)
520
- - [付録 C Docker/Kubernetes の Tips](appendix-c-tips.md)
521
- - [第 6 章 Kubernetes クラスタへのデプロイ](06-kubernetes-deploy-cluster.md)
1
+ ---
2
+ type: Article
3
+ title: "付録 B さまざまなコンテナオーケストレーション環境"
4
+ description: "本編では、ローカル環境(Docker Desktop の Kubernetes や kind など)を使ってコンテナアプリケーションをデプロイする方法を学びました。"
5
+ tags: [article, getting-start-docker-kubernetes]
6
+ status: stable
7
+ generated: { by: human:kakimomokuri, at: 2026-06-26T00:29:42Z }
8
+ ---
9
+
10
+ # 付録 B さまざまなコンテナオーケストレーション環境
11
+
12
+ ## はじめに
13
+
14
+ 本編では、ローカル環境(Docker Desktop の Kubernetes や kind など)を使ってコンテナアプリケーションをデプロイする方法を学びました。ローカル環境は学習や開発には最適ですが、本番運用ではノードの冗長化、可用性、スケーラビリティ、ネットワークやストレージの管理など、自前で面倒を見るには負担の大きい要素がいくつもあります。
15
+
16
+ そこで実際の本番運用では、クラウドベンダーが提供する「マネージドなオーケストレーション環境」を利用するのが一般的です。マネージド環境では、コントロールプレーン(Kubernetes の API サーバーや etcd など)の運用をベンダーに任せられるため、利用者はワーカーノードとアプリケーションの管理に集中できます。
17
+
18
+ この付録では、ローカルから本番のマネージド環境へ移行するという観点で、次の 5 つの環境を概観します。
19
+
20
+ - B.1 Google Kubernetes Engine(GKE)
21
+ - B.2 Amazon Elastic Kubernetes Service(EKS)
22
+ - B.3 Azure Kubernetes Service(AKS)
23
+ - B.4 オンプレミス環境での Kubernetes クラスタの構築
24
+ - B.5 Amazon Elastic Container Service(ECS)
25
+
26
+ このうち GKE・EKS・AKS は 3 大クラウドが提供するマネージド Kubernetes であり、本編で書いた Kubernetes マニフェストをほぼそのまま流用できます。一方で ECS は Kubernetes ではない AWS 独自のオーケストレーション環境であり、概念や定義ファイルが異なります。Kubernetes の知識をそのまま活かせるかどうかが、両者を選ぶ際の大きな分かれ目になります。
27
+
28
+ ### マネージド環境の比較
29
+
30
+ ローカル環境と 3 大クラウドのマネージド Kubernetes、そして非 Kubernetes の ECS を比較すると次のようになります。
31
+
32
+ | 項目 | ローカル(Docker Desktop / kind) | GKE | EKS | AKS | ECS |
33
+ | :--- | :--- | :--- | :--- | :--- | :--- |
34
+ | 提供元 | 自分の PC | Google Cloud | AWS | Microsoft Azure | AWS |
35
+ | オーケストレーター | Kubernetes | Kubernetes | Kubernetes | Kubernetes | ECS(独自) |
36
+ | コントロールプレーン | 自前 | マネージド | マネージド | マネージド | マネージド |
37
+ | 主な構築ツール | docker / kind | gcloud / Terraform | eksctl / Terraform | az / Terraform | CDK / Terraform |
38
+ | マニフェストの再利用 | ― | 高い | 高い | 高い | 不可(独自定義) |
39
+ | ロードバランサ | ― | Cloud Load Balancing | ELB(ALB/NLB) | Azure Load Balancer / Application Gateway | ELB(ALB/NLB) |
40
+ | 主な用途 | 学習・開発 | 本番運用 | 本番運用 | 本番運用 | 本番運用 |
41
+
42
+ 各クラウドの Kubernetes は API レベルで互換性があるため、Service や Ingress のような環境依存しやすい部分を除けば、本編のマニフェストはどのクラウドへ持っていってもほぼ動作します。以降の各節では、それぞれの環境の特徴と構築手順を見ていきます。
43
+
44
+ なお本文中では、本リポジトリ(getting-started-docker-kubernetes)に実在するスクリプトやマニフェストを引用した箇所と、実コードのない一般論・例とを明確に区別します。実コードのない手順には「例」と明記します。
45
+
46
+ ---
47
+
48
+ ## B.1 Google Kubernetes Engine(GKE)
49
+
50
+ GKE は Google Cloud が提供するマネージド Kubernetes です。Kubernetes は元々 Google 社内のコンテナ基盤 Borg の知見を基に開発された経緯があり、GKE はその本家とも言える環境です。Autopilot モード(ノードの管理まで Google に任せるモード)と Standard モード(ノードを自分で管理するモード)の 2 種類があります。
51
+
52
+ 本リポジトリには GKE 用の構築スクリプトは含まれていないため、ここで示すコマンドは一般的な手順の「例」です。実際のオプションやリージョン名などは、利用する Google Cloud プロジェクトの状況に合わせて読み替えてください。
53
+
54
+ ### gcloud によるクラスタ作成(例)
55
+
56
+ GKE のクラスタは `gcloud` CLI で作成します。次は Standard モードでクラスタを作成する例です。
57
+
58
+ ```bash
59
+ # プロジェクトとデフォルトのリージョン/ゾーンを設定する(例)
60
+ gcloud config set project YOUR_PROJECT_ID
61
+ gcloud config set compute/zone asia-northeast1-a
62
+
63
+ # GKE クラスタを作成する(例)
64
+ gcloud container clusters create taskapp-cluster \
65
+ --num-nodes=2 \
66
+ --machine-type=e2-medium \
67
+ --release-channel=regular
68
+ ```
69
+
70
+ Autopilot モードを使う場合は、ノード数やマシンタイプを指定せずに次のように作成します。
71
+
72
+ ```bash
73
+ # Autopilot モードでクラスタを作成する(例)
74
+ gcloud container clusters create-auto taskapp-cluster \
75
+ --region=asia-northeast1
76
+ ```
77
+
78
+ ### kubeconfig の取得とデプロイ(例)
79
+
80
+ クラスタを作成したら、`kubectl` から接続するための認証情報(kubeconfig)を取得します。
81
+
82
+ ```bash
83
+ # kubectl がクラスタへ接続できるよう認証情報を取得する(例)
84
+ gcloud container clusters get-credentials taskapp-cluster
85
+
86
+ # 接続確認(例)
87
+ kubectl get nodes
88
+
89
+ # 本編で作成したマニフェストを適用する(例)
90
+ kubectl apply -f k8s/
91
+ ```
92
+
93
+ GKE では、`type: LoadBalancer` の Service を作成すると Google Cloud のロードバランサが自動的にプロビジョニングされ、外部 IP アドレスが払い出されます。本編で学んだ Service や Deployment のマニフェストは基本的にそのまま利用できる点が、マネージド Kubernetes の大きな利点です。
94
+
95
+ ---
96
+
97
+ ## B.2 Amazon Elastic Kubernetes Service(EKS)
98
+
99
+ EKS は AWS が提供するマネージド Kubernetes です。EKS のクラスタ構築には、AWS 公式が推奨する CLI ツール `eksctl` を使うと宣言的かつ簡潔に記述できます。
100
+
101
+ 本リポジトリには、AWS CloudShell 上で EKS を構築するための実スクリプトが含まれています。ここでは出典として `cloudshell/aws/eks/create-eks.sh` と `cloudshell/aws/eks/setup-tools.sh` を引用しながら解説します。
102
+
103
+ ### eksctl のインストール
104
+
105
+ `cloudshell/aws/eks/setup-tools.sh` は、eksctl の最新版をダウンロードして配置するスクリプトです。
106
+
107
+ ```bash
108
+ #!/usr/bin/env bash
109
+
110
+ set -o errexit
111
+ set -o nounset
112
+ set -o pipefail
113
+
114
+ curl -s --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
115
+ sudo mv /tmp/eksctl /usr/local/bin
116
+ ```
117
+
118
+ GitHub のリリースから tarball を取得して `/usr/local/bin` へ展開するだけのシンプルなスクリプトです。`set -o errexit / nounset / pipefail` を冒頭で指定し、途中でエラーが起きたらすぐに止まるようにしている点が堅牢なスクリプトの作法です。
119
+
120
+ ### ClusterConfig によるクラスタ定義
121
+
122
+ `cloudshell/aws/eks/create-eks.sh` は、eksctl の `ClusterConfig` を動的に生成して EKS クラスタを構築するスクリプトです。スクリプトは `-n`(クラスタ名)と `-r`(リージョン)を引数で受け取り、ヒアドキュメントで `cluster.yaml` を組み立てます。生成される `ClusterConfig` の中核部分は次のとおりです。
123
+
124
+ ```yaml
125
+ apiVersion: eksctl.io/v1alpha5
126
+ kind: ClusterConfig
127
+
128
+ metadata:
129
+ name: ${CLUSTER_NAME}
130
+ region: ${DEFAULT_REGION}
131
+ version: latest
132
+
133
+ addons:
134
+ - name: vpc-cni
135
+ version: latest
136
+ - name: coredns
137
+ version: latest
138
+ - name: kube-proxy
139
+ version: latest
140
+
141
+ managedNodeGroups:
142
+ - name: workers
143
+ labels: { role: workers }
144
+ instanceType: t3.medium
145
+ desiredCapacity: 1
146
+ privateNetworking: true
147
+ ```
148
+
149
+ このマニフェストには、EKS クラスタを構成するうえで重要な要素が詰まっています。
150
+
151
+ - `addons`: クラスタにインストールするアドオンを指定します。ここでは Kubernetes の動作に欠かせない 3 つを宣言しています。
152
+ - `vpc-cni`: Pod に AWS VPC のネットワークを割り当てる CNI(Container Network Interface)プラグインです。
153
+ - `coredns`: クラスタ内の DNS(サービスディスカバリ)を担うコンポーネントです。
154
+ - `kube-proxy`: 各ノードで Service への通信を適切な Pod へ転送するコンポーネントです。
155
+ - `managedNodeGroups`: ワーカーノードのグループを定義します。`instanceType: t3.medium` のインスタンスを `desiredCapacity: 1` 台起動し、`privateNetworking: true` によってノードをプライベートサブネットに配置します。マネージドノードグループは、ノードのライフサイクル(作成・更新・削除)を AWS が管理してくれる仕組みです。
156
+
157
+ ### クラスタの作成と IAM 権限の付与
158
+
159
+ クラスタ定義を生成したあと、`create-eks.sh` は実際にクラスタを作成し、IAM ユーザーへ操作権限を付与します。スクリプトの後半部分は次のようになっています。
160
+
161
+ ```bash
162
+ AWS_ACCOUNT_ID=`aws sts get-caller-identity | jq -r ".Account"`
163
+
164
+ # (中略:cluster.yaml と eks-update-kubeconfig.json を生成)
165
+
166
+ IAM_USER_NAME=gihyo-`head /dev/urandom | tr -dc a-z0-9 | head -c 6`
167
+ aws iam create-user --user-name $IAM_USER_NAME
168
+ aws iam put-user-policy --user-name $IAM_USER_NAME \
169
+ --policy-name eksUpdateConfigPolicy \
170
+ --policy-document file://eks-update-kubeconfig.json
171
+
172
+ eksctl create cluster --config-file ./cluster.yaml
173
+ eksctl create iamidentitymapping --cluster ${CLUSTER_NAME} \
174
+ --arn arn:aws:iam::${AWS_ACCOUNT_ID}:user/${IAM_USER_NAME} \
175
+ --username ${IAM_USER_NAME} \
176
+ --group system:masters
177
+ ```
178
+
179
+ この処理の流れは次のとおりです。
180
+
181
+ 1. `aws sts get-caller-identity` で現在の AWS アカウント ID を取得します。
182
+ 2. ランダムなサフィックスを付けた IAM ユーザー(`gihyo-xxxxxx`)を作成し、`eks-update-kubeconfig.json` で定義したポリシー(`eks:DescribeCluster` と `eks:ListClusters` を許可するもの)をインラインポリシーとして付与します。これにより、このユーザーは kubeconfig の更新に必要な情報を取得できるようになります。
183
+ 3. `eksctl create cluster --config-file ./cluster.yaml` で、先ほどの `ClusterConfig` に基づいてクラスタを作成します。VPC やサブネット、ノードグループなどが一括で構築されます。
184
+ 4. `eksctl create iamidentitymapping` で IAM identity mapping を作成します。これは「AWS の IAM ユーザー」と「Kubernetes 内の権限(グループ)」を結びつける EKS 独自の仕組みです。ここでは作成した IAM ユーザーを `system:masters` グループにマッピングし、クラスタ管理者権限を与えています。
185
+
186
+ EKS では、AWS の認証(IAM)と Kubernetes の認可(RBAC)が分離しているため、この IAM identity mapping が「誰がクラスタを操作できるか」を決める要となります。EKS を扱ううえで特に押さえておきたいポイントです。
187
+
188
+ ### kubeconfig の更新(例)
189
+
190
+ クラスタ作成後は、次のコマンドで `kubectl` の接続情報を更新します(一般的な手順の例)。
191
+
192
+ ```bash
193
+ # kubectl がクラスタへ接続できるよう kubeconfig を更新する(例)
194
+ aws eks update-kubeconfig --name CLUSTER_NAME --region REGION
195
+ kubectl get nodes
196
+ ```
197
+
198
+ ---
199
+
200
+ ## B.3 Azure Kubernetes Service(AKS)
201
+
202
+ AKS は Microsoft Azure が提供するマネージド Kubernetes です。本リポジトリには、本編のタスク管理アプリ(taskapp)を AKS へデプロイするためのマニフェストが `apps/taskapp/k8s/plain/aks/` に含まれています。ここではそれらを引用しながら、ローカル版(`apps/taskapp/k8s/plain/local/`)との差分を見ていきます。
203
+
204
+ ### ローカル版との差分
205
+
206
+ AKS 版とローカル版は、ほとんどのマニフェストが共通です。実際にファイルを比較すると、`api.yaml`・`mysql.yaml`・`migrator.yaml` はローカル版と AKS 版で内容が一致しており、Deployment や StatefulSet、Job の定義をそのまま流用できることがわかります。これはマネージド Kubernetes の互換性の高さを示す好例です。
207
+
208
+ 差分が現れるのは `web.yaml` の Ingress 定義です。外部からの入口(Ingress)は環境のロードバランサに依存するため、ここだけ環境ごとに書き換える必要があります。
209
+
210
+ ローカル版(`apps/taskapp/k8s/plain/local/web.yaml`)の Ingress は、NGINX Ingress Controller を前提としています。
211
+
212
+ ```yaml
213
+ apiVersion: networking.k8s.io/v1
214
+ kind: Ingress
215
+ metadata:
216
+ name: web
217
+ labels:
218
+ app: web
219
+ spec:
220
+ ingressClassName: nginx
221
+ rules:
222
+ - host: localhost
223
+ http:
224
+ paths:
225
+ - pathType: Prefix
226
+ path: /
227
+ backend:
228
+ service:
229
+ name: web
230
+ port:
231
+ number: 80
232
+ ```
233
+
234
+ 一方、AKS 版(`apps/taskapp/k8s/plain/aks/web.yaml`)の Ingress は、Azure の Application Gateway Ingress Controller を前提としています。
235
+
236
+ ```yaml
237
+ apiVersion: networking.k8s.io/v1
238
+ kind: Ingress
239
+ metadata:
240
+ name: web
241
+ labels:
242
+ app: web
243
+ spec:
244
+ ingressClassName: azure-application-gateway
245
+ rules:
246
+ - http:
247
+ paths:
248
+ - pathType: Prefix
249
+ path: /
250
+ backend:
251
+ service:
252
+ name: web
253
+ port:
254
+ number: 80
255
+ ```
256
+
257
+ 実ファイルで確認できる差分は次の 2 点です。
258
+
259
+ - `ingressClassName` が `nginx`(ローカル)から `azure-application-gateway`(AKS)へ変わっています。AKS では Azure の Application Gateway をクラスタの Ingress として利用するためです。
260
+ - ローカル版にあった `host: localhost` の指定が、AKS 版では削除されています。ローカルでは `localhost` というホスト名でアクセスしますが、AKS では Application Gateway に払い出されるパブリックアドレスでアクセスするためです。
261
+
262
+ Deployment 本体(コンテナイメージや環境変数など)は両者で完全に共通であり、`ghcr.io/gihyodocker/taskapp-web:v0.1.0` などのイメージ参照もそのままです。つまり「アプリケーションの定義は共通、入口(Ingress)だけ環境に合わせる」という構成になっています。これはマニフェストの保守性を高める良い設計です。
263
+
264
+ ### az によるクラスタ作成(例)
265
+
266
+ AKS のクラスタは `az` CLI で作成します。次は一般的な手順の「例」です。
267
+
268
+ ```bash
269
+ # リソースグループを作成する(例)
270
+ az group create --name taskapp-rg --location japaneast
271
+
272
+ # AKS クラスタを作成する(例)
273
+ az aks create \
274
+ --resource-group taskapp-rg \
275
+ --name taskapp-cluster \
276
+ --node-count 2 \
277
+ --node-vm-size Standard_B2s \
278
+ --generate-ssh-keys
279
+
280
+ # kubectl の接続情報を取得する(例)
281
+ az aks get-credentials --resource-group taskapp-rg --name taskapp-cluster
282
+
283
+ # AKS 用マニフェストを適用する(例)
284
+ kubectl apply -f apps/taskapp/k8s/plain/aks/
285
+ ```
286
+
287
+ Application Gateway Ingress Controller を利用する場合は、クラスタ作成時にアドオンとして有効化するか、後から有効化する必要があります。その有効化が済んでいることが、上記 AKS 版 `web.yaml` の Ingress が機能する前提となります。
288
+
289
+ ---
290
+
291
+ ## B.4 オンプレミス環境での Kubernetes クラスタの構築
292
+
293
+ クラウドのマネージドサービスを使わず、自社のデータセンターや自前のサーバー上に Kubernetes クラスタを構築することもできます。オンプレミスでは、セキュリティ要件や既存資産の活用、ランニングコストの観点から自前構築が選ばれることがあります。その代わり、コントロールプレーンの運用やバージョンアップ、ネットワーク・ストレージ・ロードバランサの整備をすべて自分たちで担う必要があります。
294
+
295
+ 本リポジトリにはオンプレミス構築用のスクリプトは含まれていないため、ここで示すのは一般的な構成の「例」です。
296
+
297
+ ### kubeadm によるクラスタ構築(例)
298
+
299
+ オンプレミスで Kubernetes を構築する標準的なツールが `kubeadm` です。大まかな流れは次のとおりです。
300
+
301
+ ```bash
302
+ # 各ノードに kubeadm / kubelet / kubectl をインストール後、
303
+ # コントロールプレーンノードでクラスタを初期化する(例)
304
+ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
305
+
306
+ # 一般ユーザーから kubectl を使えるよう kubeconfig を配置する(例)
307
+ mkdir -p $HOME/.kube
308
+ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
309
+ sudo chown $(id -u):$(id -g) $HOME/.kube/config
310
+
311
+ # ワーカーノードをクラスタに参加させる(例)
312
+ # (kubeadm init が出力する join コマンドを各ワーカーで実行する)
313
+ sudo kubeadm join CONTROL_PLANE_IP:6443 --token TOKEN \
314
+ --discovery-token-ca-cert-hash sha256:HASH
315
+ ```
316
+
317
+ ### CNI とロードバランサの整備(例)
318
+
319
+ `kubeadm init` 直後のクラスタは、Pod 間ネットワークがまだ構成されておらず、ノードは `NotReady` のままです。Pod 同士が通信できるように、CNI プラグインを別途インストールする必要があります。代表的な CNI には次のようなものがあります(例)。
320
+
321
+ - Flannel: シンプルで導入が容易なオーバーレイネットワーク。
322
+ - Calico: ネットワークポリシーによる細かいアクセス制御に対応。
323
+ - Cilium: eBPF を活用した高性能なネットワーキングと可観測性。
324
+
325
+ ```bash
326
+ # CNI プラグイン(Calico)を適用する(例)
327
+ kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/CALICO_VERSION/manifests/calico.yaml
328
+ ```
329
+
330
+ また、クラウドと違ってオンプレミスには `type: LoadBalancer` の Service に対して外部 IP を払い出す仕組みが標準では存在しません。そこで MetalLB のようなソフトウェアロードバランサを導入し、空き IP アドレスのプールを割り当てることで、`type: LoadBalancer` を機能させます(例)。
331
+
332
+ ```yaml
333
+ # MetalLB に払い出させる IP アドレスプールの定義(例)
334
+ apiVersion: metallb.io/v1beta1
335
+ kind: IPAddressPool
336
+ metadata:
337
+ name: default-pool
338
+ namespace: metallb-system
339
+ spec:
340
+ addresses:
341
+ - 192.168.10.240-192.168.10.250
342
+ ```
343
+
344
+ このように、オンプレミスではマネージド環境が裏側で面倒を見ていた「ネットワーク(CNI)」「ロードバランサ(MetalLB 等)」「ストレージ」を自分で組み立てる必要があります。逆に言えば、これらを理解しておくと、マネージド環境が何をしてくれているのかがより深く理解できます。
345
+
346
+ ---
347
+
348
+ ## B.5 Amazon Elastic Container Service(ECS)
349
+
350
+ ECS は AWS 独自のコンテナオーケストレーション環境であり、Kubernetes ではありません。そのため Kubernetes のマニフェストはそのまま使えませんが、AWS のサービスと密に統合されており、Fargate(サーバーレスでコンテナを実行する仕組み)と組み合わせれば、ノード(EC2 インスタンス)の管理すら不要になります。
351
+
352
+ 本リポジトリには、ECS 環境を AWS CDK(TypeScript)で構築する実コードが `cloudshell/aws/ecs/gihyo-ecs/` に含まれています。ここではそのスタック定義 `lib/gihyo-ecs-stack.ts` を引用しながら、ECS の中心概念である Cluster / Task Definition / Service を解説します。
353
+
354
+ ### CDK アプリのエントリポイント
355
+
356
+ `bin/gihyo-ecs.ts` がアプリのエントリポイントで、`GihyoEcsStack` というスタックをインスタンス化しています。
357
+
358
+ ```typescript
359
+ #!/usr/bin/env node
360
+ import 'source-map-support/register';
361
+ import * as cdk from 'aws-cdk-lib';
362
+ import { GihyoEcsStack } from '../lib/gihyo-ecs-stack';
363
+
364
+ const app = new cdk.App();
365
+ new GihyoEcsStack(app, 'GihyoEcsStack', {
366
+ // ...
367
+ });
368
+ ```
369
+
370
+ ### Cluster の定義
371
+
372
+ `lib/gihyo-ecs-stack.ts` では、まず VPC を作成したうえで、その VPC 上に ECS クラスタを定義しています。
373
+
374
+ ```typescript
375
+ // ECS
376
+ const cluster = new ecs.Cluster(this, 'Cluster', {
377
+ vpc: vpc,
378
+ });
379
+ ```
380
+
381
+ ECS の Cluster は、タスク(コンテナ)を実行する論理的なグループです。Kubernetes のクラスタに相当しますが、ECS ではコントロールプレーンを意識する必要はなく、Fargate を使えばノードの存在すら隠蔽されます。
382
+
383
+ ### Task Definition の定義
384
+
385
+ ECS で「どのコンテナをどう動かすか」を定義するのが Task Definition です。次のコードでは、Fargate 用の Task Definition を作成し、`nginx` と `echo` の 2 つのコンテナを 1 つのタスクにまとめています。
386
+
387
+ ```typescript
388
+ // ECS TaskDefinition
389
+ const echoTaskDefinition = new ecs.FargateTaskDefinition(this, 'TaskDefinitionEcho', {
390
+ cpu: 256,
391
+ memoryLimitMiB: 512,
392
+ });
393
+ // "nginx" container
394
+ const nginxContainer = echoTaskDefinition.addContainer("EchoConNginx", {
395
+ containerName: "nginx",
396
+ image: ecs.ContainerImage.fromRegistry('ghcr.io/gihyodocker/simple-nginx-proxy:v0.0.1'),
397
+ logging: ecs.LogDrivers.awsLogs({
398
+ streamPrefix: 'echo-nginx',
399
+ logRetention: log.RetentionDays.ONE_MONTH,
400
+ }),
401
+ environment: {
402
+ NGINX_PORT: "80",
403
+ SERVER_NAME: "localhost",
404
+ BACKEND_HOST: "localhost:8080",
405
+ BACKEND_MAX_FAILS: "3",
406
+ BACKEND_FAIL_TIMEOUT: "10s",
407
+ },
408
+ });
409
+ nginxContainer.addPortMappings({
410
+ containerPort: 80,
411
+ hostPort: 80
412
+ })
413
+ // "echo" container
414
+ const echoContainer = echoTaskDefinition.addContainer("EchoConEcho", {
415
+ containerName: "echo",
416
+ image: ecs.ContainerImage.fromRegistry('ghcr.io/gihyodocker/echo:v0.0.1-9-gfe27471-slim'),
417
+ logging: ecs.LogDrivers.awsLogs({
418
+ streamPrefix: 'echo-nginx',
419
+ logRetention: log.RetentionDays.ONE_MONTH,
420
+ }),
421
+ });
422
+ echoContainer.addPortMappings({
423
+ containerPort: 8080,
424
+ hostPort: 8080,
425
+ })
426
+ ```
427
+
428
+ ここでのポイントは次のとおりです。
429
+
430
+ - `FargateTaskDefinition` で CPU・メモリを指定しています。タスク単位でリソースを割り当てる点が ECS の特徴です。
431
+ - `addContainer` で 1 つのタスクに複数のコンテナ(`nginx` と `echo`)を同居させています。`nginx` がリバースプロキシとなり、`localhost:8080` の `echo` コンテナへ転送する構成です。同じタスク内のコンテナは `localhost` で通信できます。
432
+ - `LogDrivers.awsLogs` により、各コンテナのログを CloudWatch Logs へ転送しています。
433
+
434
+ ### Service の定義
435
+
436
+ Task Definition は「設計図」にすぎません。それを実際に「何個、どう動かし続けるか」を定義するのが Service です。
437
+
438
+ ```typescript
439
+ // ECS Service
440
+ const service = new ecs.FargateService(this, 'ServiceEcho', {
441
+ cluster,
442
+ taskDefinition: echoTaskDefinition,
443
+ desiredCount: 1,
444
+ assignPublicIp: true,
445
+ securityGroups: [
446
+ securityGroupApp,
447
+ ]
448
+ });
449
+ service.attachToApplicationTargetGroup(targetGroup);
450
+ ```
451
+
452
+ `FargateService` は、指定した Cluster 上で `echoTaskDefinition` のタスクを `desiredCount: 1`(1 つ)だけ常時起動し続けます。タスクが落ちれば自動で再起動され、台数を増やせばスケールアウトします。さらに `attachToApplicationTargetGroup` により、このスタックで作成した ALB(Application Load Balancer)のターゲットグループへ紐づけ、外部からの HTTP リクエストをタスクへ振り分けています。
453
+
454
+ ### Kubernetes との対応関係
455
+
456
+ ECS の概念は、Kubernetes の概念と次のように対応づけて理解するとわかりやすいでしょう。
457
+
458
+ | ECS の概念 | おおよそ対応する Kubernetes の概念 | 役割 |
459
+ | :--- | :--- | :--- |
460
+ | Cluster | Cluster | コンテナを実行する論理的なグループ |
461
+ | Task Definition | Pod のテンプレート(Deployment の `template`) | コンテナ群・リソース・環境変数などの設計図 |
462
+ | Task | Pod | 実際に起動するコンテナ群の実行単位 |
463
+ | Service | Deployment + Service | タスクを指定数だけ維持し、LB へ振り分ける |
464
+ | Fargate | (ノードレス実行) | サーバー管理不要でタスクを実行する基盤 |
465
+
466
+ 厳密には ECS の Service は Kubernetes の Deployment(レプリカ維持)と Service(負荷分散)の両方の役割を兼ねている点に注意してください。これらの対応関係を押さえておくと、Kubernetes の知識を ECS へ応用しやすくなります。
467
+
468
+ ### PipeCD による ECS デプロイ定義(補足)
469
+
470
+ 本リポジトリの `pipecd-examples/ecs/simple/` には、CDK とは別の形式で ECS を定義するファイルもあります。これは継続的デリバリーツール PipeCD 向けの定義で、Task Definition と Service を YAML で記述します。出典として `pipecd-examples/ecs/simple/taskdef.yaml` の主要部を引用します。
471
+
472
+ ```yaml
473
+ family: nginx-service-fam
474
+ executionRoleArn: arn:aws:iam::XXXX:role/ecsTaskExecutionRole
475
+ containerDefinitions:
476
+ - command: null
477
+ cpu: 100
478
+ image: XXXX.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:1
479
+ memory: 100
480
+ mountPoints: []
481
+ name: web
482
+ portMappings:
483
+ - containerPort: 80
484
+ compatibilities:
485
+ - FARGATE
486
+ requiresCompatibilities:
487
+ - FARGATE
488
+ networkMode: awsvpc
489
+ memory: 512
490
+ cpu: 256
491
+ ```
492
+
493
+ Service 側の定義(`pipecd-examples/ecs/simple/servicedef.yaml`)では、起動するタスク数や起動タイプ、ネットワーク設定を記述します。
494
+
495
+ ```yaml
496
+ serviceName: nginx-service
497
+ desiredCount: 2
498
+ launchType: FARGATE
499
+ networkConfiguration:
500
+ awsvpcConfiguration:
501
+ assignPublicIp: ENABLED
502
+ securityGroups:
503
+ - sg-YYYY
504
+ subnets:
505
+ - subnet-YYYY
506
+ - subnet-YYYY
507
+ ```
508
+
509
+ このように、ECS の構築方法は AWS CDK で記述する方法(`gihyo-ecs`)と、CD ツール向けに宣言的な YAML で記述する方法(PipeCD)など複数あります。いずれの場合も、Task Definition と Service という ECS の基本概念は共通している点を押さえておきましょう。なお `XXXX` や `sg-YYYY` などはプレースホルダであり、実際の値に置き換える必要があります。
510
+
511
+ ---
512
+
513
+ ## まとめ
514
+
515
+ この付録では、ローカル環境から本番のマネージド環境へ移行するという観点で、5 つのコンテナオーケストレーション環境を概観しました。
516
+
517
+ - GKE・EKS・AKS は 3 大クラウドが提供するマネージド Kubernetes であり、本編で学んだマニフェストをほぼそのまま再利用できます。差分が出やすいのは Service や Ingress のような環境依存部分で、AKS の例では Ingress の `ingressClassName` だけを `azure-application-gateway` に変えるだけで済みました。
518
+ - EKS では `eksctl` の `ClusterConfig` でクラスタを宣言的に定義し、IAM identity mapping で AWS の認証と Kubernetes の認可を結びつける点が特徴です。
519
+ - オンプレミスでは `kubeadm` でクラスタを構築し、CNI(Calico など)やソフトウェアロードバランサ(MetalLB)を自分で整備する必要があります。これはマネージド環境が裏で何をしているかを理解する良い機会にもなります。
520
+ - ECS は Kubernetes ではない AWS 独自の環境ですが、Cluster / Task Definition / Service という概念を Kubernetes の Cluster / Pod / Deployment+Service に対応づけて理解すれば、既存の知識を活かせます。
521
+
522
+ どの環境を選ぶにせよ、本編で身につけたコンテナとオーケストレーションの基礎は共通の土台になります。「変更を楽に安全にできる」状態を保つために、アプリケーションの定義(共通部分)と環境固有の設定(差分部分)を切り分けて管理することが、複数環境を扱ううえでの実践的な指針となります。
523
+
524
+ ---
525
+
526
+ ### 関連リンク
527
+
528
+ - [付録 A 開発ツールのセットアップ](appendix-a-dev-tools-setup.md)
529
+ - [付録 C Docker/Kubernetes の Tips](appendix-c-tips.md)
530
+ - [第 6 章 Kubernetes クラスタへのデプロイ](06-kubernetes-deploy-cluster.md)