@k2works/claude-code-booster 4.17.0 → 5.1.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 (759) hide show
  1. package/lib/assets/.claude/skills/apply-docs-structure/SKILL.md +88 -0
  2. package/lib/assets/.claude/skills/apply-docs-structure/evals/evals.json +40 -0
  3. package/lib/assets/.claude/skills/apply-docs-structure/scripts/docs_structure.py +207 -0
  4. package/lib/assets/.claude/skills/apply-okf/SKILL.md +88 -0
  5. package/lib/assets/.claude/skills/apply-okf/evals/evals.json +8 -0
  6. package/lib/assets/.claude/skills/apply-okf/scripts/__pycache__/okf_apply.cpython-314.pyc +0 -0
  7. package/lib/assets/.claude/skills/apply-okf/scripts/okf_apply.py +397 -0
  8. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/benchmark.json +20 -0
  9. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/benchmark.md +13 -0
  10. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/eval_metadata.json +14 -0
  11. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/grading.json +39 -0
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/index.md +10 -0
  18. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/log.md +7 -0
  19. 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
  20. 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
  21. 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
  22. 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
  23. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/report.md +76 -0
  24. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/grading.json +39 -0
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/index.md +10 -0
  31. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/log.md +7 -0
  32. 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
  33. 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
  34. 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
  35. 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
  36. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/report.md +22 -0
  37. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/eval_metadata.json +13 -0
  38. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/grading.json +34 -0
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/index.md +10 -0
  45. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/log.md +7 -0
  46. 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
  47. 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
  48. 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
  49. 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
  50. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/report.md +61 -0
  51. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/grading.json +34 -0
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/index.md +10 -0
  58. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/log.md +7 -0
  59. 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
  60. 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
  61. 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
  62. 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
  63. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/report.md +18 -0
  64. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/eval_metadata.json +13 -0
  65. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/grading.json +34 -0
  66. 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
  67. 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
  68. 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
  69. 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
  70. 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
  71. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/index.md +10 -0
  72. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/log.md +7 -0
  73. 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
  74. 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
  75. 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
  76. 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
  77. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/report.md +83 -0
  78. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/grading.json +34 -0
  79. 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
  80. 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
  81. 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
  82. 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
  83. 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
  84. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/index.md +10 -0
  85. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/log.md +7 -0
  86. 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
  87. 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
  88. 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
  89. 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
  90. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/report.md +15 -0
  91. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/review.html +1325 -0
  92. package/lib/assets/.claude/skills/closing-iteration/SKILL.md +16 -0
  93. package/lib/assets/.claude/skills/creating-adr/SKILL.md +4 -0
  94. package/lib/assets/.claude/skills/creating-journal/SKILL.md +12 -1
  95. package/lib/assets/.claude/skills/migrating-okf/SKILL.md +149 -0
  96. package/lib/assets/.claude/skills/migrating-okf/evals/evals.json +23 -0
  97. package/lib/assets/.claude/skills/migrating-okf/scripts/__pycache__/okf_check.cpython-314.pyc +0 -0
  98. package/lib/assets/.claude/skills/migrating-okf/scripts/okf_check.py +468 -0
  99. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/benchmark.json +20 -0
  100. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/benchmark.md +13 -0
  101. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/eval_metadata.json +15 -0
  102. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/grading.json +44 -0
  103. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/adr/index.md +10 -0
  104. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/index.md +15 -0
  105. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/log.md +5 -0
  106. 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
  107. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference/index.md +6 -0
  108. 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
  109. 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
  110. 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
  111. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/report.md +85 -0
  112. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/grading.json +44 -0
  113. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/adr/index.md +8 -0
  114. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/index.md +11 -0
  115. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/log.md +7 -0
  116. 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
  117. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference/index.md +9 -0
  118. 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
  119. 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
  120. 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
  121. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/report.md +49 -0
  122. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/eval_metadata.json +13 -0
  123. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/grading.json +34 -0
  124. 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
  125. 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
  126. 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
  127. 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
  128. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/report.md +147 -0
  129. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/review.html +1325 -0
  130. package/lib/assets/.claude/skills/opening-iteration/SKILL.md +15 -0
  131. package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +7 -1
  132. package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +4 -0
  133. package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +5 -2
  134. package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +6 -1
  135. package/lib/assets/.claude/skills/planning-releases/SKILL.md +2 -0
  136. package/lib/assets/.env.example +9 -0
  137. package/lib/assets/CLAUDE.md +219 -216
  138. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +9 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +9 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +9 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +9 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +9 -0
  143. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +9 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +9 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +10 -1
  146. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +9 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +9 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +9 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +9 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +9 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +9 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +9 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +9 -0
  154. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +9 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +9 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +10 -1
  157. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +9 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +9 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +9 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +9 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +9 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +9 -0
  163. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +9 -0
  164. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +9 -0
  165. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +9 -0
  166. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +9 -0
  167. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +9 -0
  168. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +9 -0
  169. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +9 -0
  170. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +9 -0
  171. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +9 -0
  172. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +9 -0
  173. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +9 -0
  174. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +9 -0
  175. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +9 -0
  176. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +9 -0
  177. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +9 -0
  178. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +9 -0
  179. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +9 -0
  180. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +9 -0
  181. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +9 -0
  182. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +3 -3
  183. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +9 -0
  184. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +9 -0
  185. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +9 -0
  186. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +9 -0
  187. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +9 -0
  188. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +9 -0
  189. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +9 -0
  190. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +9 -0
  191. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +9 -0
  192. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +9 -0
  193. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +9 -0
  194. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +9 -0
  195. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +9 -0
  196. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +9 -0
  197. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +9 -0
  198. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +9 -0
  199. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +9 -0
  200. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +9 -0
  201. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +9 -0
  202. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +9 -0
  203. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +9 -0
  204. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +9 -0
  205. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +22 -22
  206. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +9 -0
  207. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +9 -0
  208. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +9 -0
  209. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +9 -0
  210. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +9 -0
  211. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +9 -0
  212. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +9 -0
  213. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +9 -0
  214. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +9 -0
  215. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +9 -0
  216. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +9 -0
  217. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +9 -0
  218. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +9 -0
  219. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +9 -0
  220. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +9 -0
  221. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +9 -0
  222. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +9 -0
  223. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +9 -0
  224. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +9 -0
  225. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +9 -0
  226. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +9 -0
  227. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +9 -0
  228. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +9 -0
  229. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +9 -0
  230. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +9 -0
  231. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +9 -0
  232. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +9 -0
  233. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +9 -0
  234. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +9 -0
  235. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +9 -0
  236. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +9 -0
  237. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +9 -0
  238. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +9 -0
  239. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +9 -0
  240. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +9 -0
  241. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +9 -0
  242. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +9 -0
  243. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +9 -0
  244. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +9 -0
  245. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +9 -0
  246. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +9 -0
  247. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +9 -0
  248. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +9 -0
  249. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +9 -0
  250. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +9 -0
  251. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +9 -0
  252. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +9 -0
  253. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +9 -0
  254. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +9 -0
  255. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +9 -0
  256. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +9 -0
  257. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +9 -0
  258. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +9 -0
  259. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +9 -0
  260. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +9 -0
  261. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +9 -0
  262. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +9 -0
  263. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +9 -0
  264. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +9 -0
  265. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +9 -0
  266. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +9 -0
  267. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +9 -0
  268. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +9 -0
  269. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +9 -0
  270. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +9 -0
  271. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +9 -0
  272. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +9 -0
  273. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +9 -0
  274. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +9 -0
  275. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +9 -0
  276. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +9 -0
  277. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +9 -0
  278. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +9 -0
  279. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +9 -0
  280. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +9 -0
  281. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +9 -0
  282. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +9 -0
  283. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +9 -0
  284. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +9 -0
  285. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +9 -0
  286. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +9 -0
  287. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +9 -0
  288. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +9 -0
  289. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +9 -0
  290. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +9 -0
  291. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +9 -0
  292. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +9 -0
  293. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +9 -0
  294. package/lib/assets/docs/article/getting-start-docker-kubernetes/01-container-and-docker-basics.md +341 -332
  295. package/lib/assets/docs/article/getting-start-docker-kubernetes/02-container-deployment.md +785 -776
  296. package/lib/assets/docs/article/getting-start-docker-kubernetes/03-practical-container-build-deploy.md +466 -457
  297. package/lib/assets/docs/article/getting-start-docker-kubernetes/04-multi-container-application.md +878 -869
  298. package/lib/assets/docs/article/getting-start-docker-kubernetes/05-kubernetes-introduction.md +585 -576
  299. package/lib/assets/docs/article/getting-start-docker-kubernetes/06-kubernetes-deploy-cluster.md +620 -611
  300. package/lib/assets/docs/article/getting-start-docker-kubernetes/07-kubernetes-advanced.md +621 -612
  301. package/lib/assets/docs/article/getting-start-docker-kubernetes/08-kubernetes-packaging.md +518 -509
  302. package/lib/assets/docs/article/getting-start-docker-kubernetes/09-container-operations.md +546 -537
  303. package/lib/assets/docs/article/getting-start-docker-kubernetes/10-optimal-container-image.md +640 -631
  304. package/lib/assets/docs/article/getting-start-docker-kubernetes/11-continuous-delivery.md +607 -598
  305. package/lib/assets/docs/article/getting-start-docker-kubernetes/12-container-use-cases.md +463 -454
  306. package/lib/assets/docs/article/getting-start-docker-kubernetes/13-case-monolith-compose-vs-kustomize.md +346 -337
  307. package/lib/assets/docs/article/getting-start-docker-kubernetes/14-case-event-driven-kustomize-vs-helm.md +324 -315
  308. package/lib/assets/docs/article/getting-start-docker-kubernetes/15-case-escqrs-axon-kustomize-vs-helm.md +297 -288
  309. package/lib/assets/docs/article/getting-start-docker-kubernetes/16-case-escqrs-kafka-kustomize-vs-helm.md +256 -247
  310. package/lib/assets/docs/article/getting-start-docker-kubernetes/17-case-comparison-summary.md +141 -132
  311. package/lib/assets/docs/article/getting-start-docker-kubernetes/18-case-load-testing.md +303 -294
  312. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-a-dev-tools-setup.md +274 -265
  313. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-b-orchestration-environments.md +530 -521
  314. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-c-tips.md +519 -510
  315. package/lib/assets/docs/article/getting-start-docker-kubernetes/outline.md +220 -211
  316. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +9 -0
  317. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +9 -0
  318. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +9 -0
  319. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +9 -0
  320. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +9 -0
  321. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +9 -0
  322. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +9 -0
  323. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +9 -0
  324. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +9 -0
  325. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +9 -0
  326. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +9 -0
  327. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +9 -0
  328. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +9 -0
  329. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +9 -0
  330. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +9 -0
  331. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +9 -0
  332. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +9 -0
  333. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +9 -0
  334. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +9 -0
  335. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +9 -0
  336. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +9 -0
  337. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +9 -0
  338. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +9 -0
  339. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +9 -0
  340. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +9 -0
  341. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +9 -0
  342. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +9 -0
  343. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +9 -0
  344. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +9 -0
  345. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +9 -0
  346. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +9 -0
  347. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +9 -0
  348. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +9 -0
  349. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +9 -0
  350. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +9 -0
  351. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +9 -0
  352. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +2 -2
  353. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +9 -0
  354. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +9 -0
  355. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +9 -0
  356. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +9 -0
  357. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +9 -0
  358. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +9 -0
  359. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +9 -0
  360. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +9 -0
  361. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +9 -0
  362. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +9 -0
  363. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +9 -0
  364. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +9 -0
  365. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +9 -0
  366. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +9 -0
  367. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +9 -0
  368. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +9 -0
  369. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +9 -0
  370. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +9 -0
  371. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +8 -0
  372. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +8 -0
  373. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +8 -0
  374. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +8 -0
  375. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +8 -0
  376. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +8 -0
  377. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +9 -0
  378. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +9 -0
  379. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +9 -0
  380. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +9 -0
  381. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +9 -0
  382. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +9 -0
  383. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +9 -0
  384. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +9 -0
  385. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +9 -0
  386. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +9 -0
  387. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +9 -0
  388. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +9 -0
  389. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +9 -0
  390. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +9 -0
  391. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +9 -0
  392. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +9 -0
  393. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +9 -0
  394. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +9 -0
  395. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +9 -0
  396. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +9 -0
  397. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +9 -0
  398. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +9 -0
  399. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +9 -0
  400. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +9 -0
  401. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +9 -0
  402. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +9 -0
  403. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +9 -0
  404. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +9 -0
  405. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +9 -0
  406. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +9 -0
  407. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +9 -0
  408. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +9 -0
  409. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +9 -0
  410. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +9 -0
  411. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +9 -0
  412. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +9 -0
  413. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +9 -0
  414. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +9 -0
  415. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +9 -0
  416. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +9 -0
  417. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +9 -0
  418. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +9 -0
  419. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +9 -0
  420. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +9 -0
  421. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +9 -0
  422. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +9 -0
  423. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +9 -0
  424. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +9 -0
  425. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +8 -0
  426. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +8 -0
  427. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +8 -0
  428. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +8 -0
  429. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +8 -0
  430. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +8 -0
  431. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +9 -0
  432. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +9 -0
  433. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +9 -0
  434. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +9 -0
  435. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +9 -0
  436. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +9 -0
  437. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +9 -0
  438. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +9 -0
  439. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +9 -0
  440. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +9 -0
  441. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +9 -0
  442. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +9 -0
  443. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +9 -0
  444. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +9 -0
  445. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +9 -0
  446. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +9 -0
  447. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +9 -0
  448. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +9 -0
  449. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +9 -0
  450. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +9 -0
  451. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +9 -0
  452. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +9 -0
  453. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +9 -0
  454. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +9 -0
  455. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +9 -0
  456. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +9 -0
  457. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +9 -0
  458. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +9 -0
  459. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +9 -0
  460. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +9 -0
  461. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +9 -0
  462. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +9 -0
  463. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +9 -0
  464. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +9 -0
  465. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +9 -0
  466. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +9 -0
  467. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +9 -0
  468. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +9 -0
  469. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +9 -0
  470. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +9 -0
  471. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +9 -0
  472. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +9 -0
  473. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +9 -0
  474. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +9 -0
  475. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +9 -0
  476. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +9 -0
  477. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +9 -0
  478. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +9 -0
  479. package/lib/assets/docs/article/grokking-concurrency/all/index.md +0 -1
  480. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +9 -0
  481. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +9 -0
  482. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +9 -0
  483. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +9 -0
  484. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +9 -0
  485. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +9 -0
  486. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +9 -0
  487. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +9 -0
  488. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +0 -10
  489. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +6 -7
  490. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +6 -7
  491. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +6 -7
  492. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +6 -7
  493. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +6 -7
  494. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +6 -7
  495. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +6 -7
  496. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +6 -7
  497. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +0 -10
  498. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +6 -7
  499. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +6 -7
  500. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +6 -7
  501. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +6 -7
  502. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +6 -7
  503. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +6 -7
  504. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +6 -7
  505. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +6 -7
  506. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +0 -10
  507. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +6 -7
  508. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +6 -7
  509. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +6 -7
  510. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +6 -7
  511. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +6 -7
  512. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +6 -7
  513. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +6 -7
  514. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +6 -7
  515. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +0 -10
  516. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +6 -7
  517. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +6 -7
  518. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +6 -7
  519. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +6 -7
  520. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +6 -7
  521. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +6 -7
  522. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +6 -7
  523. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +6 -7
  524. package/lib/assets/docs/article/grokking-concurrency/java/index.md +0 -10
  525. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +8 -9
  526. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +8 -9
  527. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +7 -8
  528. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +8 -9
  529. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +7 -8
  530. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +6 -7
  531. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +6 -7
  532. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +6 -7
  533. package/lib/assets/docs/article/grokking-concurrency/python/index.md +0 -10
  534. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +7 -8
  535. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +10 -11
  536. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +8 -9
  537. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +8 -9
  538. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +9 -10
  539. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +9 -10
  540. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +9 -10
  541. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +8 -9
  542. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +0 -10
  543. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +6 -7
  544. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +6 -7
  545. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +6 -7
  546. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +6 -7
  547. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +6 -7
  548. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +6 -7
  549. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +6 -7
  550. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +6 -7
  551. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +0 -10
  552. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +6 -7
  553. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +6 -7
  554. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +6 -7
  555. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +6 -7
  556. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +6 -7
  557. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +6 -7
  558. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +6 -7
  559. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +6 -7
  560. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +9 -0
  561. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +9 -0
  562. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +9 -0
  563. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +9 -0
  564. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +9 -0
  565. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +9 -0
  566. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +9 -0
  567. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +9 -0
  568. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +9 -0
  569. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +9 -0
  570. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +9 -0
  571. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +9 -0
  572. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +9 -0
  573. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +9 -0
  574. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +9 -0
  575. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +9 -0
  576. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +9 -0
  577. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +9 -0
  578. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +9 -0
  579. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +9 -0
  580. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +9 -0
  581. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +9 -0
  582. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +9 -0
  583. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +9 -0
  584. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +9 -0
  585. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +9 -0
  586. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +9 -0
  587. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +9 -0
  588. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +9 -0
  589. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +9 -0
  590. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +9 -0
  591. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +9 -0
  592. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +9 -0
  593. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +9 -0
  594. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +9 -0
  595. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +9 -0
  596. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +9 -0
  597. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +9 -0
  598. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +9 -0
  599. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +9 -0
  600. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +9 -0
  601. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +9 -0
  602. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +9 -0
  603. package/lib/assets/docs/article/grokkingfp/java/part-1.md +9 -0
  604. package/lib/assets/docs/article/grokkingfp/java/part-2.md +9 -0
  605. package/lib/assets/docs/article/grokkingfp/java/part-3.md +9 -0
  606. package/lib/assets/docs/article/grokkingfp/java/part-4.md +9 -0
  607. package/lib/assets/docs/article/grokkingfp/java/part-5.md +9 -0
  608. package/lib/assets/docs/article/grokkingfp/java/part-6.md +9 -0
  609. package/lib/assets/docs/article/grokkingfp/python/part-1.md +9 -0
  610. package/lib/assets/docs/article/grokkingfp/python/part-2.md +9 -0
  611. package/lib/assets/docs/article/grokkingfp/python/part-3.md +9 -0
  612. package/lib/assets/docs/article/grokkingfp/python/part-4.md +9 -0
  613. package/lib/assets/docs/article/grokkingfp/python/part-5.md +9 -0
  614. package/lib/assets/docs/article/grokkingfp/python/part-6.md +9 -0
  615. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +9 -0
  616. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +9 -0
  617. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +9 -0
  618. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +9 -0
  619. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +9 -0
  620. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +9 -0
  621. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +9 -0
  622. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +9 -0
  623. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +9 -0
  624. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +9 -0
  625. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +9 -0
  626. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +9 -0
  627. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +9 -0
  628. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +9 -0
  629. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +9 -0
  630. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +9 -0
  631. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +9 -0
  632. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +9 -0
  633. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +9 -0
  634. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +9 -0
  635. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +9 -0
  636. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +9 -0
  637. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +9 -0
  638. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +9 -0
  639. package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +9 -0
  640. package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +9 -0
  641. package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +9 -0
  642. package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +9 -0
  643. package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +9 -0
  644. package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +9 -0
  645. package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +9 -0
  646. package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +9 -0
  647. package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +9 -0
  648. package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +9 -0
  649. package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +9 -0
  650. package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +9 -0
  651. package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +9 -0
  652. package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +9 -0
  653. package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +9 -0
  654. package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +9 -0
  655. package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +9 -0
  656. package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +9 -0
  657. package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +9 -0
  658. package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +9 -0
  659. package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +9 -0
  660. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +9 -0
  661. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +9 -0
  662. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +9 -0
  663. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +9 -0
  664. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +9 -0
  665. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +9 -0
  666. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +9 -0
  667. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +9 -0
  668. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +9 -0
  669. package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +9 -0
  670. package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +9 -0
  671. package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +9 -0
  672. package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +9 -0
  673. package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +9 -0
  674. package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +9 -0
  675. package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +9 -0
  676. package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +8 -0
  677. package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +8 -0
  678. package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +8 -0
  679. package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +8 -0
  680. package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +9 -0
  681. package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +9 -0
  682. package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +9 -0
  683. package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +9 -0
  684. package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +9 -0
  685. package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +9 -0
  686. package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +9 -0
  687. package/lib/assets/docs/article/practical-database-design/study/study2-1.md +9 -0
  688. package/lib/assets/docs/article/practical-database-design/study/study2-2.md +9 -0
  689. package/lib/assets/docs/article/practical-database-design/study/study2-3.md +9 -0
  690. package/lib/assets/docs/article/practical-database-design/study/study2-4.md +9 -0
  691. package/lib/assets/docs/article/practical-database-design/study/study2-5.md +9 -0
  692. package/lib/assets/docs/article/practical-database-design/study/study3-1.md +9 -0
  693. package/lib/assets/docs/article/practical-database-design/study/study3-2.md +9 -0
  694. package/lib/assets/docs/article/practical-database-design/study/study3-3.md +9 -0
  695. package/lib/assets/docs/article/practical-database-design/study/study3-4.md +9 -0
  696. package/lib/assets/docs/article/practical-database-design/study/study3-5.md +9 -0
  697. package/lib/assets/docs/article/practical-database-design/study/study4-1.md +9 -0
  698. package/lib/assets/docs/article/practical-database-design/study/study4-2.md +9 -0
  699. package/lib/assets/docs/article/practical-database-design/study/study4-3.md +9 -0
  700. package/lib/assets/docs/article/practical-database-design/study/study4-4.md +9 -0
  701. package/lib/assets/docs/article/practical-database-design/study/study4-5.md +9 -0
  702. package/lib/assets/docs/index.md +5 -1
  703. package/lib/assets/docs/log.md +10 -0
  704. package/lib/assets/docs/operation/index.md +15 -1
  705. package/lib/assets/docs/reference/CodexCLIMCP/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/343/203/225/343/203/255/343/203/274.md +13 -4
  706. package/lib/assets/docs/reference/CodexCLIMCP/343/202/265/343/203/274/343/203/220/343/203/274/350/250/255/345/256/232/346/211/213/351/240/206.md +10 -0
  707. package/lib/assets/docs/reference/Java/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +11 -1
  708. package/lib/assets/docs/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  709. package/lib/assets/docs/reference/SonarQube/343/203/255/343/203/274/343/202/253/343/203/253/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +10 -0
  710. package/lib/assets/docs/reference/TypeScript/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +11 -1
  711. package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  712. package/lib/assets/docs/reference/Vim/346/223/215/344/275/234/343/203/236/343/203/213/343/203/245/343/202/242/343/203/253.md +177 -168
  713. package/lib/assets/docs/reference/index.md +55 -53
  714. package/lib/assets/docs/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +7 -8
  715. package/lib/assets/docs/reference//343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  716. package/lib/assets/docs/reference//343/202/244/343/203/263/343/203/225/343/203/251/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  717. package/lib/assets/docs/reference//343/202/250/343/202/257/343/202/271/343/203/210/343/203/252/343/203/274/343/203/240/343/203/227/343/203/255/343/202/260/343/203/251/343/203/237/343/203/263/343/202/260.md +6 -7
  718. package/lib/assets/docs/reference//343/202/263/343/203/274/343/203/207/343/202/243/343/203/263/343/202/260/343/201/250/343/203/206/343/202/271/343/203/210/343/202/254/343/202/244/343/203/211.md +10 -1
  719. package/lib/assets/docs/reference//343/203/206/343/202/271/343/203/210/346/210/246/347/225/245/343/202/254/343/202/244/343/203/211.md +10 -1
  720. package/lib/assets/docs/reference//343/203/207/343/203/274/343/202/277/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  721. package/lib/assets/docs/reference//343/203/211/343/202/255/343/203/245/343/203/241/343/203/263/343/203/210/346/247/213/346/210/220/343/202/254/343/202/244/343/203/211.md +143 -0
  722. 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
  723. 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
  724. 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
  725. 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
  726. 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
  727. 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
  728. package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +10 -1
  729. 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
  730. 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
  731. 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
  732. 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
  733. package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +10 -1
  734. 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
  735. 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
  736. package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +9 -0
  737. 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
  738. package/lib/assets/docs/template/ADR.md +9 -0
  739. 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
  740. 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
  741. package/lib/assets/docs/template/README.md +9 -0
  742. 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
  743. 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
  744. package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +10 -1
  745. 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
  746. 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
  747. 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
  748. 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
  749. 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
  750. package/lib/assets/docs/template//344/272/213/344/276/213/345/210/206/346/236/220.md +9 -0
  751. package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +9 -0
  752. 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
  753. package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +7 -8
  754. package/lib/assets/docs/template//350/250/255/350/250/210.md +10 -1
  755. 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
  756. package/lib/assets/gulpfile.js +4 -2
  757. package/lib/assets/ops/scripts/okf.js +272 -0
  758. package/lib/assets/package.json +2 -0
  759. package/package.json +1 -1
