@k2works/claude-code-booster 4.17.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 (755) hide show
  1. package/lib/assets/.claude/skills/apply-okf/SKILL.md +88 -0
  2. package/lib/assets/.claude/skills/apply-okf/evals/evals.json +8 -0
  3. package/lib/assets/.claude/skills/apply-okf/scripts/__pycache__/okf_apply.cpython-314.pyc +0 -0
  4. package/lib/assets/.claude/skills/apply-okf/scripts/okf_apply.py +397 -0
  5. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/benchmark.json +20 -0
  6. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/benchmark.md +13 -0
  7. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/eval_metadata.json +14 -0
  8. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/grading.json +39 -0
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/index.md +10 -0
  15. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/log.md +7 -0
  16. 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
  17. 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
  18. 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
  19. 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
  20. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/report.md +76 -0
  21. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/grading.json +39 -0
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/index.md +10 -0
  28. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/log.md +7 -0
  29. 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
  30. 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
  31. 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
  32. 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
  33. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/report.md +22 -0
  34. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/eval_metadata.json +13 -0
  35. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/grading.json +34 -0
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/index.md +10 -0
  42. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/log.md +7 -0
  43. 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
  44. 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
  45. 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
  46. 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
  47. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/report.md +61 -0
  48. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/grading.json +34 -0
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/index.md +10 -0
  55. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/log.md +7 -0
  56. 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
  57. 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
  58. 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
  59. 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
  60. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/report.md +18 -0
  61. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/eval_metadata.json +13 -0
  62. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/grading.json +34 -0
  63. 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
  64. 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
  65. 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
  66. 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
  67. 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
  68. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/index.md +10 -0
  69. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/log.md +7 -0
  70. 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
  71. 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
  72. 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
  73. 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
  74. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/report.md +83 -0
  75. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/grading.json +34 -0
  76. 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
  77. 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
  78. 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
  79. 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
  80. 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
  81. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/index.md +10 -0
  82. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/log.md +7 -0
  83. 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
  84. 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
  85. 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
  86. 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
  87. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/report.md +15 -0
  88. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/review.html +1325 -0
  89. package/lib/assets/.claude/skills/closing-iteration/SKILL.md +16 -0
  90. package/lib/assets/.claude/skills/creating-adr/SKILL.md +4 -0
  91. package/lib/assets/.claude/skills/creating-journal/SKILL.md +12 -1
  92. package/lib/assets/.claude/skills/migrating-okf/SKILL.md +149 -0
  93. package/lib/assets/.claude/skills/migrating-okf/evals/evals.json +23 -0
  94. package/lib/assets/.claude/skills/migrating-okf/scripts/__pycache__/okf_check.cpython-314.pyc +0 -0
  95. package/lib/assets/.claude/skills/migrating-okf/scripts/okf_check.py +468 -0
  96. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/benchmark.json +20 -0
  97. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/benchmark.md +13 -0
  98. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/eval_metadata.json +15 -0
  99. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/grading.json +44 -0
  100. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/adr/index.md +10 -0
  101. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/index.md +15 -0
  102. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/log.md +5 -0
  103. 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
  104. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference/index.md +6 -0
  105. 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
  106. 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
  107. 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
  108. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/report.md +85 -0
  109. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/grading.json +44 -0
  110. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/adr/index.md +8 -0
  111. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/index.md +11 -0
  112. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/log.md +7 -0
  113. 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
  114. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference/index.md +9 -0
  115. 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
  116. 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
  117. 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
  118. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/report.md +49 -0
  119. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/eval_metadata.json +13 -0
  120. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/grading.json +34 -0
  121. 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
  122. 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
  123. 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
  124. 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
  125. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/report.md +147 -0
  126. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/review.html +1325 -0
  127. package/lib/assets/.claude/skills/opening-iteration/SKILL.md +15 -0
  128. package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +4 -1
  129. package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +2 -0
  130. package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +3 -1
  131. package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +4 -1
  132. package/lib/assets/.claude/skills/planning-releases/SKILL.md +2 -0
  133. package/lib/assets/.env.example +9 -0
  134. package/lib/assets/CLAUDE.md +218 -216
  135. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +9 -0
  136. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +9 -0
  137. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +9 -0
  138. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +9 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +9 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +9 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +9 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +10 -1
  143. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +9 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +9 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +9 -0
  146. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +9 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +9 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +9 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +9 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +9 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +9 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +9 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +10 -1
  154. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +9 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +9 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +9 -0
  157. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +9 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +9 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +9 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +9 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +9 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +9 -0
  163. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +9 -0
  164. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +9 -0
  165. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +9 -0
  166. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +9 -0
  167. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +9 -0
  168. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +9 -0
  169. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +9 -0
  170. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +9 -0
  171. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +9 -0
  172. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +9 -0
  173. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +9 -0
  174. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +9 -0
  175. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +9 -0
  176. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +9 -0
  177. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +9 -0
  178. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +9 -0
  179. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +3 -3
  180. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +9 -0
  181. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +9 -0
  182. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +9 -0
  183. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +9 -0
  184. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +9 -0
  185. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +9 -0
  186. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +9 -0
  187. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +9 -0
  188. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +9 -0
  189. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +9 -0
  190. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +9 -0
  191. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +9 -0
  192. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +9 -0
  193. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +9 -0
  194. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +9 -0
  195. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +9 -0
  196. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +9 -0
  197. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +9 -0
  198. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +9 -0
  199. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +9 -0
  200. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +9 -0
  201. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +9 -0
  202. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +22 -22
  203. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +9 -0
  204. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +9 -0
  205. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +9 -0
  206. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +9 -0
  207. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +9 -0
  208. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +9 -0
  209. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +9 -0
  210. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +9 -0
  211. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +9 -0
  212. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +9 -0
  213. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +9 -0
  214. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +9 -0
  215. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +9 -0
  216. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +9 -0
  217. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +9 -0
  218. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +9 -0
  219. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +9 -0
  220. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +9 -0
  221. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +9 -0
  222. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +9 -0
  223. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +9 -0
  224. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +9 -0
  225. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +9 -0
  226. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +9 -0
  227. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +9 -0
  228. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +9 -0
  229. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +9 -0
  230. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +9 -0
  231. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +9 -0
  232. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +9 -0
  233. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +9 -0
  234. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +9 -0
  235. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +9 -0
  236. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +9 -0
  237. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +9 -0
  238. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +9 -0
  239. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +9 -0
  240. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +9 -0
  241. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +9 -0
  242. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +9 -0
  243. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +9 -0
  244. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +9 -0
  245. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +9 -0
  246. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +9 -0
  247. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +9 -0
  248. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +9 -0
  249. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +9 -0
  250. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +9 -0
  251. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +9 -0
  252. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +9 -0
  253. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +9 -0
  254. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +9 -0
  255. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +9 -0
  256. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +9 -0
  257. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +9 -0
  258. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +9 -0
  259. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +9 -0
  260. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +9 -0
  261. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +9 -0
  262. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +9 -0
  263. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +9 -0
  264. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +9 -0
  265. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +9 -0
  266. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +9 -0
  267. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +9 -0
  268. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +9 -0
  269. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +9 -0
  270. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +9 -0
  271. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +9 -0
  272. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +9 -0
  273. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +9 -0
  274. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +9 -0
  275. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +9 -0
  276. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +9 -0
  277. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +9 -0
  278. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +9 -0
  279. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +9 -0
  280. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +9 -0
  281. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +9 -0
  282. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +9 -0
  283. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +9 -0
  284. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +9 -0
  285. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +9 -0
  286. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +9 -0
  287. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +9 -0
  288. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +9 -0
  289. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +9 -0
  290. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +9 -0
  291. package/lib/assets/docs/article/getting-start-docker-kubernetes/01-container-and-docker-basics.md +341 -332
  292. package/lib/assets/docs/article/getting-start-docker-kubernetes/02-container-deployment.md +785 -776
  293. package/lib/assets/docs/article/getting-start-docker-kubernetes/03-practical-container-build-deploy.md +466 -457
  294. package/lib/assets/docs/article/getting-start-docker-kubernetes/04-multi-container-application.md +878 -869
  295. package/lib/assets/docs/article/getting-start-docker-kubernetes/05-kubernetes-introduction.md +585 -576
  296. package/lib/assets/docs/article/getting-start-docker-kubernetes/06-kubernetes-deploy-cluster.md +620 -611
  297. package/lib/assets/docs/article/getting-start-docker-kubernetes/07-kubernetes-advanced.md +621 -612
  298. package/lib/assets/docs/article/getting-start-docker-kubernetes/08-kubernetes-packaging.md +518 -509
  299. package/lib/assets/docs/article/getting-start-docker-kubernetes/09-container-operations.md +546 -537
  300. package/lib/assets/docs/article/getting-start-docker-kubernetes/10-optimal-container-image.md +640 -631
  301. package/lib/assets/docs/article/getting-start-docker-kubernetes/11-continuous-delivery.md +607 -598
  302. package/lib/assets/docs/article/getting-start-docker-kubernetes/12-container-use-cases.md +463 -454
  303. package/lib/assets/docs/article/getting-start-docker-kubernetes/13-case-monolith-compose-vs-kustomize.md +346 -337
  304. package/lib/assets/docs/article/getting-start-docker-kubernetes/14-case-event-driven-kustomize-vs-helm.md +324 -315
  305. package/lib/assets/docs/article/getting-start-docker-kubernetes/15-case-escqrs-axon-kustomize-vs-helm.md +297 -288
  306. package/lib/assets/docs/article/getting-start-docker-kubernetes/16-case-escqrs-kafka-kustomize-vs-helm.md +256 -247
  307. package/lib/assets/docs/article/getting-start-docker-kubernetes/17-case-comparison-summary.md +141 -132
  308. package/lib/assets/docs/article/getting-start-docker-kubernetes/18-case-load-testing.md +303 -294
  309. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-a-dev-tools-setup.md +274 -265
  310. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-b-orchestration-environments.md +530 -521
  311. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-c-tips.md +519 -510
  312. package/lib/assets/docs/article/getting-start-docker-kubernetes/outline.md +220 -211
  313. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +9 -0
  314. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +9 -0
  315. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +9 -0
  316. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +9 -0
  317. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +9 -0
  318. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +9 -0
  319. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +9 -0
  320. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +9 -0
  321. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +9 -0
  322. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +9 -0
  323. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +9 -0
  324. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +9 -0
  325. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +9 -0
  326. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +9 -0
  327. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +9 -0
  328. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +9 -0
  329. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +9 -0
  330. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +9 -0
  331. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +9 -0
  332. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +9 -0
  333. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +9 -0
  334. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +9 -0
  335. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +9 -0
  336. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +9 -0
  337. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +9 -0
  338. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +9 -0
  339. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +9 -0
  340. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +9 -0
  341. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +9 -0
  342. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +9 -0
  343. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +9 -0
  344. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +9 -0
  345. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +9 -0
  346. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +9 -0
  347. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +9 -0
  348. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +9 -0
  349. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +2 -2
  350. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +9 -0
  351. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +9 -0
  352. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +9 -0
  353. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +9 -0
  354. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +9 -0
  355. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +9 -0
  356. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +9 -0
  357. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +9 -0
  358. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +9 -0
  359. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +9 -0
  360. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +9 -0
  361. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +9 -0
  362. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +9 -0
  363. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +9 -0
  364. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +9 -0
  365. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +9 -0
  366. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +9 -0
  367. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +9 -0
  368. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +8 -0
  369. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +8 -0
  370. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +8 -0
  371. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +8 -0
  372. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +8 -0
  373. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +8 -0
  374. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +9 -0
  375. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +9 -0
  376. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +9 -0
  377. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +9 -0
  378. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +9 -0
  379. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +9 -0
  380. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +9 -0
  381. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +9 -0
  382. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +9 -0
  383. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +9 -0
  384. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +9 -0
  385. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +9 -0
  386. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +9 -0
  387. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +9 -0
  388. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +9 -0
  389. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +9 -0
  390. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +9 -0
  391. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +9 -0
  392. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +9 -0
  393. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +9 -0
  394. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +9 -0
  395. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +9 -0
  396. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +9 -0
  397. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +9 -0
  398. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +9 -0
  399. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +9 -0
  400. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +9 -0
  401. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +9 -0
  402. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +9 -0
  403. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +9 -0
  404. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +9 -0
  405. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +9 -0
  406. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +9 -0
  407. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +9 -0
  408. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +9 -0
  409. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +9 -0
  410. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +9 -0
  411. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +9 -0
  412. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +9 -0
  413. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +9 -0
  414. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +9 -0
  415. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +9 -0
  416. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +9 -0
  417. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +9 -0
  418. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +9 -0
  419. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +9 -0
  420. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +9 -0
  421. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +9 -0
  422. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +8 -0
  423. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +8 -0
  424. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +8 -0
  425. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +8 -0
  426. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +8 -0
  427. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +8 -0
  428. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +9 -0
  429. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +9 -0
  430. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +9 -0
  431. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +9 -0
  432. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +9 -0
  433. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +9 -0
  434. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +9 -0
  435. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +9 -0
  436. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +9 -0
  437. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +9 -0
  438. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +9 -0
  439. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +9 -0
  440. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +9 -0
  441. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +9 -0
  442. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +9 -0
  443. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +9 -0
  444. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +9 -0
  445. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +9 -0
  446. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +9 -0
  447. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +9 -0
  448. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +9 -0
  449. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +9 -0
  450. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +9 -0
  451. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +9 -0
  452. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +9 -0
  453. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +9 -0
  454. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +9 -0
  455. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +9 -0
  456. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +9 -0
  457. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +9 -0
  458. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +9 -0
  459. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +9 -0
  460. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +9 -0
  461. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +9 -0
  462. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +9 -0
  463. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +9 -0
  464. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +9 -0
  465. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +9 -0
  466. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +9 -0
  467. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +9 -0
  468. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +9 -0
  469. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +9 -0
  470. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +9 -0
  471. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +9 -0
  472. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +9 -0
  473. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +9 -0
  474. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +9 -0
  475. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +9 -0
  476. package/lib/assets/docs/article/grokking-concurrency/all/index.md +0 -1
  477. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +9 -0
  478. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +9 -0
  479. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +9 -0
  480. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +9 -0
  481. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +9 -0
  482. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +9 -0
  483. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +9 -0
  484. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +9 -0
  485. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +0 -10
  486. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +6 -7
  487. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +6 -7
  488. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +6 -7
  489. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +6 -7
  490. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +6 -7
  491. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +6 -7
  492. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +6 -7
  493. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +6 -7
  494. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +0 -10
  495. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +6 -7
  496. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +6 -7
  497. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +6 -7
  498. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +6 -7
  499. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +6 -7
  500. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +6 -7
  501. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +6 -7
  502. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +6 -7
  503. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +0 -10
  504. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +6 -7
  505. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +6 -7
  506. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +6 -7
  507. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +6 -7
  508. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +6 -7
  509. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +6 -7
  510. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +6 -7
  511. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +6 -7
  512. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +0 -10
  513. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +6 -7
  514. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +6 -7
  515. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +6 -7
  516. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +6 -7
  517. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +6 -7
  518. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +6 -7
  519. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +6 -7
  520. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +6 -7
  521. package/lib/assets/docs/article/grokking-concurrency/java/index.md +0 -10
  522. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +8 -9
  523. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +8 -9
  524. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +7 -8
  525. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +8 -9
  526. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +7 -8
  527. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +6 -7
  528. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +6 -7
  529. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +6 -7
  530. package/lib/assets/docs/article/grokking-concurrency/python/index.md +0 -10
  531. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +7 -8
  532. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +10 -11
  533. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +8 -9
  534. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +8 -9
  535. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +9 -10
  536. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +9 -10
  537. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +9 -10
  538. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +8 -9
  539. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +0 -10
  540. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +6 -7
  541. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +6 -7
  542. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +6 -7
  543. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +6 -7
  544. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +6 -7
  545. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +6 -7
  546. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +6 -7
  547. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +6 -7
  548. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +0 -10
  549. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +6 -7
  550. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +6 -7
  551. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +6 -7
  552. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +6 -7
  553. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +6 -7
  554. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +6 -7
  555. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +6 -7
  556. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +6 -7
  557. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +9 -0
  558. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +9 -0
  559. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +9 -0
  560. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +9 -0
  561. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +9 -0
  562. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +9 -0
  563. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +9 -0
  564. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +9 -0
  565. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +9 -0
  566. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +9 -0
  567. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +9 -0
  568. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +9 -0
  569. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +9 -0
  570. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +9 -0
  571. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +9 -0
  572. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +9 -0
  573. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +9 -0
  574. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +9 -0
  575. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +9 -0
  576. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +9 -0
  577. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +9 -0
  578. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +9 -0
  579. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +9 -0
  580. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +9 -0
  581. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +9 -0
  582. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +9 -0
  583. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +9 -0
  584. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +9 -0
  585. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +9 -0
  586. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +9 -0
  587. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +9 -0
  588. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +9 -0
  589. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +9 -0
  590. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +9 -0
  591. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +9 -0
  592. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +9 -0
  593. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +9 -0
  594. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +9 -0
  595. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +9 -0
  596. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +9 -0
  597. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +9 -0
  598. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +9 -0
  599. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +9 -0
  600. package/lib/assets/docs/article/grokkingfp/java/part-1.md +9 -0
  601. package/lib/assets/docs/article/grokkingfp/java/part-2.md +9 -0
  602. package/lib/assets/docs/article/grokkingfp/java/part-3.md +9 -0
  603. package/lib/assets/docs/article/grokkingfp/java/part-4.md +9 -0
  604. package/lib/assets/docs/article/grokkingfp/java/part-5.md +9 -0
  605. package/lib/assets/docs/article/grokkingfp/java/part-6.md +9 -0
  606. package/lib/assets/docs/article/grokkingfp/python/part-1.md +9 -0
  607. package/lib/assets/docs/article/grokkingfp/python/part-2.md +9 -0
  608. package/lib/assets/docs/article/grokkingfp/python/part-3.md +9 -0
  609. package/lib/assets/docs/article/grokkingfp/python/part-4.md +9 -0
  610. package/lib/assets/docs/article/grokkingfp/python/part-5.md +9 -0
  611. package/lib/assets/docs/article/grokkingfp/python/part-6.md +9 -0
  612. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +9 -0
  613. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +9 -0
  614. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +9 -0
  615. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +9 -0
  616. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +9 -0
  617. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +9 -0
  618. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +9 -0
  619. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +9 -0
  620. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +9 -0
  621. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +9 -0
  622. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +9 -0
  623. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +9 -0
  624. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +9 -0
  625. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +9 -0
  626. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +9 -0
  627. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +9 -0
  628. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +9 -0
  629. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +9 -0
  630. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +9 -0
  631. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +9 -0
  632. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +9 -0
  633. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +9 -0
  634. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +9 -0
  635. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +9 -0
  636. package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +9 -0
  637. package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +9 -0
  638. package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +9 -0
  639. package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +9 -0
  640. package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +9 -0
  641. package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +9 -0
  642. package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +9 -0
  643. package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +9 -0
  644. package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +9 -0
  645. package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +9 -0
  646. package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +9 -0
  647. package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +9 -0
  648. package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +9 -0
  649. package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +9 -0
  650. package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +9 -0
  651. package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +9 -0
  652. package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +9 -0
  653. package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +9 -0
  654. package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +9 -0
  655. package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +9 -0
  656. package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +9 -0
  657. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +9 -0
  658. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +9 -0
  659. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +9 -0
  660. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +9 -0
  661. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +9 -0
  662. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +9 -0
  663. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +9 -0
  664. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +9 -0
  665. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +9 -0
  666. package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +9 -0
  667. package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +9 -0
  668. package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +9 -0
  669. package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +9 -0
  670. package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +9 -0
  671. package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +9 -0
  672. package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +9 -0
  673. package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +8 -0
  674. package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +8 -0
  675. package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +8 -0
  676. package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +8 -0
  677. package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +9 -0
  678. package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +9 -0
  679. package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +9 -0
  680. package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +9 -0
  681. package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +9 -0
  682. package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +9 -0
  683. package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +9 -0
  684. package/lib/assets/docs/article/practical-database-design/study/study2-1.md +9 -0
  685. package/lib/assets/docs/article/practical-database-design/study/study2-2.md +9 -0
  686. package/lib/assets/docs/article/practical-database-design/study/study2-3.md +9 -0
  687. package/lib/assets/docs/article/practical-database-design/study/study2-4.md +9 -0
  688. package/lib/assets/docs/article/practical-database-design/study/study2-5.md +9 -0
  689. package/lib/assets/docs/article/practical-database-design/study/study3-1.md +9 -0
  690. package/lib/assets/docs/article/practical-database-design/study/study3-2.md +9 -0
  691. package/lib/assets/docs/article/practical-database-design/study/study3-3.md +9 -0
  692. package/lib/assets/docs/article/practical-database-design/study/study3-4.md +9 -0
  693. package/lib/assets/docs/article/practical-database-design/study/study3-5.md +9 -0
  694. package/lib/assets/docs/article/practical-database-design/study/study4-1.md +9 -0
  695. package/lib/assets/docs/article/practical-database-design/study/study4-2.md +9 -0
  696. package/lib/assets/docs/article/practical-database-design/study/study4-3.md +9 -0
  697. package/lib/assets/docs/article/practical-database-design/study/study4-4.md +9 -0
  698. package/lib/assets/docs/article/practical-database-design/study/study4-5.md +9 -0
  699. package/lib/assets/docs/index.md +4 -0
  700. package/lib/assets/docs/log.md +5 -0
  701. package/lib/assets/docs/operation/index.md +15 -1
  702. 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
  703. 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
  704. 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
  705. 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
  706. 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
  707. 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
  708. package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  709. 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
  710. package/lib/assets/docs/reference/index.md +54 -53
  711. 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
  712. 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
  713. 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
  714. 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
  715. 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
  716. 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
  717. 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
  718. 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
  719. 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
  720. 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
  721. 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
  722. 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
  723. 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
  724. package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +10 -1
  725. 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
  726. 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
  727. 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
  728. 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
  729. package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +10 -1
  730. 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
  731. 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
  732. package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +9 -0
  733. 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
  734. package/lib/assets/docs/template/ADR.md +9 -0
  735. 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
  736. 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
  737. package/lib/assets/docs/template/README.md +9 -0
  738. 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
  739. 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
  740. 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
  741. 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
  742. 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
  743. 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
  744. 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
  745. 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
  746. package/lib/assets/docs/template//344/272/213/344/276/213/345/210/206/346/236/220.md +9 -0
  747. package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +9 -0
  748. 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
  749. package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +7 -8
  750. package/lib/assets/docs/template//350/250/255/350/250/210.md +10 -1
  751. 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
  752. package/lib/assets/gulpfile.js +4 -2
  753. package/lib/assets/ops/scripts/okf.js +272 -0
  754. package/lib/assets/package.json +2 -0
  755. package/package.json +1 -1
@@ -1,509 +1,518 @@
1
- # 第 8 章 Kubernetes アプリケーションのパッケージング
2
-
3
- ![Kubernetes アプリケーションのパッケージングを説明する 4 コマ漫画](images/chapter-08-comic.png)
4
-
5
- *マニフェストを整理し、テンプレートと環境別の値で再利用できるリリース単位にまとめます。*
6
-
7
- ## はじめに
8
-
9
- 前章までで、Pod、Deployment、Service、Ingress、StatefulSet、Job といった Kubernetes のリソースを、素の YAML マニフェストとして記述しデプロイしてきました。小さなアプリケーションであれば、これらのマニフェストを `kubectl apply -f` で適用するだけで十分に運用できます。
10
-
11
- しかし、アプリケーションが成長し、開発・ステージング・本番といった複数の環境で運用するようになると、素の YAML だけでは次のような問題に直面します。
12
-
13
- - **マニフェストの重複**:環境ごとにマニフェスト一式をコピーすると、ほとんど同じ内容のファイルが何セットも生まれます。共通部分を修正するたびに、すべてのコピーに同じ変更を反映しなければなりません。
14
- - **差分管理の難しさ**:環境間で本当に違うのは「レプリカ数」「イメージタグ」「ホスト名」「Service の種別」といったごく一部です。にもかかわらず、ファイル全体を複製してしまうと、どこが意図的な差分でどこが修正漏れなのかが見分けにくくなります。
15
- - **再利用性の低さ**:同じ構成のアプリケーションを別のプロジェクトで使い回したいとき、素の YAML には「外から値を差し替える」仕組みがないため、結局コピーして書き換える作業を繰り返すことになります。
16
-
17
- これらの問題を解決するのが、Kubernetes アプリケーションの **パッケージング** という考え方です。本章では、代表的な 2 つのツールを扱います。
18
-
19
- - **Kustomize**:素の YAML を「base(共通の土台)」と「overlay(環境ごとの差分)」に分け、テンプレート言語を使わずに YAML をオーバーレイ(重ね合わせ)で合成します。`kubectl` に同梱されているため、追加インストールなしで使えます。
20
- - **Helm**:マニフェストを Go テンプレートで記述し、`values.yaml` で値を差し替えながら 1 つの「チャート」としてパッケージ化します。バージョン管理されたアプリケーションの配布・インストールに強みがあります。
21
-
22
- それでは、まず Kustomize から見ていきましょう。
23
-
24
- ---
25
-
26
- ## 8.1 Kustomize
27
-
28
- Kustomize は、素の YAML マニフェストを **テンプレート化せずに** カスタマイズするためのツールです。Go テンプレートのような特別な構文を覚える必要はなく、有効な Kubernetes マニフェストをそのまま材料として扱います。中心となるのは `kustomization.yaml` というファイルで、ここに「どのマニフェストを集めるか」「どんな変換を加えるか」を宣言します。
29
-
30
- ### base 構造 — 共通の土台をまとめる
31
-
32
- 本書のサンプルアプリケーション taskapp では、`k8s/kustomize/base` ディレクトリにアプリケーション全体の土台となるマニフェストを配置しています(出典: `apps/taskapp/k8s/kustomize/base`)。
33
-
34
- ルートの `kustomization.yaml` は、コンポーネントごとのサブディレクトリを `resources` として束ねます。
35
-
36
- ```yaml
37
- # apps/taskapp/k8s/kustomize/base/kustomization.yaml
38
- apiVersion: kustomize.config.k8s.io/v1beta1
39
- kind: Kustomization
40
-
41
- namespace: taskapp
42
-
43
- resources:
44
- - ./mysql
45
- - ./migrator
46
- - ./api
47
- - ./web
48
-
49
- commonLabels:
50
- app.kubernetes.io/name: taskapp
51
- ```
52
-
53
- ここで使われているフィールドの意味は次のとおりです。
54
-
55
- - **`namespace`**:このセットに含まれるすべてのリソースを、指定した名前空間(ここでは `taskapp`)に配置します。マニフェスト 1 枚ごとに `metadata.namespace` を書く必要がありません。
56
- - **`resources`**:合成の対象とするマニフェスト、または別の `kustomization.yaml` を持つディレクトリを列挙します。この例では `mysql`・`migrator`・`api`・`web` という 4 つのコンポーネントを参照しています。
57
- - **`commonLabels`**:列挙したすべてのリソースに共通のラベル(`app.kubernetes.io/name: taskapp`)を付与します。selector やラベルの付け忘れを防げます。
58
-
59
- ### コンポーネントごとの kustomization
60
-
61
- `resources` で参照される各コンポーネントも、それぞれ `kustomization.yaml` を持ちます。たとえば API コンポーネントは次のようになっています。
62
-
63
- ```yaml
64
- # apps/taskapp/k8s/kustomize/base/api/kustomization.yaml
65
- apiVersion: kustomize.config.k8s.io/v1beta1
66
- kind: Kustomization
67
-
68
- secretGenerator:
69
- - name: api-config
70
- files:
71
- - api-config.yaml=./api-config.yaml
72
- type: Opaque
73
-
74
- resources:
75
- - deployment.yaml
76
- - service.yaml
77
-
78
- commonLabels:
79
- app.kubernetes.io/component: api
80
- ```
81
-
82
- ここでは Deployment と Service という素の YAML を `resources` で束ねつつ、`app.kubernetes.io/component: api` というコンポーネント固有のラベルを追加しています。ルートとコンポーネントの両方で `commonLabels` を使うことで、`app.kubernetes.io/name`(アプリケーション全体)と `app.kubernetes.io/component`(構成要素)が階層的に付与される仕組みです。
83
-
84
- さらに注目したいのが **`secretGenerator`** です。これは Secret マニフェストを手書きするのではなく、ファイルの中身から Secret を自動生成する機能です。`files` に指定したファイル(`api-config.yaml`)を読み込み、`api-config` という名前の `Opaque` 型 Secret を作り出します。
85
-
86
- データベース系のコンポーネントでも同じ仕組みが使われています。
87
-
88
- ```yaml
89
- # apps/taskapp/k8s/kustomize/base/mysql/kustomization.yaml
90
- apiVersion: kustomize.config.k8s.io/v1beta1
91
- kind: Kustomization
92
-
93
- secretGenerator:
94
- - name: mysql
95
- files:
96
- - root_password=./secrets/mysql_root_password
97
- - user_password=./secrets/mysql_user_password
98
- type: Opaque
99
-
100
- resources:
101
- - service.yaml
102
- - statefulset.yaml
103
-
104
- commonLabels:
105
- app.kubernetes.io/component: mysql
106
- ```
107
-
108
- `root_password=./secrets/mysql_root_password` のように `キー=ファイルパス` の形で書くと、Secret 内のキー名とファイルを対応づけられます。パスワードのような秘匿情報を YAML に直書きせず、別ファイルとして管理できるのが利点です。
109
-
110
- なお `secretGenerator` で生成される Secret には、内容のハッシュ値が名前のサフィックスとして付与されます。中身が変わると Secret 名も変わるため、Secret を参照する Deployment が自動的に再起動され、設定変更が確実に反映されます。
111
-
112
- migrator コンポーネントは、データベースのマイグレーションを実行する Job をまとめています。
113
-
114
- ```yaml
115
- # apps/taskapp/k8s/kustomize/base/migrator/kustomization.yaml
116
- apiVersion: kustomize.config.k8s.io/v1beta1
117
- kind: Kustomization
118
-
119
- secretGenerator:
120
- - name: migrator
121
- files:
122
- - root_password=./secrets/mysql_root_password
123
- - user_password=./secrets/mysql_user_password
124
- type: Opaque
125
-
126
- resources:
127
- - job.yaml
128
-
129
- commonLabels:
130
- app.kubernetes.io/component: migrator
131
- ```
132
-
133
- このように Kustomize では、アプリケーションを「コンポーネント単位の小さな `kustomization.yaml`」に分解し、それらをルートの `kustomization.yaml` が束ねる、という入れ子の構造を作れます。各コンポーネントは独立して理解・修正でき、全体は 1 コマンドで合成できます。
134
-
135
- ### kubectl kustomize で合成結果を確認する
136
-
137
- `kustomization.yaml` がどんなマニフェストに展開されるかは、`kubectl kustomize` で確認できます。このコマンドはクラスタには何も適用せず、合成結果を標準出力に表示するだけなので安全です。
138
-
139
- ```bash
140
- # base 全体を合成して結果を表示する(クラスタには適用しない)
141
- kubectl kustomize apps/taskapp/k8s/kustomize/base
142
- ```
143
-
144
- 出力には、`namespace: taskapp` が各リソースに設定され、`commonLabels` が反映され、`secretGenerator` から生成された Secret が含まれた、完成形のマニフェストが並びます。適用前にこのコマンドで差分を目視確認することを習慣にすると、意図しない変更を防げます。
145
-
146
- ### kubectl apply -k でデプロイする
147
-
148
- 合成結果に問題がなければ、`-k` オプションでそのままクラスタへ適用します。`-k` は「kustomize ディレクトリを対象にする」という意味で、`-f`(単一ファイル)と対になるオプションです。
149
-
150
- ```bash
151
- # kustomization.yaml を解釈してクラスタに適用する
152
- kubectl apply -k apps/taskapp/k8s/kustomize/base
153
- ```
154
-
155
- 内部的には `kubectl kustomize` で合成した結果を `kubectl apply` に渡すのと同じ動作になります。削除したい場合は `kubectl delete -k` を使います。
156
-
157
- ### overlay — 環境ごとの差分を重ねる
158
-
159
- 「はじめに」で述べた重複の問題は、Kustomize の **base / overlay** という考え方で解決します。共通部分を `base` に置き、環境固有の差分だけを `overlay` 側の `kustomization.yaml` に記述します。overlay は `resources`(または `bases`)で base を参照し、その上に変換を重ねます。
160
-
161
- GitOps のブートストラップ用に用意された echo-bootstrap は、overlay 的に base を参照して上書きする良い例です(出典: `apps/cd/echo-bootstrap/kustomization.yaml`)。
162
-
163
- ```yaml
164
- # echo-bootstrap/kustomization.yaml
165
- apiVersion: kustomize.config.k8s.io/v1beta1
166
- kind: Kustomization
167
- namespace: gitops-echo
168
- resources:
169
- - namespace.yaml
170
- - deployment.yaml
171
- - ingress.yaml
172
- - service.yaml
173
- commonLabels:
174
- app.kubernetes.io/name: echo
175
- ```
176
-
177
- ここでは `namespace: gitops-echo` を指定することで、同じ deployment.yaml・service.yaml を別の名前空間向けに展開できます。base のマニフェストを一切書き換えずに、overlay の `kustomization.yaml` だけで配置先を切り替えられる点が、複製とは決定的に異なります。
178
-
179
- ### namePrefix と images — 名前とイメージを変換する
180
-
181
- overlay でよく使われる変換に、`namePrefix` と `images` があります。argocd のサンプルにある kustomize-guestbook は、`namePrefix` の最小例です(出典: `apps/cd/argocd-example-apps/kustomize-guestbook`)。
182
-
183
- ```yaml
184
- # argocd-example-apps/kustomize-guestbook/kustomization.yaml
185
- namePrefix: kustomize-
186
-
187
- resources:
188
- - guestbook-ui-deployment.yaml
189
- - guestbook-ui-svc.yaml
190
- apiVersion: kustomize.config.k8s.io/v1beta1
191
- kind: Kustomization
192
- ```
193
-
194
- `namePrefix: kustomize-` を指定すると、参照したすべてのリソース名の先頭に `kustomize-` が付きます。対象の Deployment は次のように `guestbook-ui` という名前を持っていますが、
195
-
196
- ```yaml
197
- # argocd-example-apps/kustomize-guestbook/guestbook-ui-deployment.yaml
198
- apiVersion: apps/v1
199
- kind: Deployment
200
- metadata:
201
- name: guestbook-ui
202
- spec:
203
- replicas: 1
204
- revisionHistoryLimit: 3
205
- selector:
206
- matchLabels:
207
- app: guestbook-ui
208
- template:
209
- metadata:
210
- labels:
211
- app: guestbook-ui
212
- spec:
213
- containers:
214
- - image: gcr.io/heptio-images/ks-guestbook-demo:0.1
215
- name: guestbook-ui
216
- ports:
217
- - containerPort: 80
218
- ```
219
-
220
- `namePrefix` を適用すると、`guestbook-ui` は `kustomize-guestbook-ui` という名前で生成されます。selector のラベルとの整合性も Kustomize が自動で面倒を見てくれるため、同じ base を複数 overlay で並行デプロイしても名前が衝突しません。
221
-
222
- 実運用の overlay では、これに加えてコンテナイメージのタグを差し替える `images` フィールドがよく使われます。`images` を使うと、マニフェスト本体の `image:` 行を書き換えずに、overlay 側でタグやリポジトリを上書きできます(例)。
223
-
224
- ```yaml
225
- # overlay 側の kustomization.yaml でイメージタグを差し替える例
226
- images:
227
- - name: gcr.io/heptio-images/ks-guestbook-demo
228
- newTag: "0.2"
229
- ```
230
-
231
- このように `namespace`・`namePrefix`・`commonLabels`・`images` といった変換を overlay に集約することで、「base は触らず、環境差分だけを宣言する」という運用が成立します。これが Kustomize による重複・差分管理問題の解決策です。
232
-
233
- ---
234
-
235
- ## 8.2 Helm
236
-
237
- Helm は、Kubernetes アプリケーションを **チャート(Chart)** という単位でパッケージ化するためのツールです。Kustomize がテンプレートを使わずに YAML を重ね合わせるのに対し、Helm は **Go テンプレート** でマニフェストを記述し、`values.yaml` で与えた値を埋め込んで最終的なマニフェストを生成します。バージョン管理されたアプリケーションを配布・インストール・アップグレードする用途に適しています。
238
-
239
- ここでは argocd のサンプルにある helm-guestbook を題材に、チャートの構造を見ていきます(出典: `apps/cd/argocd-example-apps/helm-guestbook`)。チャートは次のようなファイル構成です。
240
-
241
- ```bash
242
- helm-guestbook/
243
- ├── Chart.yaml # チャートのメタデータ
244
- ├── values.yaml # デフォルトの値
245
- ├── values-production.yaml # 本番環境向けに差し替える値
246
- └── templates/ # Go テンプレート化したマニフェスト群
247
- ├── deployment.yaml
248
- ├── service.yaml
249
- ├── _helpers.tpl
250
- └── NOTES.txt
251
- ```
252
-
253
- ### Chart.yaml — チャートのメタデータ
254
-
255
- `Chart.yaml` には、チャートの名前やバージョンといったメタデータを記述します。
256
-
257
- ```yaml
258
- # argocd-example-apps/helm-guestbook/Chart.yaml
259
- apiVersion: v2
260
- name: helm-guestbook
261
- description: A Helm chart for Kubernetes
262
- type: application
263
- version: 0.1.0
264
- appVersion: "1.0"
265
- ```
266
-
267
- 各フィールドの意味は次のとおりです。
268
-
269
- - **`apiVersion: v2`**:Helm 3 系のチャート形式であることを示します。
270
- - **`name`**:チャートの名前です。
271
- - **`type: application`**:デプロイ可能なアプリケーションチャートであることを示します(再利用ライブラリの場合は `library`)。
272
- - **`version`**:チャート自体のバージョンです。テンプレートや構成を変更するたびにインクリメントします。セマンティックバージョニングに従います。
273
- - **`appVersion`**:パッケージされているアプリケーション本体のバージョンです。チャートのバージョンとは独立して管理されます。
274
-
275
- なお、チャートは `helm package` コマンドで `名前-バージョン.tgz` という単一のアーカイブにまとめられます。本書のサンプルにある `gihyo-docker-kuberbetes/ch07/echo-0.1.0.tgz` は、まさにこの形式でパッケージ化された echo チャートです(出典: `gihyo-docker-kuberbetes/ch07`)。`.tgz` 1 つでチャートを配布・共有できるのが Helm の特徴です。
276
-
277
- ### values.yaml — デフォルトの値
278
-
279
- `values.yaml` には、テンプレートに埋め込むデフォルト値を定義します。
280
-
281
- ```yaml
282
- # argocd-example-apps/helm-guestbook/values.yaml
283
- replicaCount: 1
284
-
285
- image:
286
- repository: gcr.io/heptio-images/ks-guestbook-demo
287
- tag: 0.1
288
- pullPolicy: IfNotPresent
289
-
290
- containerPort: 80
291
-
292
- service:
293
- type: ClusterIP
294
- port: 80
295
-
296
- ingress:
297
- enabled: false
298
- path: /
299
- hosts:
300
- - chart-example.local
301
- tls: []
302
-
303
- resources: {}
304
- nodeSelector: {}
305
- tolerations: []
306
- affinity: {}
307
- ```
308
-
309
- レプリカ数・イメージ・Service の種別・Ingress の有効化など、環境によって変わりうる値がここに集約されています。テンプレート本体には値を直書きせず、すべてこの `values.yaml` を経由して与えるのが Helm の基本方針です。
310
-
311
- ### templates/ — Go テンプレートで値を展開する
312
-
313
- `templates/` 配下のマニフェストは Go テンプレートで書かれており、`{{ .Values.xxx }}` の形で `values.yaml` の値を参照します。Deployment を見てみましょう。
314
-
315
- ```yaml
316
- # argocd-example-apps/helm-guestbook/templates/deployment.yaml
317
- apiVersion: apps/v1
318
- kind: Deployment
319
- metadata:
320
- name: {{ template "helm-guestbook.fullname" . }}
321
- labels:
322
- app: {{ template "helm-guestbook.name" . }}
323
- chart: {{ template "helm-guestbook.chart" . }}
324
- release: {{ .Release.Name }}
325
- heritage: {{ .Release.Service }}
326
- spec:
327
- replicas: {{ .Values.replicaCount }}
328
- revisionHistoryLimit: 3
329
- selector:
330
- matchLabels:
331
- app: {{ template "helm-guestbook.name" . }}
332
- release: {{ .Release.Name }}
333
- template:
334
- metadata:
335
- labels:
336
- app: {{ template "helm-guestbook.name" . }}
337
- release: {{ .Release.Name }}
338
- spec:
339
- containers:
340
- - name: {{ .Chart.Name }}
341
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
342
- imagePullPolicy: {{ .Values.image.pullPolicy }}
343
- ports:
344
- - name: http
345
- containerPort: {{ .Values.containerPort }}
346
- protocol: TCP
347
- livenessProbe:
348
- httpGet:
349
- path: /
350
- port: http
351
- readinessProbe:
352
- httpGet:
353
- path: /
354
- port: http
355
- resources:
356
- {{ toYaml .Values.resources | indent 12 }}
357
- ```
358
-
359
- 注目すべき記法を整理します。
360
-
361
- - **`{{ .Values.replicaCount }}`**:`values.yaml` の `replicaCount` を埋め込みます。`replicas` の値がテンプレートではなく値ファイル側で決まります。
362
- - **`"{{ .Values.image.repository }}:{{ .Values.image.tag }}"`**:リポジトリとタグを連結して `image` 文字列を組み立てます。
363
- - **`{{ .Release.Name }}` / `{{ .Release.Service }}`**:`helm install` 時に決まる「リリース名」などの組み込みオブジェクトを参照します。
364
- - **`{{ template "helm-guestbook.fullname" . }}`**:`_helpers.tpl` で定義した名前付きテンプレートを呼び出します。
365
- - **`{{ toYaml .Values.resources | indent 12 }}`**:`resources` のような構造化された値を YAML に変換し、12 スペースのインデントを付けて差し込みます。
366
-
367
- Service も同様に値で組み立てられます。`type` が `values.yaml` から渡される点に注目してください。
368
-
369
- ```yaml
370
- # argocd-example-apps/helm-guestbook/templates/service.yaml
371
- apiVersion: v1
372
- kind: Service
373
- metadata:
374
- name: {{ template "helm-guestbook.fullname" . }}
375
- labels:
376
- app: {{ template "helm-guestbook.name" . }}
377
- chart: {{ template "helm-guestbook.chart" . }}
378
- release: {{ .Release.Name }}
379
- heritage: {{ .Release.Service }}
380
- spec:
381
- type: {{ .Values.service.type }}
382
- ports:
383
- - port: {{ .Values.service.port }}
384
- targetPort: http
385
- protocol: TCP
386
- name: http
387
- selector:
388
- app: {{ template "helm-guestbook.name" . }}
389
- release: {{ .Release.Name }}
390
- ```
391
-
392
- ### _helpers.tpl と NOTES.txt
393
-
394
- `_helpers.tpl` は、複数のテンプレートから再利用する「名前付きテンプレート」を定義する場所です。たとえばリソース名を組み立てる `helm-guestbook.fullname` は次のように定義されています。
395
-
396
- ```yaml
397
- # argocd-example-apps/helm-guestbook/templates/_helpers.tpl(抜粋)
398
- {{- define "helm-guestbook.fullname" -}}
399
- {{- if .Values.fullnameOverride -}}
400
- {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
401
- {{- else -}}
402
- {{- $name := default .Chart.Name .Values.nameOverride -}}
403
- {{- if contains $name .Release.Name -}}
404
- {{- .Release.Name | trunc 63 | trimSuffix "-" -}}
405
- {{- else -}}
406
- {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
407
- {{- end -}}
408
- {{- end -}}
409
- {{- end -}}
410
- ```
411
-
412
- リリース名とチャート名を組み合わせ、DNS 名の上限である 63 文字に切り詰める処理が共通化されています。これにより、各テンプレートは `{{ template "helm-guestbook.fullname" . }}` と書くだけで一貫した命名規則を共有できます。
413
-
414
- `NOTES.txt` は、インストール完了後にユーザーへ表示される案内文です。これもテンプレートなので、Service の種別に応じてアクセス方法を出し分けられます(出典: `helm-guestbook/templates/NOTES.txt`)。`ClusterIP` の場合は `kubectl port-forward` の手順を、`LoadBalancer` の場合は外部 IP の確認方法を案内する、といった条件分岐が組み込まれています。
415
-
416
- ### values-production.yaml — 環境ごとに値を差し替える
417
-
418
- Helm では、デフォルトの `values.yaml` に対して、環境固有の値だけを別ファイルで上書きできます。helm-guestbook の本番向け値ファイルは、驚くほど短い内容です。
419
-
420
- ```yaml
421
- # argocd-example-apps/helm-guestbook/values-production.yaml
422
- service:
423
- type: LoadBalancer
424
- ```
425
-
426
- デフォルトでは `service.type` は `ClusterIP` ですが、本番ではこのファイルを重ねることで `LoadBalancer` に変わります。差分はこの 2 行だけで、それ以外の値はすべて `values.yaml` のものが使われます。「環境ごとに変えたい値だけを最小限の差分として書く」という、Kustomize の overlay と同じ思想がここにも表れています。
427
-
428
- 本書のサンプルにある echo チャートの値ファイルも同様で、Ingress を有効にしてホスト名を与えるだけのものです(出典: `gihyo-docker-kuberbetes/ch07/echo.yaml`)。
429
-
430
- ```yaml
431
- # gihyo-docker-kuberbetes/ch07/echo.yaml
432
- ingress:
433
- enabled: true
434
- hosts:
435
- - ch06-echo.gihyo.local
436
- ```
437
-
438
- ### helm template / install / upgrade の使い方
439
-
440
- Helm の代表的なコマンドを、用途別に整理します。
441
-
442
- ```bash
443
- # 値を埋め込んだ最終マニフェストを表示する(クラスタには適用しない)
444
- helm template my-guestbook ./helm-guestbook
445
-
446
- # 本番向けの値ファイルを重ねて結果を確認する
447
- helm template my-guestbook ./helm-guestbook -f ./helm-guestbook/values-production.yaml
448
- ```
449
-
450
- `helm template` は Kustomize の `kubectl kustomize` に相当し、テンプレートの展開結果を手元で確認するためのコマンドです。クラスタには触れないため、レビューや CI でのチェックに使えます。
451
-
452
- 実際にクラスタへインストールするには `helm install` を使います。第 1 引数がリリース名、第 2 引数がチャートのパスです。
453
-
454
- ```bash
455
- # my-guestbook というリリース名でチャートをインストールする
456
- helm install my-guestbook ./helm-guestbook
457
-
458
- # 本番向けの値で個別の値を上書きしてインストールする
459
- helm install my-guestbook ./helm-guestbook -f ./helm-guestbook/values-production.yaml
460
- ```
461
-
462
- `-f` で値ファイルを、`--set service.type=LoadBalancer` のように `--set` で個別の値を、コマンドラインから上書きできます。インストール後にチャートや値を変更したい場合は `helm upgrade` を使います。
463
-
464
- ```bash
465
- # リリースを新しいチャート・値で更新する
466
- helm upgrade my-guestbook ./helm-guestbook -f ./helm-guestbook/values-production.yaml
467
- ```
468
-
469
- Helm はインストールごとに「リリース」を記録するため、`helm upgrade` での変更履歴を追跡でき、必要なら以前の状態へロールバックすることも可能です。これがバージョン管理されたパッケージとしての Helm の強みです。
470
-
471
- ---
472
-
473
- ## Kustomize と Helm の使い分け
474
-
475
- Kustomize と Helm はどちらも「環境差分を最小限の記述で管理する」という同じ問題を解きますが、アプローチが異なります。両者の特徴を比較すると次のとおりです。
476
-
477
- | 観点 | Kustomize | Helm |
478
- | :--- | :--- | :--- |
479
- | テンプレート | 使わない(素の YAML を重ね合わせる) | Go テンプレートで記述する |
480
- | 値の差し替え方 | overlay の `kustomization.yaml`(`namespace`・`namePrefix`・`images` 等) | `values.yaml` / `values-production.yaml` / `--set` |
481
- | 環境差分の表現 | base / overlay | デフォルト値 + 環境別 values ファイル |
482
- | 学習コスト | 低い(YAML の知識があればよい) | やや高い(テンプレート構文を覚える必要がある) |
483
- | 導入の手軽さ | `kubectl` に同梱(追加インストール不要) | 別途 `helm` のインストールが必要 |
484
- | パッケージ配布 | ディレクトリ単位(チャートのような単一アーカイブはない) | `.tgz` 形式で配布・共有できる |
485
- | バージョン管理・ロールバック | 仕組みなし(Git 等に委ねる) | リリース履歴を持ち `helm rollback` 可能 |
486
- | 向いている場面 | 自分たちのアプリを環境別に管理する | サードパーティ製アプリの配布・再利用 |
487
-
488
- 大まかな指針としては、次のように考えると選びやすくなります。
489
-
490
- - **自分たちが開発しているアプリケーションを、シンプルに環境別管理したい** → Kustomize。テンプレートを学ぶコストがなく、`kubectl` だけで完結します。
491
- - **配布や再利用、バージョン管理を伴うパッケージにしたい** → Helm。OSS のミドルウェアの多くは Helm チャートとして公開されており、エコシステムが充実しています。
492
-
493
- なお、両者は排他的ではありません。Helm でレンダリングした結果に Kustomize で最終調整を加えるなど、組み合わせて使うこともできます。まずはそれぞれの考え方を理解し、プロジェクトの規模と配布要件に応じて選択するとよいでしょう。
494
-
495
- ---
496
-
497
- ## まとめ
498
-
499
- 本章では、Kubernetes アプリケーションのパッケージング手法として Kustomize と Helm を学びました。
500
-
501
- - 素の YAML を環境ごとに複製すると、重複・差分管理・再利用性の問題が生じます。パッケージングはこれを「共通部分」と「環境差分」に分離することで解決します。
502
- - **Kustomize** は、テンプレートを使わずに `kustomization.yaml` で YAML を重ね合わせます。`resources`・`namespace`・`commonLabels`・`secretGenerator`・`namePrefix`・`images` といったフィールドで base に変換を加え、`kubectl kustomize` で結果を確認し、`kubectl apply -k` で適用します。
503
- - **Helm** は、Go テンプレート化したマニフェストを `values.yaml` で組み立て、チャートとしてパッケージ化します。`Chart.yaml` でメタデータを管理し、`values-production.yaml` で環境差分を最小限に表現し、`helm template`・`helm install`・`helm upgrade` で展開・適用・更新します。
504
- - 両者は「テンプレートの有無」「学習コスト」「エコシステム」で性格が異なります。自分たちのアプリの環境別管理には Kustomize、配布・再利用・バージョン管理を伴うパッケージには Helm が向いています。
505
-
506
- パッケージングを導入することで、マニフェストは「変更を楽に安全にできる」状態に近づきます。これは継続的なデリバリーの土台でもあります。
507
-
508
- - 前の章: [第 7 章 Kubernetes の発展的な利用](07-kubernetes-advanced.md)
509
- - 次の章: [第 9 章 コンテナの運用](09-container-operations.md)
1
+ ---
2
+ type: Article
3
+ title: "第 8 章 Kubernetes アプリケーションのパッケージング"
4
+ description: "前章までで、Pod、Deployment、Service、Ingress、StatefulSet、Job といった Kubernetes のリソースを、素の YAML マニフェストとして記述しデプロイしてきました。"
5
+ tags: [article, getting-start-docker-kubernetes]
6
+ status: stable
7
+ generated: { by: human:kakimomokuri, at: 2026-06-26T00:29:42Z }
8
+ ---
9
+
10
+ # 第 8 章 Kubernetes アプリケーションのパッケージング
11
+
12
+ ![Kubernetes アプリケーションのパッケージングを説明する 4 コマ漫画](images/chapter-08-comic.png)
13
+
14
+ *マニフェストを整理し、テンプレートと環境別の値で再利用できるリリース単位にまとめます。*
15
+
16
+ ## はじめに
17
+
18
+ 前章までで、Pod、Deployment、Service、Ingress、StatefulSet、Job といった Kubernetes のリソースを、素の YAML マニフェストとして記述しデプロイしてきました。小さなアプリケーションであれば、これらのマニフェストを `kubectl apply -f` で適用するだけで十分に運用できます。
19
+
20
+ しかし、アプリケーションが成長し、開発・ステージング・本番といった複数の環境で運用するようになると、素の YAML だけでは次のような問題に直面します。
21
+
22
+ - **マニフェストの重複**:環境ごとにマニフェスト一式をコピーすると、ほとんど同じ内容のファイルが何セットも生まれます。共通部分を修正するたびに、すべてのコピーに同じ変更を反映しなければなりません。
23
+ - **差分管理の難しさ**:環境間で本当に違うのは「レプリカ数」「イメージタグ」「ホスト名」「Service の種別」といったごく一部です。にもかかわらず、ファイル全体を複製してしまうと、どこが意図的な差分でどこが修正漏れなのかが見分けにくくなります。
24
+ - **再利用性の低さ**:同じ構成のアプリケーションを別のプロジェクトで使い回したいとき、素の YAML には「外から値を差し替える」仕組みがないため、結局コピーして書き換える作業を繰り返すことになります。
25
+
26
+ これらの問題を解決するのが、Kubernetes アプリケーションの **パッケージング** という考え方です。本章では、代表的な 2 つのツールを扱います。
27
+
28
+ - **Kustomize**:素の YAML を「base(共通の土台)」と「overlay(環境ごとの差分)」に分け、テンプレート言語を使わずに YAML をオーバーレイ(重ね合わせ)で合成します。`kubectl` に同梱されているため、追加インストールなしで使えます。
29
+ - **Helm**:マニフェストを Go テンプレートで記述し、`values.yaml` で値を差し替えながら 1 つの「チャート」としてパッケージ化します。バージョン管理されたアプリケーションの配布・インストールに強みがあります。
30
+
31
+ それでは、まず Kustomize から見ていきましょう。
32
+
33
+ ---
34
+
35
+ ## 8.1 Kustomize
36
+
37
+ Kustomize は、素の YAML マニフェストを **テンプレート化せずに** カスタマイズするためのツールです。Go テンプレートのような特別な構文を覚える必要はなく、有効な Kubernetes マニフェストをそのまま材料として扱います。中心となるのは `kustomization.yaml` というファイルで、ここに「どのマニフェストを集めるか」「どんな変換を加えるか」を宣言します。
38
+
39
+ ### base 構造 — 共通の土台をまとめる
40
+
41
+ 本書のサンプルアプリケーション taskapp では、`k8s/kustomize/base` ディレクトリにアプリケーション全体の土台となるマニフェストを配置しています(出典: `apps/taskapp/k8s/kustomize/base`)。
42
+
43
+ ルートの `kustomization.yaml` は、コンポーネントごとのサブディレクトリを `resources` として束ねます。
44
+
45
+ ```yaml
46
+ # apps/taskapp/k8s/kustomize/base/kustomization.yaml
47
+ apiVersion: kustomize.config.k8s.io/v1beta1
48
+ kind: Kustomization
49
+
50
+ namespace: taskapp
51
+
52
+ resources:
53
+ - ./mysql
54
+ - ./migrator
55
+ - ./api
56
+ - ./web
57
+
58
+ commonLabels:
59
+ app.kubernetes.io/name: taskapp
60
+ ```
61
+
62
+ ここで使われているフィールドの意味は次のとおりです。
63
+
64
+ - **`namespace`**:このセットに含まれるすべてのリソースを、指定した名前空間(ここでは `taskapp`)に配置します。マニフェスト 1 枚ごとに `metadata.namespace` を書く必要がありません。
65
+ - **`resources`**:合成の対象とするマニフェスト、または別の `kustomization.yaml` を持つディレクトリを列挙します。この例では `mysql`・`migrator`・`api`・`web` という 4 つのコンポーネントを参照しています。
66
+ - **`commonLabels`**:列挙したすべてのリソースに共通のラベル(`app.kubernetes.io/name: taskapp`)を付与します。selector やラベルの付け忘れを防げます。
67
+
68
+ ### コンポーネントごとの kustomization
69
+
70
+ `resources` で参照される各コンポーネントも、それぞれ `kustomization.yaml` を持ちます。たとえば API コンポーネントは次のようになっています。
71
+
72
+ ```yaml
73
+ # apps/taskapp/k8s/kustomize/base/api/kustomization.yaml
74
+ apiVersion: kustomize.config.k8s.io/v1beta1
75
+ kind: Kustomization
76
+
77
+ secretGenerator:
78
+ - name: api-config
79
+ files:
80
+ - api-config.yaml=./api-config.yaml
81
+ type: Opaque
82
+
83
+ resources:
84
+ - deployment.yaml
85
+ - service.yaml
86
+
87
+ commonLabels:
88
+ app.kubernetes.io/component: api
89
+ ```
90
+
91
+ ここでは Deployment と Service という素の YAML を `resources` で束ねつつ、`app.kubernetes.io/component: api` というコンポーネント固有のラベルを追加しています。ルートとコンポーネントの両方で `commonLabels` を使うことで、`app.kubernetes.io/name`(アプリケーション全体)と `app.kubernetes.io/component`(構成要素)が階層的に付与される仕組みです。
92
+
93
+ さらに注目したいのが **`secretGenerator`** です。これは Secret マニフェストを手書きするのではなく、ファイルの中身から Secret を自動生成する機能です。`files` に指定したファイル(`api-config.yaml`)を読み込み、`api-config` という名前の `Opaque` 型 Secret を作り出します。
94
+
95
+ データベース系のコンポーネントでも同じ仕組みが使われています。
96
+
97
+ ```yaml
98
+ # apps/taskapp/k8s/kustomize/base/mysql/kustomization.yaml
99
+ apiVersion: kustomize.config.k8s.io/v1beta1
100
+ kind: Kustomization
101
+
102
+ secretGenerator:
103
+ - name: mysql
104
+ files:
105
+ - root_password=./secrets/mysql_root_password
106
+ - user_password=./secrets/mysql_user_password
107
+ type: Opaque
108
+
109
+ resources:
110
+ - service.yaml
111
+ - statefulset.yaml
112
+
113
+ commonLabels:
114
+ app.kubernetes.io/component: mysql
115
+ ```
116
+
117
+ `root_password=./secrets/mysql_root_password` のように `キー=ファイルパス` の形で書くと、Secret 内のキー名とファイルを対応づけられます。パスワードのような秘匿情報を YAML に直書きせず、別ファイルとして管理できるのが利点です。
118
+
119
+ なお `secretGenerator` で生成される Secret には、内容のハッシュ値が名前のサフィックスとして付与されます。中身が変わると Secret 名も変わるため、Secret を参照する Deployment が自動的に再起動され、設定変更が確実に反映されます。
120
+
121
+ migrator コンポーネントは、データベースのマイグレーションを実行する Job をまとめています。
122
+
123
+ ```yaml
124
+ # apps/taskapp/k8s/kustomize/base/migrator/kustomization.yaml
125
+ apiVersion: kustomize.config.k8s.io/v1beta1
126
+ kind: Kustomization
127
+
128
+ secretGenerator:
129
+ - name: migrator
130
+ files:
131
+ - root_password=./secrets/mysql_root_password
132
+ - user_password=./secrets/mysql_user_password
133
+ type: Opaque
134
+
135
+ resources:
136
+ - job.yaml
137
+
138
+ commonLabels:
139
+ app.kubernetes.io/component: migrator
140
+ ```
141
+
142
+ このように Kustomize では、アプリケーションを「コンポーネント単位の小さな `kustomization.yaml`」に分解し、それらをルートの `kustomization.yaml` が束ねる、という入れ子の構造を作れます。各コンポーネントは独立して理解・修正でき、全体は 1 コマンドで合成できます。
143
+
144
+ ### kubectl kustomize で合成結果を確認する
145
+
146
+ `kustomization.yaml` がどんなマニフェストに展開されるかは、`kubectl kustomize` で確認できます。このコマンドはクラスタには何も適用せず、合成結果を標準出力に表示するだけなので安全です。
147
+
148
+ ```bash
149
+ # base 全体を合成して結果を表示する(クラスタには適用しない)
150
+ kubectl kustomize apps/taskapp/k8s/kustomize/base
151
+ ```
152
+
153
+ 出力には、`namespace: taskapp` が各リソースに設定され、`commonLabels` が反映され、`secretGenerator` から生成された Secret が含まれた、完成形のマニフェストが並びます。適用前にこのコマンドで差分を目視確認することを習慣にすると、意図しない変更を防げます。
154
+
155
+ ### kubectl apply -k でデプロイする
156
+
157
+ 合成結果に問題がなければ、`-k` オプションでそのままクラスタへ適用します。`-k` は「kustomize ディレクトリを対象にする」という意味で、`-f`(単一ファイル)と対になるオプションです。
158
+
159
+ ```bash
160
+ # kustomization.yaml を解釈してクラスタに適用する
161
+ kubectl apply -k apps/taskapp/k8s/kustomize/base
162
+ ```
163
+
164
+ 内部的には `kubectl kustomize` で合成した結果を `kubectl apply` に渡すのと同じ動作になります。削除したい場合は `kubectl delete -k` を使います。
165
+
166
+ ### overlay — 環境ごとの差分を重ねる
167
+
168
+ 「はじめに」で述べた重複の問題は、Kustomize の **base / overlay** という考え方で解決します。共通部分を `base` に置き、環境固有の差分だけを `overlay` 側の `kustomization.yaml` に記述します。overlay は `resources`(または `bases`)で base を参照し、その上に変換を重ねます。
169
+
170
+ GitOps のブートストラップ用に用意された echo-bootstrap は、overlay 的に base を参照して上書きする良い例です(出典: `apps/cd/echo-bootstrap/kustomization.yaml`)。
171
+
172
+ ```yaml
173
+ # echo-bootstrap/kustomization.yaml
174
+ apiVersion: kustomize.config.k8s.io/v1beta1
175
+ kind: Kustomization
176
+ namespace: gitops-echo
177
+ resources:
178
+ - namespace.yaml
179
+ - deployment.yaml
180
+ - ingress.yaml
181
+ - service.yaml
182
+ commonLabels:
183
+ app.kubernetes.io/name: echo
184
+ ```
185
+
186
+ ここでは `namespace: gitops-echo` を指定することで、同じ deployment.yaml・service.yaml を別の名前空間向けに展開できます。base のマニフェストを一切書き換えずに、overlay の `kustomization.yaml` だけで配置先を切り替えられる点が、複製とは決定的に異なります。
187
+
188
+ ### namePrefix と images — 名前とイメージを変換する
189
+
190
+ overlay でよく使われる変換に、`namePrefix` と `images` があります。argocd のサンプルにある kustomize-guestbook は、`namePrefix` の最小例です(出典: `apps/cd/argocd-example-apps/kustomize-guestbook`)。
191
+
192
+ ```yaml
193
+ # argocd-example-apps/kustomize-guestbook/kustomization.yaml
194
+ namePrefix: kustomize-
195
+
196
+ resources:
197
+ - guestbook-ui-deployment.yaml
198
+ - guestbook-ui-svc.yaml
199
+ apiVersion: kustomize.config.k8s.io/v1beta1
200
+ kind: Kustomization
201
+ ```
202
+
203
+ `namePrefix: kustomize-` を指定すると、参照したすべてのリソース名の先頭に `kustomize-` が付きます。対象の Deployment は次のように `guestbook-ui` という名前を持っていますが、
204
+
205
+ ```yaml
206
+ # argocd-example-apps/kustomize-guestbook/guestbook-ui-deployment.yaml
207
+ apiVersion: apps/v1
208
+ kind: Deployment
209
+ metadata:
210
+ name: guestbook-ui
211
+ spec:
212
+ replicas: 1
213
+ revisionHistoryLimit: 3
214
+ selector:
215
+ matchLabels:
216
+ app: guestbook-ui
217
+ template:
218
+ metadata:
219
+ labels:
220
+ app: guestbook-ui
221
+ spec:
222
+ containers:
223
+ - image: gcr.io/heptio-images/ks-guestbook-demo:0.1
224
+ name: guestbook-ui
225
+ ports:
226
+ - containerPort: 80
227
+ ```
228
+
229
+ `namePrefix` を適用すると、`guestbook-ui` は `kustomize-guestbook-ui` という名前で生成されます。selector のラベルとの整合性も Kustomize が自動で面倒を見てくれるため、同じ base を複数 overlay で並行デプロイしても名前が衝突しません。
230
+
231
+ 実運用の overlay では、これに加えてコンテナイメージのタグを差し替える `images` フィールドがよく使われます。`images` を使うと、マニフェスト本体の `image:` 行を書き換えずに、overlay 側でタグやリポジトリを上書きできます(例)。
232
+
233
+ ```yaml
234
+ # overlay 側の kustomization.yaml でイメージタグを差し替える例
235
+ images:
236
+ - name: gcr.io/heptio-images/ks-guestbook-demo
237
+ newTag: "0.2"
238
+ ```
239
+
240
+ このように `namespace`・`namePrefix`・`commonLabels`・`images` といった変換を overlay に集約することで、「base は触らず、環境差分だけを宣言する」という運用が成立します。これが Kustomize による重複・差分管理問題の解決策です。
241
+
242
+ ---
243
+
244
+ ## 8.2 Helm
245
+
246
+ Helm は、Kubernetes アプリケーションを **チャート(Chart)** という単位でパッケージ化するためのツールです。Kustomize がテンプレートを使わずに YAML を重ね合わせるのに対し、Helm は **Go テンプレート** でマニフェストを記述し、`values.yaml` で与えた値を埋め込んで最終的なマニフェストを生成します。バージョン管理されたアプリケーションを配布・インストール・アップグレードする用途に適しています。
247
+
248
+ ここでは argocd のサンプルにある helm-guestbook を題材に、チャートの構造を見ていきます(出典: `apps/cd/argocd-example-apps/helm-guestbook`)。チャートは次のようなファイル構成です。
249
+
250
+ ```bash
251
+ helm-guestbook/
252
+ ├── Chart.yaml # チャートのメタデータ
253
+ ├── values.yaml # デフォルトの値
254
+ ├── values-production.yaml # 本番環境向けに差し替える値
255
+ └── templates/ # Go テンプレート化したマニフェスト群
256
+ ├── deployment.yaml
257
+ ├── service.yaml
258
+ ├── _helpers.tpl
259
+ └── NOTES.txt
260
+ ```
261
+
262
+ ### Chart.yaml — チャートのメタデータ
263
+
264
+ `Chart.yaml` には、チャートの名前やバージョンといったメタデータを記述します。
265
+
266
+ ```yaml
267
+ # argocd-example-apps/helm-guestbook/Chart.yaml
268
+ apiVersion: v2
269
+ name: helm-guestbook
270
+ description: A Helm chart for Kubernetes
271
+ type: application
272
+ version: 0.1.0
273
+ appVersion: "1.0"
274
+ ```
275
+
276
+ 各フィールドの意味は次のとおりです。
277
+
278
+ - **`apiVersion: v2`**:Helm 3 系のチャート形式であることを示します。
279
+ - **`name`**:チャートの名前です。
280
+ - **`type: application`**:デプロイ可能なアプリケーションチャートであることを示します(再利用ライブラリの場合は `library`)。
281
+ - **`version`**:チャート自体のバージョンです。テンプレートや構成を変更するたびにインクリメントします。セマンティックバージョニングに従います。
282
+ - **`appVersion`**:パッケージされているアプリケーション本体のバージョンです。チャートのバージョンとは独立して管理されます。
283
+
284
+ なお、チャートは `helm package` コマンドで `名前-バージョン.tgz` という単一のアーカイブにまとめられます。本書のサンプルにある `gihyo-docker-kuberbetes/ch07/echo-0.1.0.tgz` は、まさにこの形式でパッケージ化された echo チャートです(出典: `gihyo-docker-kuberbetes/ch07`)。`.tgz` 1 つでチャートを配布・共有できるのが Helm の特徴です。
285
+
286
+ ### values.yaml — デフォルトの値
287
+
288
+ `values.yaml` には、テンプレートに埋め込むデフォルト値を定義します。
289
+
290
+ ```yaml
291
+ # argocd-example-apps/helm-guestbook/values.yaml
292
+ replicaCount: 1
293
+
294
+ image:
295
+ repository: gcr.io/heptio-images/ks-guestbook-demo
296
+ tag: 0.1
297
+ pullPolicy: IfNotPresent
298
+
299
+ containerPort: 80
300
+
301
+ service:
302
+ type: ClusterIP
303
+ port: 80
304
+
305
+ ingress:
306
+ enabled: false
307
+ path: /
308
+ hosts:
309
+ - chart-example.local
310
+ tls: []
311
+
312
+ resources: {}
313
+ nodeSelector: {}
314
+ tolerations: []
315
+ affinity: {}
316
+ ```
317
+
318
+ レプリカ数・イメージ・Service の種別・Ingress の有効化など、環境によって変わりうる値がここに集約されています。テンプレート本体には値を直書きせず、すべてこの `values.yaml` を経由して与えるのが Helm の基本方針です。
319
+
320
+ ### templates/ — Go テンプレートで値を展開する
321
+
322
+ `templates/` 配下のマニフェストは Go テンプレートで書かれており、`{{ .Values.xxx }}` の形で `values.yaml` の値を参照します。Deployment を見てみましょう。
323
+
324
+ ```yaml
325
+ # argocd-example-apps/helm-guestbook/templates/deployment.yaml
326
+ apiVersion: apps/v1
327
+ kind: Deployment
328
+ metadata:
329
+ name: {{ template "helm-guestbook.fullname" . }}
330
+ labels:
331
+ app: {{ template "helm-guestbook.name" . }}
332
+ chart: {{ template "helm-guestbook.chart" . }}
333
+ release: {{ .Release.Name }}
334
+ heritage: {{ .Release.Service }}
335
+ spec:
336
+ replicas: {{ .Values.replicaCount }}
337
+ revisionHistoryLimit: 3
338
+ selector:
339
+ matchLabels:
340
+ app: {{ template "helm-guestbook.name" . }}
341
+ release: {{ .Release.Name }}
342
+ template:
343
+ metadata:
344
+ labels:
345
+ app: {{ template "helm-guestbook.name" . }}
346
+ release: {{ .Release.Name }}
347
+ spec:
348
+ containers:
349
+ - name: {{ .Chart.Name }}
350
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
351
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
352
+ ports:
353
+ - name: http
354
+ containerPort: {{ .Values.containerPort }}
355
+ protocol: TCP
356
+ livenessProbe:
357
+ httpGet:
358
+ path: /
359
+ port: http
360
+ readinessProbe:
361
+ httpGet:
362
+ path: /
363
+ port: http
364
+ resources:
365
+ {{ toYaml .Values.resources | indent 12 }}
366
+ ```
367
+
368
+ 注目すべき記法を整理します。
369
+
370
+ - **`{{ .Values.replicaCount }}`**:`values.yaml` の `replicaCount` を埋め込みます。`replicas` の値がテンプレートではなく値ファイル側で決まります。
371
+ - **`"{{ .Values.image.repository }}:{{ .Values.image.tag }}"`**:リポジトリとタグを連結して `image` 文字列を組み立てます。
372
+ - **`{{ .Release.Name }}` / `{{ .Release.Service }}`**:`helm install` 時に決まる「リリース名」などの組み込みオブジェクトを参照します。
373
+ - **`{{ template "helm-guestbook.fullname" . }}`**:`_helpers.tpl` で定義した名前付きテンプレートを呼び出します。
374
+ - **`{{ toYaml .Values.resources | indent 12 }}`**:`resources` のような構造化された値を YAML に変換し、12 スペースのインデントを付けて差し込みます。
375
+
376
+ Service も同様に値で組み立てられます。`type` が `values.yaml` から渡される点に注目してください。
377
+
378
+ ```yaml
379
+ # argocd-example-apps/helm-guestbook/templates/service.yaml
380
+ apiVersion: v1
381
+ kind: Service
382
+ metadata:
383
+ name: {{ template "helm-guestbook.fullname" . }}
384
+ labels:
385
+ app: {{ template "helm-guestbook.name" . }}
386
+ chart: {{ template "helm-guestbook.chart" . }}
387
+ release: {{ .Release.Name }}
388
+ heritage: {{ .Release.Service }}
389
+ spec:
390
+ type: {{ .Values.service.type }}
391
+ ports:
392
+ - port: {{ .Values.service.port }}
393
+ targetPort: http
394
+ protocol: TCP
395
+ name: http
396
+ selector:
397
+ app: {{ template "helm-guestbook.name" . }}
398
+ release: {{ .Release.Name }}
399
+ ```
400
+
401
+ ### _helpers.tpl と NOTES.txt
402
+
403
+ `_helpers.tpl` は、複数のテンプレートから再利用する「名前付きテンプレート」を定義する場所です。たとえばリソース名を組み立てる `helm-guestbook.fullname` は次のように定義されています。
404
+
405
+ ```yaml
406
+ # argocd-example-apps/helm-guestbook/templates/_helpers.tpl(抜粋)
407
+ {{- define "helm-guestbook.fullname" -}}
408
+ {{- if .Values.fullnameOverride -}}
409
+ {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
410
+ {{- else -}}
411
+ {{- $name := default .Chart.Name .Values.nameOverride -}}
412
+ {{- if contains $name .Release.Name -}}
413
+ {{- .Release.Name | trunc 63 | trimSuffix "-" -}}
414
+ {{- else -}}
415
+ {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
416
+ {{- end -}}
417
+ {{- end -}}
418
+ {{- end -}}
419
+ ```
420
+
421
+ リリース名とチャート名を組み合わせ、DNS 名の上限である 63 文字に切り詰める処理が共通化されています。これにより、各テンプレートは `{{ template "helm-guestbook.fullname" . }}` と書くだけで一貫した命名規則を共有できます。
422
+
423
+ `NOTES.txt` は、インストール完了後にユーザーへ表示される案内文です。これもテンプレートなので、Service の種別に応じてアクセス方法を出し分けられます(出典: `helm-guestbook/templates/NOTES.txt`)。`ClusterIP` の場合は `kubectl port-forward` の手順を、`LoadBalancer` の場合は外部 IP の確認方法を案内する、といった条件分岐が組み込まれています。
424
+
425
+ ### values-production.yaml — 環境ごとに値を差し替える
426
+
427
+ Helm では、デフォルトの `values.yaml` に対して、環境固有の値だけを別ファイルで上書きできます。helm-guestbook の本番向け値ファイルは、驚くほど短い内容です。
428
+
429
+ ```yaml
430
+ # argocd-example-apps/helm-guestbook/values-production.yaml
431
+ service:
432
+ type: LoadBalancer
433
+ ```
434
+
435
+ デフォルトでは `service.type` は `ClusterIP` ですが、本番ではこのファイルを重ねることで `LoadBalancer` に変わります。差分はこの 2 行だけで、それ以外の値はすべて `values.yaml` のものが使われます。「環境ごとに変えたい値だけを最小限の差分として書く」という、Kustomize の overlay と同じ思想がここにも表れています。
436
+
437
+ 本書のサンプルにある echo チャートの値ファイルも同様で、Ingress を有効にしてホスト名を与えるだけのものです(出典: `gihyo-docker-kuberbetes/ch07/echo.yaml`)。
438
+
439
+ ```yaml
440
+ # gihyo-docker-kuberbetes/ch07/echo.yaml
441
+ ingress:
442
+ enabled: true
443
+ hosts:
444
+ - ch06-echo.gihyo.local
445
+ ```
446
+
447
+ ### helm template / install / upgrade の使い方
448
+
449
+ Helm の代表的なコマンドを、用途別に整理します。
450
+
451
+ ```bash
452
+ # 値を埋め込んだ最終マニフェストを表示する(クラスタには適用しない)
453
+ helm template my-guestbook ./helm-guestbook
454
+
455
+ # 本番向けの値ファイルを重ねて結果を確認する
456
+ helm template my-guestbook ./helm-guestbook -f ./helm-guestbook/values-production.yaml
457
+ ```
458
+
459
+ `helm template` は Kustomize の `kubectl kustomize` に相当し、テンプレートの展開結果を手元で確認するためのコマンドです。クラスタには触れないため、レビューや CI でのチェックに使えます。
460
+
461
+ 実際にクラスタへインストールするには `helm install` を使います。第 1 引数がリリース名、第 2 引数がチャートのパスです。
462
+
463
+ ```bash
464
+ # my-guestbook というリリース名でチャートをインストールする
465
+ helm install my-guestbook ./helm-guestbook
466
+
467
+ # 本番向けの値で個別の値を上書きしてインストールする
468
+ helm install my-guestbook ./helm-guestbook -f ./helm-guestbook/values-production.yaml
469
+ ```
470
+
471
+ `-f` で値ファイルを、`--set service.type=LoadBalancer` のように `--set` で個別の値を、コマンドラインから上書きできます。インストール後にチャートや値を変更したい場合は `helm upgrade` を使います。
472
+
473
+ ```bash
474
+ # リリースを新しいチャート・値で更新する
475
+ helm upgrade my-guestbook ./helm-guestbook -f ./helm-guestbook/values-production.yaml
476
+ ```
477
+
478
+ Helm はインストールごとに「リリース」を記録するため、`helm upgrade` での変更履歴を追跡でき、必要なら以前の状態へロールバックすることも可能です。これがバージョン管理されたパッケージとしての Helm の強みです。
479
+
480
+ ---
481
+
482
+ ## Kustomize と Helm の使い分け
483
+
484
+ Kustomize と Helm はどちらも「環境差分を最小限の記述で管理する」という同じ問題を解きますが、アプローチが異なります。両者の特徴を比較すると次のとおりです。
485
+
486
+ | 観点 | Kustomize | Helm |
487
+ | :--- | :--- | :--- |
488
+ | テンプレート | 使わない(素の YAML を重ね合わせる) | Go テンプレートで記述する |
489
+ | 値の差し替え方 | overlay の `kustomization.yaml`(`namespace`・`namePrefix`・`images` 等) | `values.yaml` / `values-production.yaml` / `--set` |
490
+ | 環境差分の表現 | base / overlay | デフォルト値 + 環境別 values ファイル |
491
+ | 学習コスト | 低い(YAML の知識があればよい) | やや高い(テンプレート構文を覚える必要がある) |
492
+ | 導入の手軽さ | `kubectl` に同梱(追加インストール不要) | 別途 `helm` のインストールが必要 |
493
+ | パッケージ配布 | ディレクトリ単位(チャートのような単一アーカイブはない) | `.tgz` 形式で配布・共有できる |
494
+ | バージョン管理・ロールバック | 仕組みなし(Git 等に委ねる) | リリース履歴を持ち `helm rollback` 可能 |
495
+ | 向いている場面 | 自分たちのアプリを環境別に管理する | サードパーティ製アプリの配布・再利用 |
496
+
497
+ 大まかな指針としては、次のように考えると選びやすくなります。
498
+
499
+ - **自分たちが開発しているアプリケーションを、シンプルに環境別管理したい** → Kustomize。テンプレートを学ぶコストがなく、`kubectl` だけで完結します。
500
+ - **配布や再利用、バージョン管理を伴うパッケージにしたい** → Helm。OSS のミドルウェアの多くは Helm チャートとして公開されており、エコシステムが充実しています。
501
+
502
+ なお、両者は排他的ではありません。Helm でレンダリングした結果に Kustomize で最終調整を加えるなど、組み合わせて使うこともできます。まずはそれぞれの考え方を理解し、プロジェクトの規模と配布要件に応じて選択するとよいでしょう。
503
+
504
+ ---
505
+
506
+ ## まとめ
507
+
508
+ 本章では、Kubernetes アプリケーションのパッケージング手法として Kustomize と Helm を学びました。
509
+
510
+ - 素の YAML を環境ごとに複製すると、重複・差分管理・再利用性の問題が生じます。パッケージングはこれを「共通部分」と「環境差分」に分離することで解決します。
511
+ - **Kustomize** は、テンプレートを使わずに `kustomization.yaml` で YAML を重ね合わせます。`resources`・`namespace`・`commonLabels`・`secretGenerator`・`namePrefix`・`images` といったフィールドで base に変換を加え、`kubectl kustomize` で結果を確認し、`kubectl apply -k` で適用します。
512
+ - **Helm** は、Go テンプレート化したマニフェストを `values.yaml` で組み立て、チャートとしてパッケージ化します。`Chart.yaml` でメタデータを管理し、`values-production.yaml` で環境差分を最小限に表現し、`helm template`・`helm install`・`helm upgrade` で展開・適用・更新します。
513
+ - 両者は「テンプレートの有無」「学習コスト」「エコシステム」で性格が異なります。自分たちのアプリの環境別管理には Kustomize、配布・再利用・バージョン管理を伴うパッケージには Helm が向いています。
514
+
515
+ パッケージングを導入することで、マニフェストは「変更を楽に安全にできる」状態に近づきます。これは継続的なデリバリーの土台でもあります。
516
+
517
+ - 前の章: [第 7 章 Kubernetes の発展的な利用](07-kubernetes-advanced.md)
518
+ - 次の章: [第 9 章 コンテナの運用](09-container-operations.md)