@@ -1,576 +1,585 @@
1
- # 第 5 章 Kubernetes 入門
2
-
3
- ![Kubernetes の基本概念を説明する 4 コマ漫画](images/chapter-05-comic.png)
4
-
5
- *Pod、Node、Service、制御プレーン、宣言的な望ましい状態が Kubernetes の基本になります。*
6
-
7
- ## はじめに
8
-
9
- 前章まででは、Docker による単一ホスト上のコンテナ実行と、Docker Compose や Swarm による複数コンテナの管理を学びました。しかし実運用のシステムでは、複数のサーバー(ホスト)にまたがってコンテナを配置し、障害が起きても自動で復旧させ、トラフィックの増減に応じてコンテナ数を増減させる、といった「オーケストレーション」が求められます。
10
-
11
- この章では、コンテナオーケストレーションのデファクトスタンダードである **Kubernetes** を学びます。Kubernetes は Google が社内で培ったコンテナ運用のノウハウをもとに開発され、現在は CNCF(Cloud Native Computing Foundation)が中立的に運営する OSS です。「k8s(ケーエイツ)」と省略表記されることもあります。
12
-
13
- 本章のゴールは、Kubernetes を構成する基本的なリソース(Pod、ReplicaSet、Deployment、Service、Ingress)の役割と関係を理解し、実際に YAML マニフェストを書いて `kubectl` で適用できるようになることです。説明には、書籍『Docker/Kubernetes 実践コンテナ開発入門(第 2 版)』のサンプルリポジトリ `gihyo-docker-kuberbetes`(ディレクトリ `ch05/`)と、応用例として `echo` アプリの Kustomize 定義(`apps/echo/k8s/kustomize/`)を引用します。
14
-
15
- 学ぶ順序は次のとおりです。
16
-
17
- 1. Kubernetes とは何か、なぜ必要か(5.1)
18
- 2. ローカル環境で Kubernetes を動かす準備(5.2)
19
- 3. Kubernetes の基本概念とクラスタ構成(5.3〜5.5)
20
- 4. アプリケーションを動かすリソース(5.6 Pod 〜 5.8 Deployment)
21
- 5. ネットワークを担うリソース(5.9 Service、5.10 Ingress)
22
-
23
- それぞれのリソースは独立した部品ではなく、上位のリソースが下位のリソースを生成・管理するという階層構造になっています。この「関係」を意識しながら読み進めてください。
24
-
25
- ---
26
-
27
- ## 5.1 Kubernetes とは
28
-
29
- Kubernetes は、コンテナ化されたアプリケーションのデプロイ、スケーリング、運用を自動化するためのオーケストレーションシステムです。「オーケストレーション」とは、指揮者(オーケストレーター)が多数の奏者(コンテナ)をまとめて 1 つの楽曲(システム)を演奏させるイメージから来ています。
30
-
31
- Docker 単体や Docker Compose では、基本的に 1 台のホスト上でコンテナを動かします。しかし、本番システムでは次のような要求が生じます。
32
-
33
- - 複数のホスト(サーバー)にコンテナを分散して配置したい
34
- - あるコンテナが落ちても、自動的に再起動・再配置してほしい
35
- - 負荷に応じてコンテナの数を増やしたり減らしたりしたい(スケーリング)
36
- - 新しいバージョンを無停止でリリースしたい(ローリングアップデート)
37
- - コンテナ群への通信を、安定したエンドポイントに集約したい(サービスディスカバリ・ロードバランシング)
38
-
39
- Kubernetes は、これらをまとめて引き受けてくれます。最大の特徴は **宣言的(declarative)** な運用モデルです。利用者は「最終的にこうあってほしい」という望ましい状態(desired state)を YAML マニフェストで宣言します。すると Kubernetes は現在の状態を絶えず監視し、宣言された状態に一致するよう自動的に調整し続けます。この「あるべき状態へ収束させ続ける」仕組みを **リコンサイル(reconciliation)ループ** と呼びます。
40
-
41
- たとえば「echo というアプリを 3 つ動かす」と宣言しておけば、そのうち 1 つが障害で停止しても、Kubernetes が不足を検知して新しいコンテナを起動し、常に 3 つの状態を保とうとします。命令的(imperative)に「コンテナを起動せよ」「再起動せよ」と都度指示するのではなく、ゴールだけを示す点が宣言的モデルの本質です。
42
-
43
- ---
44
-
45
- ## 5.2 ローカル環境で Kubernetes を実行する
46
-
47
- Kubernetes を学ぶには、手元で動かせる環境があると便利です。本番のような複数ノードのクラスタを用意しなくても、ローカル PC 上に単一ノードの Kubernetes クラスタを構築できるツールがいくつかあります。
48
-
49
- 代表的な選択肢は次のとおりです。
50
-
51
- - **Docker Desktop**:設定画面で「Enable Kubernetes」にチェックを入れるだけで、ローカルに単一ノードの Kubernetes クラスタが起動します。Docker をすでに使っている場合に最も手軽です。
52
- - **Rancher Desktop**:オープンソースのデスクトップアプリで、Kubernetes(k3s ベース)とコンテナランタイムを同梱しています。ライセンス上の制約を避けたい場合の選択肢になります。
53
- - **kind(Kubernetes IN Docker)**:Docker コンテナ自体を Kubernetes のノードとして使う軽量ツールです。CI 環境や、複数ノード構成を手軽に試したいときに向いています。
54
-
55
- これらのインストール手順や OS ごとの細かな設定は環境差が大きいため、本書では **付録 A** に詳細を委ねます。ここでは「いずれかのローカル Kubernetes が起動済みで、`kubectl` がそのクラスタに接続できる状態」になっていることを前提に進めます。
56
-
57
- ### kubectl の基本操作
58
-
59
- `kubectl`(キューブコントロール、または「キューブシーティーエル」)は、Kubernetes クラスタを操作するためのコマンドラインツールです。本章で繰り返し使う基本操作を先に押さえておきましょう。
60
-
61
- まず、接続先のクラスタが正しいか確認します。
62
-
63
- ```bash
64
- # 現在の接続先(コンテキスト)を確認する
65
- kubectl config current-context
66
-
67
- # クラスタを構成するノードの一覧を表示する
68
- kubectl get nodes
69
- ```
70
-
71
- リソースの作成・取得・確認・削除は、次の 5 つを覚えておけば本章の操作はほぼ網羅できます。
72
-
73
- ```bash
74
- # マニフェスト(YAML)を適用してリソースを作成・更新する
75
- kubectl apply -f simple-pod.yaml
76
-
77
- # リソースの一覧を取得する(pod / replicaset / deployment / service / ingress など)
78
- kubectl get pod
79
-
80
- # リソースの詳細(イベントや状態の遷移を含む)を確認する
81
- kubectl describe pod simple-echo
82
-
83
- # コンテナのログを表示する(複数コンテナの Pod では -c でコンテナ名を指定)
84
- kubectl logs simple-echo -c echo
85
-
86
- # マニフェストで作成したリソースを削除する
87
- kubectl delete -f simple-pod.yaml
88
- ```
89
-
90
- `apply` は宣言的な操作で、同じマニフェストを何度適用しても結果が一定になる(冪等)点が重要です。マニフェストを書き換えて再度 `apply` すれば、差分だけが反映されます。トラブル時はまず `kubectl describe`(リソースに紐づくイベントが見られる)と `kubectl logs`(アプリのログが見られる)を確認するのが定石です。
91
-
92
- ---
93
-
94
- ## 5.3 Kubernetes の概念
95
-
96
- Kubernetes には多くのリソース(オブジェクト)が登場しますが、本章で扱う中核は次の 5 つです。これらは互いに関係し合っています。
97
-
98
- | リソース | 役割 |
99
- | :--- | :--- |
100
- | Pod | コンテナの最小デプロイ単位。1 つ以上のコンテナをまとめる |
101
- | ReplicaSet | 指定した数の Pod を維持する(レプリカ管理) |
102
- | Deployment | ReplicaSet を管理し、ローリングアップデートやロールバックを担う |
103
- | Service | Pod 群への安定したアクセス先(仮想 IP・名前)を提供する |
104
- | Ingress | クラスタ外部からの HTTP(S) アクセスを Service に振り分ける |
105
-
106
- これらの関係を図にすると次のようになります。上位のリソースが下位のリソースを生成・管理し、ラベルセレクタによって紐づけられています。本章を通じて何度も立ち戻る、最も重要な図です。
107
-
108
- ```plantuml
109
- @startuml
110
- title Kubernetes 主要リソースの関係
111
-
112
- actor "外部ユーザー" as user
113
-
114
- rectangle "Ingress\n(echo.gihyo.local → echo:80)" as ingress
115
- rectangle "Service\n(selector: app=echo)" as service
116
-
117
- package "Deployment (echo)" {
118
- rectangle "ReplicaSet\n(replicas: 4)" as rs
119
- rectangle "Pod\n(labels: app=echo)" as pod1
120
- rectangle "Pod\n(labels: app=echo)" as pod2
121
- rectangle "Pod\n(labels: app=echo)" as pod3
122
- rectangle "Pod\n(labels: app=echo)" as pod4
123
- }
124
-
125
- user --> ingress : HTTP
126
- ingress --> service : ルール一致で転送
127
- service ..> pod1 : labelで選択
128
- service ..> pod2
129
- service ..> pod3
130
- service ..> pod4
131
- rs --> pod1 : 生成・維持
132
- rs --> pod2
133
- rs --> pod3
134
- rs --> pod4
135
-
136
- note bottom of rs
137
- Deployment が ReplicaSet を、
138
- ReplicaSet が Pod を管理する
139
- end note
140
- @enduml
141
- ```
142
-
143
- この章ではこの図を下から上へ(Pod → ReplicaSet → Deployment → Service → Ingress の順に)組み立てていきます。
144
-
145
- ---
146
-
147
- ## 5.4 Kubernetes クラスタと Node
148
-
149
- Kubernetes の実行環境全体を **クラスタ(Cluster)** と呼びます。クラスタは、大きく分けて 2 種類のマシン(Node)から構成されます。
150
-
151
- - **コントロールプレーン(Control Plane)**:クラスタ全体を管理する頭脳です。API サーバー(`kube-apiserver`、`kubectl` の接続先)、状態を保存するデータストア(`etcd`)、リソースを監視し調整するコントローラ(`kube-controller-manager`)、Pod をどの Node に配置するか決めるスケジューラ(`kube-scheduler`)などで構成されます。
152
- - **ワーカー Node(Node)**:実際にコンテナ(Pod)が動くマシンです。各 Node では、コントロールプレーンと通信してコンテナを起動・監視する `kubelet` と、ネットワークを担う `kube-proxy` が動作しています。
153
-
154
- 利用者は `kubectl` を通じてコントロールプレーンの API サーバーに「望ましい状態」を伝えます。すると、コントローラとスケジューラが協調して、適切な Node 上に Pod を配置します。どの Node に配置されるかは Kubernetes が自動的に判断するため、利用者が個々のサーバーを意識する必要はありません。
155
-
156
- ローカル環境(Docker Desktop など)では、コントロールプレーンとワーカー Node が同じ 1 台に同居した単一ノード構成になります。`kubectl get nodes` を実行すると、その 1 つの Node が表示されます。
157
-
158
- ```bash
159
- # Node の一覧を確認する(ローカル環境では 1 つ表示される例)
160
- kubectl get nodes
161
- ```
162
-
163
- ---
164
-
165
- ## 5.5 Namespace
166
-
167
- **Namespace(名前空間)** は、1 つのクラスタの中を論理的に分割する仕組みです。同じクラスタを複数のチームや用途(開発・検証など)で共有する場合に、リソースをグループ分けして名前の衝突を避けたり、アクセス権限やリソース制限を分けたりできます。
168
-
169
- クラスタには最初からいくつかの Namespace が用意されています。
170
-
171
- ```bash
172
- # Namespace の一覧を表示する
173
- kubectl get namespace
174
- ```
175
-
176
- 代表的なものは次のとおりです。
177
-
178
- - `default`:明示的に Namespace を指定しなかったときに使われる既定の名前空間。本章のサンプルもここに作成されます。
179
- - `kube-system`:Kubernetes 自身のコンポーネント(ダッシュボードや DNS など)が動く名前空間。
180
- - `kube-public`:すべてのユーザーが読み取れる名前空間。
181
-
182
- `kubectl` のコマンドに `--namespace`(短縮形 `-n`)を付けると、対象の Namespace を切り替えられます。たとえば、`ch05/install-dashboard.sh` では Kubernetes Dashboard を導入したうえで、`kube-system` Namespace の Pod を確認しています(出典:`gihyo-docker-kuberbetes/ch05/install-dashboard.sh`)。
183
-
184
- ```bash
185
- # kube-system 名前空間の Pod を、ラベルで絞り込んで確認する
186
- kubectl get pod --namespace=kube-system -l k8s-app=kubernetes-dashboard
187
- ```
188
-
189
- 本章のサンプルでは Namespace を明示しないため、すべて `default` に作成されます。`kubectl get pod` のように `-n` を省略した場合は `default` が対象になる、と覚えておけば十分です。
190
-
191
- ---
192
-
193
- ## 5.6 Pod
194
-
195
- **Pod(ポッド)** は、Kubernetes でアプリケーションを動かす最小のデプロイ単位です。1 つの Pod は 1 つ以上のコンテナをまとめたもので、同じ Pod 内のコンテナは同じネットワーク(同じ IP アドレス)とストレージを共有します。そのため、Pod 内のコンテナどうしは `localhost` で通信できます。
196
-
197
- 「なぜコンテナではなく Pod が単位なのか」というと、密接に連携する複数のコンテナ(たとえば、リバースプロキシとアプリ本体)を 1 セットとして扱いたいケースがあるからです。本章のサンプルは、まさにその構成です。
198
-
199
- 次のマニフェストは、`nginx`(リバースプロキシ)と `echo`(アプリ本体)の 2 つのコンテナを 1 つの Pod にまとめたものです(出典:`gihyo-docker-kuberbetes/ch05/simple-pod.yaml`)。
200
-
201
- ```yaml
202
- apiVersion: v1
203
- kind: Pod
204
- metadata:
205
- name: simple-echo
206
- spec:
207
- containers:
208
- - name: nginx
209
- image: gihyodocker/nginx:latest
210
- env:
211
- - name: BACKEND_HOST
212
- value: localhost:8080
213
- ports:
214
- - containerPort: 80
215
- - name: echo
216
- image: gihyodocker/echo:latest
217
- ports:
218
- - containerPort: 8080
219
- ```
220
-
221
- マニフェストの構造を読み解きましょう。
222
-
223
- - `apiVersion` / `kind`:このリソースの種別を表します。Pod は `v1`(コア API グループ)の `Pod` です。
224
- - `metadata.name`:リソースの名前です。ここでは `simple-echo`。
225
- - `spec.containers`:この Pod が持つコンテナの定義リストです。
226
- - `nginx` コンテナは環境変数 `BACKEND_HOST` に `localhost:8080` を指定しています。同じ Pod 内の `echo` コンテナがポート 8080 で待ち受けているため、`localhost` 経由でアクセスできるわけです。これが「Pod 内のコンテナはネットワークを共有する」ことの具体例です。
227
-
228
- このマニフェストを適用し、状態を確認してみます。
229
-
230
- ```bash
231
- # Pod を作成する
232
- kubectl apply -f simple-pod.yaml
233
-
234
- # Pod の状態を確認する(READY 列が 2/2 になれば 2 コンテナとも起動済み)
235
- kubectl get pod
236
-
237
- # 詳細やイベントを確認する
238
- kubectl describe pod simple-echo
239
- ```
240
-
241
- `kubectl get pod` の出力例(値は環境により異なります)は次のようなイメージです。
242
-
243
- ```text
244
- NAME READY STATUS RESTARTS AGE
245
- simple-echo 2/2 Running 0 30s
246
- ```
247
-
248
- ただし、Pod を単体で作成する運用は実務ではほとんど行いません。Pod は障害で停止しても自動では復旧しないからです。Pod の数を維持し、自動復旧させるために登場するのが、次の ReplicaSet です。
249
-
250
- ---
251
-
252
- ## 5.7 ReplicaSet
253
-
254
- **ReplicaSet(レプリカセット)** は、指定した数の同一 Pod(レプリカ)が常に動いている状態を維持するリソースです。Pod が落ちれば新しい Pod を起動し、多すぎれば余分な Pod を停止して、宣言した数(`replicas`)に収束させ続けます。
255
-
256
- 次のマニフェストは、5.6 の Pod と同じ 2 コンテナ構成を、3 つのレプリカとして維持する ReplicaSet です(出典:`gihyo-docker-kuberbetes/ch05/simple-replicaset.yaml`)。
257
-
258
- ```yaml
259
- apiVersion: apps/v1
260
- kind: ReplicaSet
261
- metadata:
262
- name: echo
263
- labels:
264
- app: echo
265
- spec:
266
- replicas: 3
267
- selector:
268
- matchLabels:
269
- app: echo
270
- template:
271
- metadata:
272
- labels:
273
- app: echo
274
- spec:
275
- containers:
276
- - name: nginx
277
- image: gihyodocker/nginx:latest
278
- env:
279
- - name: BACKEND_HOST
280
- value: localhost:8080
281
- ports:
282
- - containerPort: 80
283
- - name: echo
284
- image: gihyodocker/echo:latest
285
- ports:
286
- - containerPort: 8080
287
- ```
288
-
289
- Pod のマニフェストとの差分が、ReplicaSet を理解する鍵です。
290
-
291
- - `kind` が `Pod` から `ReplicaSet` に変わり、`apiVersion` も `apps/v1` になっています。
292
- - `spec.replicas: 3`:維持したい Pod の数を宣言します。
293
- - `spec.template`:生成する Pod の「ひな型」です。よく見ると、5.6 の Pod の `spec.containers` がそのままここに入れ子になっています。ReplicaSet はこのテンプレートをもとに Pod を量産します。
294
- - `spec.selector.matchLabels` と `spec.template.metadata.labels`:ここが最重要です。ReplicaSet は「`app: echo` というラベルを持つ Pod」を自分の管理対象として認識します(`selector`)。一方、生成する Pod には同じ `app: echo` というラベルを付けます(`template` の `labels`)。この **ラベルとセレクタが一致** することで、ReplicaSet は自分が作った Pod を管理できるのです。
295
-
296
- ```bash
297
- # ReplicaSet を作成する
298
- kubectl apply -f simple-replicaset.yaml
299
-
300
- # ReplicaSet と、それが生成した Pod を確認する
301
- kubectl get replicaset
302
- kubectl get pod
303
- ```
304
-
305
- ここで、3 つの Pod のうち 1 つを手動で削除してみると、ReplicaSet がすぐに不足を検知して新しい Pod を起動し、再び 3 つに戻すことが確認できます。これが宣言的モデルとリコンサイルループの威力です。
306
-
307
- ```bash
308
- # Pod を 1 つ削除しても、ReplicaSet が自動で補充して 3 つに戻す
309
- kubectl delete pod <削除したい Pod 名>
310
- kubectl get pod
311
- ```
312
-
313
- ### ラベルによる管理対象の使い分け
314
-
315
- ラベルは単なる名札ではなく、リソースを束ねる「セレクタの条件」として機能します。`ch05/simple-replicaset-with-label.yaml` は、`app: echo` に加えて `release` ラベル(`spring` / `summer`)を使い、同じアプリの中でリリース系統を分けて管理する例です(出典:`gihyo-docker-kuberbetes/ch05/simple-replicaset-with-label.yaml`)。
316
-
317
- ```yaml
318
- apiVersion: apps/v1
319
- kind: ReplicaSet
320
- metadata:
321
- name: echo-spring
322
- labels:
323
- app: echo
324
- release: spring
325
- spec:
326
- replicas: 1
327
- selector:
328
- matchLabels:
329
- app: echo
330
- release: spring
331
- template:
332
- metadata:
333
- labels:
334
- app: echo
335
- release: spring
336
- spec:
337
- containers:
338
- - name: nginx
339
- image: gihyodocker/nginx:latest
340
- env:
341
- - name: BACKEND_HOST
342
- value: localhost:8080
343
- ports:
344
- - containerPort: 80
345
- - name: echo
346
- image: gihyodocker/echo:latest
347
- ports:
348
- - containerPort: 8080
349
- ```
350
-
351
- このファイルには `echo-spring`(replicas: 1)と `echo-summer`(replicas: 2)の 2 つの ReplicaSet が `---` で区切って定義されています。`echo-spring` のセレクタは `app: echo` かつ `release: spring` の両方を満たす Pod だけを管理対象にするため、`echo-summer` の Pod とは混ざりません。ラベルの組み合わせで管理対象を精密に絞り込める、という点を押さえておきましょう。
352
-
353
- ただし、ReplicaSet を直接運用することも実務では稀です。アプリのバージョンアップ(イメージの差し替え)を安全に行うには、さらに上位の Deployment を使います。
354
-
355
- ---
356
-
357
- ## 5.8 Deployment
358
-
359
- **Deployment(デプロイメント)** は、ReplicaSet を管理する上位リソースです。Deployment を使うと、アプリケーションの **ローリングアップデート**(無停止での段階的なバージョン更新)と **ロールバック**(問題があったときに前のバージョンへ戻す操作)が可能になります。実務でアプリを動かす際は、この Deployment が事実上の標準です。
360
-
361
- 次のマニフェストは、5.7 の ReplicaSet とほぼ同じ内容を Deployment として定義し、レプリカ数を 4 にしたものです(出典:`gihyo-docker-kuberbetes/ch05/simple-deployment.yaml`)。
362
-
363
- ```yaml
364
- apiVersion: apps/v1
365
- kind: Deployment
366
- metadata:
367
- name: echo
368
- labels:
369
- app: echo
370
- spec:
371
- replicas: 4
372
- selector:
373
- matchLabels:
374
- app: echo
375
- template:
376
- metadata:
377
- labels:
378
- app: echo
379
- spec:
380
- containers:
381
- - name: nginx
382
- image: gihyodocker/nginx:latest
383
- env:
384
- - name: BACKEND_HOST
385
- value: localhost:8080
386
- ports:
387
- - containerPort: 80
388
- - name: echo
389
- image: gihyodocker/echo:latest
390
- ports:
391
- - containerPort: 8080
392
- ```
393
-
394
- ReplicaSet のマニフェストとの差分は、ほぼ `kind` が `Deployment` になっただけです。`spec.replicas`・`spec.selector`・`spec.template` の構造はそのまま引き継がれています。これは偶然ではなく、**Deployment が内部で ReplicaSet を生成し、その ReplicaSet が Pod を生成する** という三段の管理構造になっているためです。
395
-
396
- ```bash
397
- # Deployment を作成する
398
- kubectl apply -f simple-deployment.yaml
399
-
400
- # Deployment → ReplicaSet → Pod が連鎖的に生成されることを確認する
401
- kubectl get deployment
402
- kubectl get replicaset
403
- kubectl get pod
404
- ```
405
-
406
- Deployment の真価は、テンプレート(とくにコンテナイメージのタグ)を書き換えて再度 `kubectl apply` したときに発揮されます。Deployment は新しいテンプレートに対応する **新しい ReplicaSet** を作り、新 ReplicaSet の Pod を少しずつ増やしながら旧 ReplicaSet の Pod を減らしていきます。これにより、サービスを止めずにバージョンを入れ替えられます。問題が起きた場合は、`kubectl rollout undo` で前の ReplicaSet に戻せます。
407
-
408
- ```bash
409
- # ロールアウト(更新)の進行状況を確認する
410
- kubectl rollout status deployment echo
411
-
412
- # 直前のバージョンに戻す(ロールバック)
413
- kubectl rollout undo deployment echo
414
- ```
415
-
416
- 「Pod を直接作らず、ReplicaSet も直接作らず、Deployment を宣言する」――これが Kubernetes でアプリを動かす際の基本姿勢です。
417
-
418
- ---
419
-
420
- ## 5.9 Service
421
-
422
- ここまでで、Deployment によって複数の Pod を安定して動かせるようになりました。しかし、Pod には別の課題があります。Pod は障害復旧やスケーリングのたびに作り直され、その都度 IP アドレスが変わります。クライアントが個々の Pod の IP を直接指定していては、通信先が安定しません。
423
-
424
- この問題を解決するのが **Service(サービス)** です。Service は、ラベルセレクタで選んだ Pod 群に対して、**安定した仮想 IP(ClusterIP)と DNS 名** を提供します。クライアントは Service の名前にアクセスするだけでよく、Service が背後の Pod 群へ自動的にロードバランシングしてくれます。Pod が入れ替わっても、Service のアドレスは変わりません。
425
-
426
- 次のマニフェストは、`app: echo` ラベルを持つ Pod 群への入口となる Service です(出典:`gihyo-docker-kuberbetes/ch05/simple-service.yaml`)。
427
-
428
- ```yaml
429
- apiVersion: v1
430
- kind: Service
431
- metadata:
432
- name: echo
433
- spec:
434
- selector:
435
- app: echo
436
- ports:
437
- - name: http
438
- port: 80
439
- ```
440
-
441
- ポイントは `spec.selector` です。`app: echo` というラベルを持つ Pod(=5.8 の Deployment が生成した Pod)を、この Service の振り分け先(エンドポイント)として自動的に登録します。Deployment と Service は親子関係にあるのではなく、**同じラベルを介して間接的に結びついている** 点に注意してください。ReplicaSet がラベルで Pod を「管理」したのに対し、Service はラベルで Pod を「宛先として選択」しているわけです。
442
-
443
- ```bash
444
- # Service を作成する
445
- kubectl apply -f simple-service.yaml
446
-
447
- # Service と、選択された Pod(エンドポイント)を確認する
448
- kubectl get service
449
- kubectl describe service echo
450
- ```
451
-
452
- クラスタ内の別の Pod からは、`echo`(同一 Namespace なら名前だけ)という DNS 名で、この Service 経由で echo アプリにアクセスできます。
453
-
454
- なお、Service にはいくつかタイプがあります。上記のように `type` を省略した場合は `ClusterIP` となり、クラスタ内部からのみアクセスできます。クラスタ外部に公開したい場合は `NodePort` や `LoadBalancer` といったタイプもありますが、HTTP のルーティングをより柔軟に扱う仕組みが次の Ingress です。
455
-
456
- ---
457
-
458
- ## 5.10 Ingress
459
-
460
- `ClusterIP` の Service はクラスタ内部からしかアクセスできません。クラスタの外から、たとえばブラウザで HTTP アクセスさせたい場合に使うのが **Ingress(イングレス)** です。Ingress は、ホスト名やパスに応じて外部からのリクエストを適切な Service へ振り分ける、L7(HTTP/HTTPS)レベルのルーティングルールを定義します。
461
-
462
- ### 5.10.1 Ingress コントローラーと IngressClass
463
-
464
- ここで重要なのは、**Ingress リソースを作っただけでは何も起きない** という点です。Ingress はあくまで「こういうルールでルーティングしてほしい」という宣言であり、そのルールを実際に解釈してリクエストを捌くのは **Ingress コントローラー** という別のコンポーネントです。代表的な実装が **ingress-nginx**(NGINX ベースの Ingress コントローラー)です。
465
-
466
- `ch05/ingress-nginx.sh` は、この ingress-nginx をクラスタに導入するスクリプトです(出典:`gihyo-docker-kuberbetes/ch05/ingress-nginx.sh`)。
467
-
468
- ```bash
469
- kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.16.2/deploy/mandatory.yaml
470
- kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.16.2/deploy/provider/cloud-generic.yaml
471
- ```
472
-
473
- このように、外部で公開されているマニフェストを `kubectl apply` することで、ingress-nginx コントローラー本体(Deployment や Service など一式)がクラスタにインストールされます。なお、ここで参照しているバージョン(`nginx-0.16.2`)は書籍刊行時点のものです。現在のローカル環境では、より新しいバージョンの ingress-nginx を導入してください。Docker Desktop など環境によっては、導入手順が異なる場合があります。
474
-
475
- 複数の Ingress コントローラーを併用できるよう、現在の Kubernetes では **IngressClass** という仕組みでコントローラーを指定します。後述の応用例(`apps/echo/k8s/kustomize/ingress.yaml`)では、`spec.ingressClassName: nginx` と書くことで「この Ingress は nginx コントローラーに処理させる」と明示しています。
476
-
477
- ### 5.10.2 Ingress を通じたアクセス
478
-
479
- Ingress コントローラーを導入したら、ルーティングルールを定義する Ingress リソースを作成します。次のマニフェストは、ホスト名 `ch05.gihyo.local` への HTTP アクセスを、5.9 で作成した `echo` Service(ポート 80)へ転送する定義です(出典:`gihyo-docker-kuberbetes/ch05/simple-ingress.yaml`)。
480
-
481
- ```yaml
482
- apiVersion: extensions/v1beta1
483
- kind: Ingress
484
- metadata:
485
- name: echo
486
- spec:
487
- rules:
488
- - host: ch05.gihyo.local
489
- http:
490
- paths:
491
- - path: /
492
- backend:
493
- serviceName: echo
494
- servicePort: 80
495
- ```
496
-
497
- `spec.rules` の中で「ホスト `ch05.gihyo.local` に来た、パス `/` のリクエストを、`echo` という Service のポート 80 へ送る」と宣言しています。これにより、外部 → Ingress → Service → Pod という経路でリクエストが届きます。
498
-
499
- ```bash
500
- # Ingress を作成する
501
- kubectl apply -f simple-ingress.yaml
502
-
503
- # Ingress の状態を確認する
504
- kubectl get ingress
505
- ```
506
-
507
- 動作確認は、`ch05.gihyo.local` という名前が解決できるようにしたうえで HTTP アクセスします。ローカルでは `hosts` ファイルにホスト名を登録するか、`curl` の `--resolve` / `-H "Host: ..."` を使う方法が一般的です。
508
-
509
- ```bash
510
- # Host ヘッダーを指定して Ingress 経由でアクセスする(例)
511
- curl http://localhost -H "Host: ch05.gihyo.local"
512
- ```
513
-
514
- ### 新しい API バージョンと Kustomize での記述
515
-
516
- 上記の `simple-ingress.yaml` は `apiVersion: extensions/v1beta1` を使っており、これは書籍刊行当時の古い API です。現在の Kubernetes ではこの API は削除されており、Ingress は `networking.k8s.io/v1` で記述します。フィールド構造も少し変わっているため、新しい書き方を `echo` アプリの応用例で確認しておきましょう(出典:`apps/echo/k8s/kustomize/ingress.yaml`)。
517
-
518
- ```yaml
519
- apiVersion: networking.k8s.io/v1
520
- kind: Ingress
521
- metadata:
522
- name: echo
523
- labels:
524
- app.kubernetes.io/name: echo
525
- spec:
526
- ingressClassName: nginx
527
- rules:
528
- - host: echo.gihyo.local
529
- http:
530
- paths:
531
- - pathType: Prefix
532
- path: /
533
- backend:
534
- service:
535
- name: echo
536
- port:
537
- number: 80
538
- ```
539
-
540
- 旧 API との違いは次のとおりです。
541
-
542
- - `spec.ingressClassName: nginx` で、5.10.1 で触れた IngressClass を明示しています。
543
- - `paths` の各エントリに `pathType: Prefix`(パスの前方一致)が必須になりました。
544
- - `backend` の指定が `serviceName` / `servicePort` から、`service.name` / `service.port.number` という入れ子の構造に変わりました。
545
-
546
- この `echo` の応用例では、Deployment・Service・Ingress を `kustomization.yaml` でまとめて管理しています(出典:`apps/echo/k8s/kustomize/`)。`kubectl apply -k` で Kustomize ディレクトリを指定すると、3 つのマニフェストを一括適用できます。
547
-
548
- ```bash
549
- # Kustomize ディレクトリを一括適用する
550
- kubectl apply -k apps/echo/k8s/kustomize/
551
- ```
552
-
553
- この応用例では、ラベルに `app.kubernetes.io/name: echo` という Kubernetes 推奨の命名規約(well-known labels)を採用し、`kustomization.yaml` の `labels` 設定で全リソースへ一括付与しています。本章で学んだ「ラベルとセレクタによる紐づけ」の考え方は、API バージョンが新しくなっても変わらない普遍的な原則です。
554
-
555
- ---
556
-
557
- ## まとめ
558
-
559
- 本章では、Kubernetes の基本概念と中核となる 5 つのリソースを、サンプルマニフェストを通じて学びました。要点を整理します。
560
-
561
- - **Kubernetes** は、宣言的な「望ましい状態」を維持し続けるコンテナオーケストレーションシステムである。利用者は YAML マニフェストでゴールを宣言し、Kubernetes がリコンサイルループで現実をそれに収束させる。
562
- - **クラスタ** はコントロールプレーンとワーカー Node から成り、**Namespace** でクラスタ内を論理分割できる。ローカル学習には Docker Desktop / Rancher Desktop / kind が使える(詳細は付録 A)。
563
- - **Pod** はコンテナの最小デプロイ単位で、Pod 内のコンテナはネットワークを共有し `localhost` で通信できる。
564
- - **ReplicaSet** はラベルセレクタで Pod を管理し、指定数のレプリカを維持する。
565
- - **Deployment** は ReplicaSet を管理し、ローリングアップデートとロールバックを実現する。実務ではこれを使うのが基本である。
566
- - **Service** はラベルで選んだ Pod 群に安定したアドレスを与え、ロードバランシングする。
567
- - **Ingress** は外部 HTTP アクセスを Service に振り分ける。実際にルーティングを行うのは **Ingress コントローラー(ingress-nginx)** で、**IngressClass** でどのコントローラーに処理させるかを指定する。
568
-
569
- これらをつなぐ一本の糸が **ラベルとセレクタ** です。`Deployment → ReplicaSet → Pod` は管理関係で、`Service → Pod`・`Ingress → Service` は選択・転送関係でしたが、いずれもラベルの一致によって成立していました。`kubectl apply` でマニフェストを宣言し、`kubectl get` / `describe` / `logs` で状態を観察する――この往復が Kubernetes 運用の基本動作です。
570
-
571
- 次章では、本章で学んだリソースを組み合わせて、実際のアプリケーションを Kubernetes 上に構築・デプロイする実践へ進みます。
572
-
573
- ---
574
-
575
- - 前の章:[第 4 章 複数コンテナ構成でのアプリケーション構築](04-multi-container-application.md)
576
- - 次の章:[第 6 章 Kubernetes のデプロイ・クラスタ構築](06-kubernetes-deploy-cluster.md)
1
+ ---
2
+ type: Article
3
+ title: "第 5 章 Kubernetes 入門"
4
+ description: "前章まででは、Docker による単一ホスト上のコンテナ実行と、Docker Compose や Swarm による複数コンテナの管理を学びました。"
5
+ tags: [article, getting-start-docker-kubernetes]
6
+ status: stable
7
+ generated: { by: human:kakimomokuri, at: 2026-06-26T00:29:42Z }
8
+ ---
9
+
10
+ # 第 5 章 Kubernetes 入門
11
+
12
+ ![Kubernetes の基本概念を説明する 4 コマ漫画](images/chapter-05-comic.png)
13
+
14
+ *Pod、Node、Service、制御プレーン、宣言的な望ましい状態が Kubernetes の基本になります。*
15
+
16
+ ## はじめに
17
+
18
+ 前章まででは、Docker による単一ホスト上のコンテナ実行と、Docker Compose や Swarm による複数コンテナの管理を学びました。しかし実運用のシステムでは、複数のサーバー(ホスト)にまたがってコンテナを配置し、障害が起きても自動で復旧させ、トラフィックの増減に応じてコンテナ数を増減させる、といった「オーケストレーション」が求められます。
19
+
20
+ この章では、コンテナオーケストレーションのデファクトスタンダードである **Kubernetes** を学びます。Kubernetes は Google が社内で培ったコンテナ運用のノウハウをもとに開発され、現在は CNCF(Cloud Native Computing Foundation)が中立的に運営する OSS です。「k8s(ケーエイツ)」と省略表記されることもあります。
21
+
22
+ 本章のゴールは、Kubernetes を構成する基本的なリソース(Pod、ReplicaSet、Deployment、Service、Ingress)の役割と関係を理解し、実際に YAML マニフェストを書いて `kubectl` で適用できるようになることです。説明には、書籍『Docker/Kubernetes 実践コンテナ開発入門(第 2 版)』のサンプルリポジトリ `gihyo-docker-kuberbetes`(ディレクトリ `ch05/`)と、応用例として `echo` アプリの Kustomize 定義(`apps/echo/k8s/kustomize/`)を引用します。
23
+
24
+ 学ぶ順序は次のとおりです。
25
+
26
+ 1. Kubernetes とは何か、なぜ必要か(5.1)
27
+ 2. ローカル環境で Kubernetes を動かす準備(5.2)
28
+ 3. Kubernetes の基本概念とクラスタ構成(5.3〜5.5)
29
+ 4. アプリケーションを動かすリソース(5.6 Pod 〜 5.8 Deployment)
30
+ 5. ネットワークを担うリソース(5.9 Service、5.10 Ingress)
31
+
32
+ それぞれのリソースは独立した部品ではなく、上位のリソースが下位のリソースを生成・管理するという階層構造になっています。この「関係」を意識しながら読み進めてください。
33
+
34
+ ---
35
+
36
+ ## 5.1 Kubernetes とは
37
+
38
+ Kubernetes は、コンテナ化されたアプリケーションのデプロイ、スケーリング、運用を自動化するためのオーケストレーションシステムです。「オーケストレーション」とは、指揮者(オーケストレーター)が多数の奏者(コンテナ)をまとめて 1 つの楽曲(システム)を演奏させるイメージから来ています。
39
+
40
+ Docker 単体や Docker Compose では、基本的に 1 台のホスト上でコンテナを動かします。しかし、本番システムでは次のような要求が生じます。
41
+
42
+ - 複数のホスト(サーバー)にコンテナを分散して配置したい
43
+ - あるコンテナが落ちても、自動的に再起動・再配置してほしい
44
+ - 負荷に応じてコンテナの数を増やしたり減らしたりしたい(スケーリング)
45
+ - 新しいバージョンを無停止でリリースしたい(ローリングアップデート)
46
+ - コンテナ群への通信を、安定したエンドポイントに集約したい(サービスディスカバリ・ロードバランシング)
47
+
48
+ Kubernetes は、これらをまとめて引き受けてくれます。最大の特徴は **宣言的(declarative)** な運用モデルです。利用者は「最終的にこうあってほしい」という望ましい状態(desired state)を YAML マニフェストで宣言します。すると Kubernetes は現在の状態を絶えず監視し、宣言された状態に一致するよう自動的に調整し続けます。この「あるべき状態へ収束させ続ける」仕組みを **リコンサイル(reconciliation)ループ** と呼びます。
49
+
50
+ たとえば「echo というアプリを 3 つ動かす」と宣言しておけば、そのうち 1 つが障害で停止しても、Kubernetes が不足を検知して新しいコンテナを起動し、常に 3 つの状態を保とうとします。命令的(imperative)に「コンテナを起動せよ」「再起動せよ」と都度指示するのではなく、ゴールだけを示す点が宣言的モデルの本質です。
51
+
52
+ ---
53
+
54
+ ## 5.2 ローカル環境で Kubernetes を実行する
55
+
56
+ Kubernetes を学ぶには、手元で動かせる環境があると便利です。本番のような複数ノードのクラスタを用意しなくても、ローカル PC 上に単一ノードの Kubernetes クラスタを構築できるツールがいくつかあります。
57
+
58
+ 代表的な選択肢は次のとおりです。
59
+
60
+ - **Docker Desktop**:設定画面で「Enable Kubernetes」にチェックを入れるだけで、ローカルに単一ノードの Kubernetes クラスタが起動します。Docker をすでに使っている場合に最も手軽です。
61
+ - **Rancher Desktop**:オープンソースのデスクトップアプリで、Kubernetes(k3s ベース)とコンテナランタイムを同梱しています。ライセンス上の制約を避けたい場合の選択肢になります。
62
+ - **kind(Kubernetes IN Docker)**:Docker コンテナ自体を Kubernetes のノードとして使う軽量ツールです。CI 環境や、複数ノード構成を手軽に試したいときに向いています。
63
+
64
+ これらのインストール手順や OS ごとの細かな設定は環境差が大きいため、本書では **付録 A** に詳細を委ねます。ここでは「いずれかのローカル Kubernetes が起動済みで、`kubectl` がそのクラスタに接続できる状態」になっていることを前提に進めます。
65
+
66
+ ### kubectl の基本操作
67
+
68
+ `kubectl`(キューブコントロール、または「キューブシーティーエル」)は、Kubernetes クラスタを操作するためのコマンドラインツールです。本章で繰り返し使う基本操作を先に押さえておきましょう。
69
+
70
+ まず、接続先のクラスタが正しいか確認します。
71
+
72
+ ```bash
73
+ # 現在の接続先(コンテキスト)を確認する
74
+ kubectl config current-context
75
+
76
+ # クラスタを構成するノードの一覧を表示する
77
+ kubectl get nodes
78
+ ```
79
+
80
+ リソースの作成・取得・確認・削除は、次の 5 つを覚えておけば本章の操作はほぼ網羅できます。
81
+
82
+ ```bash
83
+ # マニフェスト(YAML)を適用してリソースを作成・更新する
84
+ kubectl apply -f simple-pod.yaml
85
+
86
+ # リソースの一覧を取得する(pod / replicaset / deployment / service / ingress など)
87
+ kubectl get pod
88
+
89
+ # リソースの詳細(イベントや状態の遷移を含む)を確認する
90
+ kubectl describe pod simple-echo
91
+
92
+ # コンテナのログを表示する(複数コンテナの Pod では -c でコンテナ名を指定)
93
+ kubectl logs simple-echo -c echo
94
+
95
+ # マニフェストで作成したリソースを削除する
96
+ kubectl delete -f simple-pod.yaml
97
+ ```
98
+
99
+ `apply` は宣言的な操作で、同じマニフェストを何度適用しても結果が一定になる(冪等)点が重要です。マニフェストを書き換えて再度 `apply` すれば、差分だけが反映されます。トラブル時はまず `kubectl describe`(リソースに紐づくイベントが見られる)と `kubectl logs`(アプリのログが見られる)を確認するのが定石です。
100
+
101
+ ---
102
+
103
+ ## 5.3 Kubernetes の概念
104
+
105
+ Kubernetes には多くのリソース(オブジェクト)が登場しますが、本章で扱う中核は次の 5 つです。これらは互いに関係し合っています。
106
+
107
+ | リソース | 役割 |
108
+ | :--- | :--- |
109
+ | Pod | コンテナの最小デプロイ単位。1 つ以上のコンテナをまとめる |
110
+ | ReplicaSet | 指定した数の Pod を維持する(レプリカ管理) |
111
+ | Deployment | ReplicaSet を管理し、ローリングアップデートやロールバックを担う |
112
+ | Service | Pod 群への安定したアクセス先(仮想 IP・名前)を提供する |
113
+ | Ingress | クラスタ外部からの HTTP(S) アクセスを Service に振り分ける |
114
+
115
+ これらの関係を図にすると次のようになります。上位のリソースが下位のリソースを生成・管理し、ラベルセレクタによって紐づけられています。本章を通じて何度も立ち戻る、最も重要な図です。
116
+
117
+ ```plantuml
118
+ @startuml
119
+ title Kubernetes 主要リソースの関係
120
+
121
+ actor "外部ユーザー" as user
122
+
123
+ rectangle "Ingress\n(echo.gihyo.local → echo:80)" as ingress
124
+ rectangle "Service\n(selector: app=echo)" as service
125
+
126
+ package "Deployment (echo)" {
127
+ rectangle "ReplicaSet\n(replicas: 4)" as rs
128
+ rectangle "Pod\n(labels: app=echo)" as pod1
129
+ rectangle "Pod\n(labels: app=echo)" as pod2
130
+ rectangle "Pod\n(labels: app=echo)" as pod3
131
+ rectangle "Pod\n(labels: app=echo)" as pod4
132
+ }
133
+
134
+ user --> ingress : HTTP
135
+ ingress --> service : ルール一致で転送
136
+ service ..> pod1 : labelで選択
137
+ service ..> pod2
138
+ service ..> pod3
139
+ service ..> pod4
140
+ rs --> pod1 : 生成・維持
141
+ rs --> pod2
142
+ rs --> pod3
143
+ rs --> pod4
144
+
145
+ note bottom of rs
146
+ Deployment が ReplicaSet を、
147
+ ReplicaSet が Pod を管理する
148
+ end note
149
+ @enduml
150
+ ```
151
+
152
+ この章ではこの図を下から上へ(Pod → ReplicaSet → Deployment → Service → Ingress の順に)組み立てていきます。
153
+
154
+ ---
155
+
156
+ ## 5.4 Kubernetes クラスタと Node
157
+
158
+ Kubernetes の実行環境全体を **クラスタ(Cluster)** と呼びます。クラスタは、大きく分けて 2 種類のマシン(Node)から構成されます。
159
+
160
+ - **コントロールプレーン(Control Plane)**:クラスタ全体を管理する頭脳です。API サーバー(`kube-apiserver`、`kubectl` の接続先)、状態を保存するデータストア(`etcd`)、リソースを監視し調整するコントローラ(`kube-controller-manager`)、Pod をどの Node に配置するか決めるスケジューラ(`kube-scheduler`)などで構成されます。
161
+ - **ワーカー Node(Node)**:実際にコンテナ(Pod)が動くマシンです。各 Node では、コントロールプレーンと通信してコンテナを起動・監視する `kubelet` と、ネットワークを担う `kube-proxy` が動作しています。
162
+
163
+ 利用者は `kubectl` を通じてコントロールプレーンの API サーバーに「望ましい状態」を伝えます。すると、コントローラとスケジューラが協調して、適切な Node 上に Pod を配置します。どの Node に配置されるかは Kubernetes が自動的に判断するため、利用者が個々のサーバーを意識する必要はありません。
164
+
165
+ ローカル環境(Docker Desktop など)では、コントロールプレーンとワーカー Node が同じ 1 台に同居した単一ノード構成になります。`kubectl get nodes` を実行すると、その 1 つの Node が表示されます。
166
+
167
+ ```bash
168
+ # Node の一覧を確認する(ローカル環境では 1 つ表示される例)
169
+ kubectl get nodes
170
+ ```
171
+
172
+ ---
173
+
174
+ ## 5.5 Namespace
175
+
176
+ **Namespace(名前空間)** は、1 つのクラスタの中を論理的に分割する仕組みです。同じクラスタを複数のチームや用途(開発・検証など)で共有する場合に、リソースをグループ分けして名前の衝突を避けたり、アクセス権限やリソース制限を分けたりできます。
177
+
178
+ クラスタには最初からいくつかの Namespace が用意されています。
179
+
180
+ ```bash
181
+ # Namespace の一覧を表示する
182
+ kubectl get namespace
183
+ ```
184
+
185
+ 代表的なものは次のとおりです。
186
+
187
+ - `default`:明示的に Namespace を指定しなかったときに使われる既定の名前空間。本章のサンプルもここに作成されます。
188
+ - `kube-system`:Kubernetes 自身のコンポーネント(ダッシュボードや DNS など)が動く名前空間。
189
+ - `kube-public`:すべてのユーザーが読み取れる名前空間。
190
+
191
+ `kubectl` のコマンドに `--namespace`(短縮形 `-n`)を付けると、対象の Namespace を切り替えられます。たとえば、`ch05/install-dashboard.sh` では Kubernetes Dashboard を導入したうえで、`kube-system` Namespace の Pod を確認しています(出典:`gihyo-docker-kuberbetes/ch05/install-dashboard.sh`)。
192
+
193
+ ```bash
194
+ # kube-system 名前空間の Pod を、ラベルで絞り込んで確認する
195
+ kubectl get pod --namespace=kube-system -l k8s-app=kubernetes-dashboard
196
+ ```
197
+
198
+ 本章のサンプルでは Namespace を明示しないため、すべて `default` に作成されます。`kubectl get pod` のように `-n` を省略した場合は `default` が対象になる、と覚えておけば十分です。
199
+
200
+ ---
201
+
202
+ ## 5.6 Pod
203
+
204
+ **Pod(ポッド)** は、Kubernetes でアプリケーションを動かす最小のデプロイ単位です。1 つの Pod は 1 つ以上のコンテナをまとめたもので、同じ Pod 内のコンテナは同じネットワーク(同じ IP アドレス)とストレージを共有します。そのため、Pod 内のコンテナどうしは `localhost` で通信できます。
205
+
206
+ 「なぜコンテナではなく Pod が単位なのか」というと、密接に連携する複数のコンテナ(たとえば、リバースプロキシとアプリ本体)を 1 セットとして扱いたいケースがあるからです。本章のサンプルは、まさにその構成です。
207
+
208
+ 次のマニフェストは、`nginx`(リバースプロキシ)と `echo`(アプリ本体)の 2 つのコンテナを 1 つの Pod にまとめたものです(出典:`gihyo-docker-kuberbetes/ch05/simple-pod.yaml`)。
209
+
210
+ ```yaml
211
+ apiVersion: v1
212
+ kind: Pod
213
+ metadata:
214
+ name: simple-echo
215
+ spec:
216
+ containers:
217
+ - name: nginx
218
+ image: gihyodocker/nginx:latest
219
+ env:
220
+ - name: BACKEND_HOST
221
+ value: localhost:8080
222
+ ports:
223
+ - containerPort: 80
224
+ - name: echo
225
+ image: gihyodocker/echo:latest
226
+ ports:
227
+ - containerPort: 8080
228
+ ```
229
+
230
+ マニフェストの構造を読み解きましょう。
231
+
232
+ - `apiVersion` / `kind`:このリソースの種別を表します。Pod は `v1`(コア API グループ)の `Pod` です。
233
+ - `metadata.name`:リソースの名前です。ここでは `simple-echo`。
234
+ - `spec.containers`:この Pod が持つコンテナの定義リストです。
235
+ - `nginx` コンテナは環境変数 `BACKEND_HOST` に `localhost:8080` を指定しています。同じ Pod 内の `echo` コンテナがポート 8080 で待ち受けているため、`localhost` 経由でアクセスできるわけです。これが「Pod 内のコンテナはネットワークを共有する」ことの具体例です。
236
+
237
+ このマニフェストを適用し、状態を確認してみます。
238
+
239
+ ```bash
240
+ # Pod を作成する
241
+ kubectl apply -f simple-pod.yaml
242
+
243
+ # Pod の状態を確認する(READY 列が 2/2 になれば 2 コンテナとも起動済み)
244
+ kubectl get pod
245
+
246
+ # 詳細やイベントを確認する
247
+ kubectl describe pod simple-echo
248
+ ```
249
+
250
+ `kubectl get pod` の出力例(値は環境により異なります)は次のようなイメージです。
251
+
252
+ ```text
253
+ NAME READY STATUS RESTARTS AGE
254
+ simple-echo 2/2 Running 0 30s
255
+ ```
256
+
257
+ ただし、Pod を単体で作成する運用は実務ではほとんど行いません。Pod は障害で停止しても自動では復旧しないからです。Pod の数を維持し、自動復旧させるために登場するのが、次の ReplicaSet です。
258
+
259
+ ---
260
+
261
+ ## 5.7 ReplicaSet
262
+
263
+ **ReplicaSet(レプリカセット)** は、指定した数の同一 Pod(レプリカ)が常に動いている状態を維持するリソースです。Pod が落ちれば新しい Pod を起動し、多すぎれば余分な Pod を停止して、宣言した数(`replicas`)に収束させ続けます。
264
+
265
+ 次のマニフェストは、5.6 の Pod と同じ 2 コンテナ構成を、3 つのレプリカとして維持する ReplicaSet です(出典:`gihyo-docker-kuberbetes/ch05/simple-replicaset.yaml`)。
266
+
267
+ ```yaml
268
+ apiVersion: apps/v1
269
+ kind: ReplicaSet
270
+ metadata:
271
+ name: echo
272
+ labels:
273
+ app: echo
274
+ spec:
275
+ replicas: 3
276
+ selector:
277
+ matchLabels:
278
+ app: echo
279
+ template:
280
+ metadata:
281
+ labels:
282
+ app: echo
283
+ spec:
284
+ containers:
285
+ - name: nginx
286
+ image: gihyodocker/nginx:latest
287
+ env:
288
+ - name: BACKEND_HOST
289
+ value: localhost:8080
290
+ ports:
291
+ - containerPort: 80
292
+ - name: echo
293
+ image: gihyodocker/echo:latest
294
+ ports:
295
+ - containerPort: 8080
296
+ ```
297
+
298
+ Pod のマニフェストとの差分が、ReplicaSet を理解する鍵です。
299
+
300
+ - `kind` が `Pod` から `ReplicaSet` に変わり、`apiVersion` も `apps/v1` になっています。
301
+ - `spec.replicas: 3`:維持したい Pod の数を宣言します。
302
+ - `spec.template`:生成する Pod の「ひな型」です。よく見ると、5.6 の Pod の `spec.containers` がそのままここに入れ子になっています。ReplicaSet はこのテンプレートをもとに Pod を量産します。
303
+ - `spec.selector.matchLabels` と `spec.template.metadata.labels`:ここが最重要です。ReplicaSet は「`app: echo` というラベルを持つ Pod」を自分の管理対象として認識します(`selector`)。一方、生成する Pod には同じ `app: echo` というラベルを付けます(`template` の `labels`)。この **ラベルとセレクタが一致** することで、ReplicaSet は自分が作った Pod を管理できるのです。
304
+
305
+ ```bash
306
+ # ReplicaSet を作成する
307
+ kubectl apply -f simple-replicaset.yaml
308
+
309
+ # ReplicaSet と、それが生成した Pod を確認する
310
+ kubectl get replicaset
311
+ kubectl get pod
312
+ ```
313
+
314
+ ここで、3 つの Pod のうち 1 つを手動で削除してみると、ReplicaSet がすぐに不足を検知して新しい Pod を起動し、再び 3 つに戻すことが確認できます。これが宣言的モデルとリコンサイルループの威力です。
315
+
316
+ ```bash
317
+ # Pod を 1 つ削除しても、ReplicaSet が自動で補充して 3 つに戻す
318
+ kubectl delete pod <削除したい Pod 名>
319
+ kubectl get pod
320
+ ```
321
+
322
+ ### ラベルによる管理対象の使い分け
323
+
324
+ ラベルは単なる名札ではなく、リソースを束ねる「セレクタの条件」として機能します。`ch05/simple-replicaset-with-label.yaml` は、`app: echo` に加えて `release` ラベル(`spring` / `summer`)を使い、同じアプリの中でリリース系統を分けて管理する例です(出典:`gihyo-docker-kuberbetes/ch05/simple-replicaset-with-label.yaml`)。
325
+
326
+ ```yaml
327
+ apiVersion: apps/v1
328
+ kind: ReplicaSet
329
+ metadata:
330
+ name: echo-spring
331
+ labels:
332
+ app: echo
333
+ release: spring
334
+ spec:
335
+ replicas: 1
336
+ selector:
337
+ matchLabels:
338
+ app: echo
339
+ release: spring
340
+ template:
341
+ metadata:
342
+ labels:
343
+ app: echo
344
+ release: spring
345
+ spec:
346
+ containers:
347
+ - name: nginx
348
+ image: gihyodocker/nginx:latest
349
+ env:
350
+ - name: BACKEND_HOST
351
+ value: localhost:8080
352
+ ports:
353
+ - containerPort: 80
354
+ - name: echo
355
+ image: gihyodocker/echo:latest
356
+ ports:
357
+ - containerPort: 8080
358
+ ```
359
+
360
+ このファイルには `echo-spring`(replicas: 1)と `echo-summer`(replicas: 2)の 2 つの ReplicaSet が `---` で区切って定義されています。`echo-spring` のセレクタは `app: echo` かつ `release: spring` の両方を満たす Pod だけを管理対象にするため、`echo-summer` の Pod とは混ざりません。ラベルの組み合わせで管理対象を精密に絞り込める、という点を押さえておきましょう。
361
+
362
+ ただし、ReplicaSet を直接運用することも実務では稀です。アプリのバージョンアップ(イメージの差し替え)を安全に行うには、さらに上位の Deployment を使います。
363
+
364
+ ---
365
+
366
+ ## 5.8 Deployment
367
+
368
+ **Deployment(デプロイメント)** は、ReplicaSet を管理する上位リソースです。Deployment を使うと、アプリケーションの **ローリングアップデート**(無停止での段階的なバージョン更新)と **ロールバック**(問題があったときに前のバージョンへ戻す操作)が可能になります。実務でアプリを動かす際は、この Deployment が事実上の標準です。
369
+
370
+ 次のマニフェストは、5.7 の ReplicaSet とほぼ同じ内容を Deployment として定義し、レプリカ数を 4 にしたものです(出典:`gihyo-docker-kuberbetes/ch05/simple-deployment.yaml`)。
371
+
372
+ ```yaml
373
+ apiVersion: apps/v1
374
+ kind: Deployment
375
+ metadata:
376
+ name: echo
377
+ labels:
378
+ app: echo
379
+ spec:
380
+ replicas: 4
381
+ selector:
382
+ matchLabels:
383
+ app: echo
384
+ template:
385
+ metadata:
386
+ labels:
387
+ app: echo
388
+ spec:
389
+ containers:
390
+ - name: nginx
391
+ image: gihyodocker/nginx:latest
392
+ env:
393
+ - name: BACKEND_HOST
394
+ value: localhost:8080
395
+ ports:
396
+ - containerPort: 80
397
+ - name: echo
398
+ image: gihyodocker/echo:latest
399
+ ports:
400
+ - containerPort: 8080
401
+ ```
402
+
403
+ ReplicaSet のマニフェストとの差分は、ほぼ `kind` が `Deployment` になっただけです。`spec.replicas`・`spec.selector`・`spec.template` の構造はそのまま引き継がれています。これは偶然ではなく、**Deployment が内部で ReplicaSet を生成し、その ReplicaSet が Pod を生成する** という三段の管理構造になっているためです。
404
+
405
+ ```bash
406
+ # Deployment を作成する
407
+ kubectl apply -f simple-deployment.yaml
408
+
409
+ # Deployment → ReplicaSet → Pod が連鎖的に生成されることを確認する
410
+ kubectl get deployment
411
+ kubectl get replicaset
412
+ kubectl get pod
413
+ ```
414
+
415
+ Deployment の真価は、テンプレート(とくにコンテナイメージのタグ)を書き換えて再度 `kubectl apply` したときに発揮されます。Deployment は新しいテンプレートに対応する **新しい ReplicaSet** を作り、新 ReplicaSet の Pod を少しずつ増やしながら旧 ReplicaSet の Pod を減らしていきます。これにより、サービスを止めずにバージョンを入れ替えられます。問題が起きた場合は、`kubectl rollout undo` で前の ReplicaSet に戻せます。
416
+
417
+ ```bash
418
+ # ロールアウト(更新)の進行状況を確認する
419
+ kubectl rollout status deployment echo
420
+
421
+ # 直前のバージョンに戻す(ロールバック)
422
+ kubectl rollout undo deployment echo
423
+ ```
424
+
425
+ 「Pod を直接作らず、ReplicaSet も直接作らず、Deployment を宣言する」――これが Kubernetes でアプリを動かす際の基本姿勢です。
426
+
427
+ ---
428
+
429
+ ## 5.9 Service
430
+
431
+ ここまでで、Deployment によって複数の Pod を安定して動かせるようになりました。しかし、Pod には別の課題があります。Pod は障害復旧やスケーリングのたびに作り直され、その都度 IP アドレスが変わります。クライアントが個々の Pod の IP を直接指定していては、通信先が安定しません。
432
+
433
+ この問題を解決するのが **Service(サービス)** です。Service は、ラベルセレクタで選んだ Pod 群に対して、**安定した仮想 IP(ClusterIP)と DNS 名** を提供します。クライアントは Service の名前にアクセスするだけでよく、Service が背後の Pod 群へ自動的にロードバランシングしてくれます。Pod が入れ替わっても、Service のアドレスは変わりません。
434
+
435
+ 次のマニフェストは、`app: echo` ラベルを持つ Pod 群への入口となる Service です(出典:`gihyo-docker-kuberbetes/ch05/simple-service.yaml`)。
436
+
437
+ ```yaml
438
+ apiVersion: v1
439
+ kind: Service
440
+ metadata:
441
+ name: echo
442
+ spec:
443
+ selector:
444
+ app: echo
445
+ ports:
446
+ - name: http
447
+ port: 80
448
+ ```
449
+
450
+ ポイントは `spec.selector` です。`app: echo` というラベルを持つ Pod(=5.8 の Deployment が生成した Pod)を、この Service の振り分け先(エンドポイント)として自動的に登録します。Deployment と Service は親子関係にあるのではなく、**同じラベルを介して間接的に結びついている** 点に注意してください。ReplicaSet がラベルで Pod を「管理」したのに対し、Service はラベルで Pod を「宛先として選択」しているわけです。
451
+
452
+ ```bash
453
+ # Service を作成する
454
+ kubectl apply -f simple-service.yaml
455
+
456
+ # Service と、選択された Pod(エンドポイント)を確認する
457
+ kubectl get service
458
+ kubectl describe service echo
459
+ ```
460
+
461
+ クラスタ内の別の Pod からは、`echo`(同一 Namespace なら名前だけ)という DNS 名で、この Service 経由で echo アプリにアクセスできます。
462
+
463
+ なお、Service にはいくつかタイプがあります。上記のように `type` を省略した場合は `ClusterIP` となり、クラスタ内部からのみアクセスできます。クラスタ外部に公開したい場合は `NodePort` や `LoadBalancer` といったタイプもありますが、HTTP のルーティングをより柔軟に扱う仕組みが次の Ingress です。
464
+
465
+ ---
466
+
467
+ ## 5.10 Ingress
468
+
469
+ `ClusterIP` の Service はクラスタ内部からしかアクセスできません。クラスタの外から、たとえばブラウザで HTTP アクセスさせたい場合に使うのが **Ingress(イングレス)** です。Ingress は、ホスト名やパスに応じて外部からのリクエストを適切な Service へ振り分ける、L7(HTTP/HTTPS)レベルのルーティングルールを定義します。
470
+
471
+ ### 5.10.1 Ingress コントローラーと IngressClass
472
+
473
+ ここで重要なのは、**Ingress リソースを作っただけでは何も起きない** という点です。Ingress はあくまで「こういうルールでルーティングしてほしい」という宣言であり、そのルールを実際に解釈してリクエストを捌くのは **Ingress コントローラー** という別のコンポーネントです。代表的な実装が **ingress-nginx**(NGINX ベースの Ingress コントローラー)です。
474
+
475
+ `ch05/ingress-nginx.sh` は、この ingress-nginx をクラスタに導入するスクリプトです(出典:`gihyo-docker-kuberbetes/ch05/ingress-nginx.sh`)。
476
+
477
+ ```bash
478
+ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.16.2/deploy/mandatory.yaml
479
+ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.16.2/deploy/provider/cloud-generic.yaml
480
+ ```
481
+
482
+ このように、外部で公開されているマニフェストを `kubectl apply` することで、ingress-nginx コントローラー本体(Deployment や Service など一式)がクラスタにインストールされます。なお、ここで参照しているバージョン(`nginx-0.16.2`)は書籍刊行時点のものです。現在のローカル環境では、より新しいバージョンの ingress-nginx を導入してください。Docker Desktop など環境によっては、導入手順が異なる場合があります。
483
+
484
+ 複数の Ingress コントローラーを併用できるよう、現在の Kubernetes では **IngressClass** という仕組みでコントローラーを指定します。後述の応用例(`apps/echo/k8s/kustomize/ingress.yaml`)では、`spec.ingressClassName: nginx` と書くことで「この Ingress は nginx コントローラーに処理させる」と明示しています。
485
+
486
+ ### 5.10.2 Ingress を通じたアクセス
487
+
488
+ Ingress コントローラーを導入したら、ルーティングルールを定義する Ingress リソースを作成します。次のマニフェストは、ホスト名 `ch05.gihyo.local` への HTTP アクセスを、5.9 で作成した `echo` Service(ポート 80)へ転送する定義です(出典:`gihyo-docker-kuberbetes/ch05/simple-ingress.yaml`)。
489
+
490
+ ```yaml
491
+ apiVersion: extensions/v1beta1
492
+ kind: Ingress
493
+ metadata:
494
+ name: echo
495
+ spec:
496
+ rules:
497
+ - host: ch05.gihyo.local
498
+ http:
499
+ paths:
500
+ - path: /
501
+ backend:
502
+ serviceName: echo
503
+ servicePort: 80
504
+ ```
505
+
506
+ `spec.rules` の中で「ホスト `ch05.gihyo.local` に来た、パス `/` のリクエストを、`echo` という Service のポート 80 へ送る」と宣言しています。これにより、外部 → Ingress → Service → Pod という経路でリクエストが届きます。
507
+
508
+ ```bash
509
+ # Ingress を作成する
510
+ kubectl apply -f simple-ingress.yaml
511
+
512
+ # Ingress の状態を確認する
513
+ kubectl get ingress
514
+ ```
515
+
516
+ 動作確認は、`ch05.gihyo.local` という名前が解決できるようにしたうえで HTTP アクセスします。ローカルでは `hosts` ファイルにホスト名を登録するか、`curl` の `--resolve` / `-H "Host: ..."` を使う方法が一般的です。
517
+
518
+ ```bash
519
+ # Host ヘッダーを指定して Ingress 経由でアクセスする(例)
520
+ curl http://localhost -H "Host: ch05.gihyo.local"
521
+ ```
522
+
523
+ ### 新しい API バージョンと Kustomize での記述
524
+
525
+ 上記の `simple-ingress.yaml` は `apiVersion: extensions/v1beta1` を使っており、これは書籍刊行当時の古い API です。現在の Kubernetes ではこの API は削除されており、Ingress は `networking.k8s.io/v1` で記述します。フィールド構造も少し変わっているため、新しい書き方を `echo` アプリの応用例で確認しておきましょう(出典:`apps/echo/k8s/kustomize/ingress.yaml`)。
526
+
527
+ ```yaml
528
+ apiVersion: networking.k8s.io/v1
529
+ kind: Ingress
530
+ metadata:
531
+ name: echo
532
+ labels:
533
+ app.kubernetes.io/name: echo
534
+ spec:
535
+ ingressClassName: nginx
536
+ rules:
537
+ - host: echo.gihyo.local
538
+ http:
539
+ paths:
540
+ - pathType: Prefix
541
+ path: /
542
+ backend:
543
+ service:
544
+ name: echo
545
+ port:
546
+ number: 80
547
+ ```
548
+
549
+ 旧 API との違いは次のとおりです。
550
+
551
+ - `spec.ingressClassName: nginx` で、5.10.1 で触れた IngressClass を明示しています。
552
+ - `paths` の各エントリに `pathType: Prefix`(パスの前方一致)が必須になりました。
553
+ - `backend` の指定が `serviceName` / `servicePort` から、`service.name` / `service.port.number` という入れ子の構造に変わりました。
554
+
555
+ この `echo` の応用例では、Deployment・Service・Ingress を `kustomization.yaml` でまとめて管理しています(出典:`apps/echo/k8s/kustomize/`)。`kubectl apply -k` で Kustomize ディレクトリを指定すると、3 つのマニフェストを一括適用できます。
556
+
557
+ ```bash
558
+ # Kustomize ディレクトリを一括適用する
559
+ kubectl apply -k apps/echo/k8s/kustomize/
560
+ ```
561
+
562
+ この応用例では、ラベルに `app.kubernetes.io/name: echo` という Kubernetes 推奨の命名規約(well-known labels)を採用し、`kustomization.yaml` の `labels` 設定で全リソースへ一括付与しています。本章で学んだ「ラベルとセレクタによる紐づけ」の考え方は、API バージョンが新しくなっても変わらない普遍的な原則です。
563
+
564
+ ---
565
+
566
+ ## まとめ
567
+
568
+ 本章では、Kubernetes の基本概念と中核となる 5 つのリソースを、サンプルマニフェストを通じて学びました。要点を整理します。
569
+
570
+ - **Kubernetes** は、宣言的な「望ましい状態」を維持し続けるコンテナオーケストレーションシステムである。利用者は YAML マニフェストでゴールを宣言し、Kubernetes がリコンサイルループで現実をそれに収束させる。
571
+ - **クラスタ** はコントロールプレーンとワーカー Node から成り、**Namespace** でクラスタ内を論理分割できる。ローカル学習には Docker Desktop / Rancher Desktop / kind が使える(詳細は付録 A)。
572
+ - **Pod** はコンテナの最小デプロイ単位で、Pod 内のコンテナはネットワークを共有し `localhost` で通信できる。
573
+ - **ReplicaSet** はラベルセレクタで Pod を管理し、指定数のレプリカを維持する。
574
+ - **Deployment** は ReplicaSet を管理し、ローリングアップデートとロールバックを実現する。実務ではこれを使うのが基本である。
575
+ - **Service** はラベルで選んだ Pod 群に安定したアドレスを与え、ロードバランシングする。
576
+ - **Ingress** は外部 HTTP アクセスを Service に振り分ける。実際にルーティングを行うのは **Ingress コントローラー(ingress-nginx)** で、**IngressClass** でどのコントローラーに処理させるかを指定する。
577
+
578
+ これらをつなぐ一本の糸が **ラベルとセレクタ** です。`Deployment → ReplicaSet → Pod` は管理関係で、`Service → Pod`・`Ingress → Service` は選択・転送関係でしたが、いずれもラベルの一致によって成立していました。`kubectl apply` でマニフェストを宣言し、`kubectl get` / `describe` / `logs` で状態を観察する――この往復が Kubernetes 運用の基本動作です。
579
+
580
+ 次章では、本章で学んだリソースを組み合わせて、実際のアプリケーションを Kubernetes 上に構築・デプロイする実践へ進みます。
581
+
582
+ ---
583
+
584
+ - 前の章:[第 4 章 複数コンテナ構成でのアプリケーション構築](04-multi-container-application.md)
585
+ - 次の章:[第 6 章 Kubernetes のデプロイ・クラスタ構築](06-kubernetes-deploy-cluster.md)