Guest User

Untitled

a guest
Jan 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.86 KB | None | 0 0
  1. ## 1 Introduction Kubernetes
  2.  
  3. * この章では、以下のことを解説する
  4. * 開発と運用がどのように変わったか
  5. * コンテナがどのように isolation と環境の違いを減らしたか
  6. * Docker とはなにか、k8s でどのように使われているか
  7. * k8s がなにをして開発と運用をどのように助けるか
  8. * 昔のアプリは巨大なモノリスだった
  9. * 遅いリリースライフサイクル
  10. * 最近のアプリはマイクロサービス
  11. * 高速に更新できる
  12. * しかし、デプロイするコンポーネントの数が増えてデータセンターが大きくなると全体の設定や管理の難しさが増す
  13. * resource utilization やハードウェアコストの最適化
  14. * 手動では回らない
  15. * k8s が自動スケジューリング、設定、supervision、failure-handling をやってくれる
  16. * k8s が開発者が自力でデプロイすることを可能にする
  17. * k8s が運用者に定期的なモニタリングやハードウェア故障時の自動リスケなどを助けてくれる
  18. * k8s がハードウェアインフラを抽象化し、データセンター全体を一つの膨大な計算資源として扱えるようにする
  19.  
  20. ### 1.1 Understanding the need for a system like Kubernetes
  21.  
  22. * k8s の詳細に入る前にアプリの開発とデプロイが近年どのように変化したか見てみる
  23. * マイクロサービス化とアプリが運用されるインフラの変化の影響が大きい
  24. * モノリシックからマイクロサービスモノリシック
  25. * すべてのコンポーネントが密結合しており、一つの OS 上のプロセスとして動作する
  26. * 一部を変更すると全体を再デプロイすることになる
  27. * パーツ間の明確な境界線がないので、複雑になり品質が落ちる
  28. * モノリシックなアプリをスケールさせるには垂直にサーバーの CPU やメモリを強化する
  29. * スケールアップ
  30. * アプリに変更が必要ないけど上限がある
  31. * もしくは並列に複数のサーバーで分離したアプリのインスタンスを運用する
  32. * スケールアウト
  33. * アプリ側の変更が必要なので不可能な場合もある(e.g. RDB)
  34. * 一部でもスケールできないアプリがあるとアプリ全体がスケールできなくなる
  35. * どうにかして分割しないかぎり
  36.  
  37. #### Splitting Apps into Microservices
  38.  
  39. * これらのような問題に対応するために、より小さい独立してデプロイできるマイクロサービスに分割することを強いられる
  40. * Figure 1.1
  41. * それぞれのマイクロサービスは独立したプロセスとして動作して API でやりとりする
  42. * 個別に開発してデプロイ可能で、API の後方互換性が保たれていれば他のサービスの再デプロイを必要としない
  43. * サービス間のやりとりは REST API のような同期的なプロトコルか AMQP(Advanced Message Queueing Protocol) のような非同期的なプロトコルで行う
  44. * これらのプロトコルは言語関係なく使えるので、サービスごとに言語選択は自由になる
  45.  
  46. #### Scaling Microservices
  47.  
  48. * マイクロサービスをスケールさせるのは個別のサービス単位となる
  49. * 他のサービスはもとのスケールを保ったままにできる
  50. * Figure 1.2
  51. * スケールアウトできないサービスだけスケールアップさせて、他のサービスはスケールアウトさせるようなこともできる
  52.  
  53. #### Deploying Microservices
  54.  
  55. * マイクロサービスにも短所はある
  56. * デプロイするコンポーネントの数が増えると複雑になる
  57. * 単純なコンポーネント数だけでなく内部の依存関係も増えるため
  58. * マイクロサービスを運営するチーム間のコミュニケーションが増える
  59. * 退屈かつエラーを起こしやすい
  60.  
  61. #### Understanding the Divergence of Environment Requirements
  62.  
  63. * マイクロサービス間で同じライブラリの異なるバージョンを要求することがある
  64. * Figure 1.3
  65. * これらすべてのライブラリを同じホストに入れたくない
  66.  
  67. #### 1.1.1 Providing a consistent environment to applications
  68.  
  69. * 環境の違いは開発にとっても運用にとっても大きな問題
  70. * 開発環境と本番環境の違い、本番マシン間の違い、マシン変更など
  71. * この差異はハードウェア、OS、ライブラリなど多岐にわたる
  72. * 本番環境で起こった問題を手元で再現したいが、その環境は一時的なものにしたい
  73.  
  74. #### 1.1.2 Moving to continuous delivery and DevOps
  75.  
  76. * 近年では開発プロセスや本番環境でのアプリの扱われ方が変化してきている
  77. * 過去は開発チームはアプリを作って運用チームに渡すだけだった
  78. * 今は開発と運用を 1 つのチームで行う
  79. * QA や運用チームも全体のプロセスに関わる
  80. * DevOps
  81.  
  82. ##### Understanding the Benefits
  83.  
  84. * 開発者が運用に関わるとユーザーの要求や問題、運用が直面する問題への理解が深まる
  85. * より頻繁にアプリをリリースできるようにするにはデプロイプロセスのストリームラインが必要
  86. * 理想的には開発者自信がデプロイできるようになってほしい
  87. * しかし、デプロイにはインフラやハードウェアの理解が必要だけど、開発は通常詳細な知識を持たないし、そもそも知りたいわけでもない
  88.  
  89. ##### Letting Developers and Sysadmins Do What They Do Best
  90.  
  91. * 開発と運用が一緒に働いても、それぞれに異なるゴールとモチベーションがある
  92. * 開発者は新しい機能を作りたいし、OS のセキュリティパッチを当てたりしたくはない
  93. * 運用はハードウェアインフラ全体やセキュリティ、utilization などに責任を持つ
  94. * インフラの変更がアプリに与える影響とか考慮したくない
  95. * 理想的には開発者はハードウェアインフラについて知らなくてもデプロイできるようになってほしい
  96. * 運用にはアプリケーションの特性をしらなくてもハードウェアインフラを管理できるようになってほしい
  97. * k8s はこれらのことを可能にする
  98.  
  99. ### 1.2 Introducing container technologies
  100.  
  101. * k8s はいわゆる Linux コンテナ技術を使う
  102.  
  103. #### 1.2.1 Understanding what containers are
  104.  
  105. * コンポーネントの数が少ないうちはコンポーネント 1 つにつき 1 VM のような構成がとれる
  106. * しかし、コンポーネントの数が増えるとそうはいかない
  107. * ハードウェアリソースのコスト最適化や、VM の管理コスト削減のため
  108.  
  109. ##### Isolating Components with Linux Container Technologies
  110.  
  111. * 環境を隔離するために VM ではなくてコンテナ技術を使うようになりつつある
  112. * VM よりオーバーヘッドを少なく、異なる隔離された環境を 1 ホスト内に用意できる
  113. * コンテナ内のプロセスにとっては VM で実行されているのと変わらない
  114.  
  115. ##### Comparing Virtual Machines to Containers
  116.  
  117. * コンテナのほうが VM より軽量
  118. * VM はアプリだけではなくシステムプロセスも稼働するため
  119. * コンテナは VM と違って異なる OS のアプリを 1 ホストで運用できる
  120. * Figure 1.4
  121. * すべてのコンテナは同じカーネルを通じて CPU などのリソースを利用する
  122. * Figure 1.5
  123. * VM の主な利点は、カーネルレベルでも完全に隔離されるのでよりセキュリティ的に安全
  124.  
  125. ##### Introducing the Mechanisms that Make Container Isolation Possible
  126.  
  127. * プロセス同士を隔離するためのメカニズムが 2 つある
  128. * Linux Namespaces
  129. * それぞれのプロセスが自信のシステムのみを見られる
  130. * Linux Control Groups (cgroups)
  131. * プロセスが利用できるリソース(CPU、メモリ、ネットワーク帯域など)を制限できる
  132.  
  133. ##### Isolating Processes with Linux Namespaces
  134.  
  135. * デフォルトでは Linux システムは 1 つのネームスペースを持つ
  136. * ファイルシステムやプロセス ID、ユーザー ID、ネットワークインターフェースなどのシステムリソースは 1 つのネームスペースに属する
  137. * 新たなネームスペースを追加できる
  138. * ネームスペースの詳細については Chapter 3
  139.  
  140. ##### Limiting Resources Available to a Process
  141.  
  142. * 他のプロセスのリソースを食わない
  143.  
  144. #### 1.2.2 Introducing the Docker container platform
  145.  
  146. * コンテナ技術は長いこと存在するけど、Docker プラットフォームによって広く周知されるようになった
  147. * Docker はマシン間で簡単にコンテナを持ち運べるようにした最初のコンテナシステム
  148. * アプリだけでなく依存するライブラリや OS ファイルシステムもパッケージ化する
  149. * パッケージしたのと完全に同じファイルシステム上でアプリを動作させる
  150. * アプリは完全にホスト OS ではなくコンテナの OS の上で動いていると判断する
  151. * Docker は、アプリのパッケージ化、配布、運用のためのプラットフォーム
  152. * パッケージを Docker のリポジトリに送って、それをマシンから利用できる
  153. * 用語
  154. * Images: アプリとその環境をパッケージしたもの
  155. * ファイルシステムとメタデータ(イメージ起動時に実行するパスなど)を含む
  156. * Registries: Docker イメージを保存して共有できるようにするリポジトリ
  157. * Containers: 実行中の Docker イメージ
  158. * コンテナはホストや他のプロセスからは隔離されたプロセス
  159. * 割り当てられたリソースしか使えない
  160.  
  161. ##### Building, Distributing and Running a Docker Image
  162.  
  163. * Figure 1.6
  164.  
  165. ##### Comparing Virtual Machines and Docker Containers
  166.  
  167. * Figure 1.7
  168. * アプリ A とアプリ B は同じバイナリとライブラリにアクセスしているが、隔離されたファイルシステムでどのように共有しているのか?
  169.  
  170. ##### Understanding Image Layers
  171.  
  172. * Docker イメージはレイヤーからなる
  173. * 異なるイメージが完全に同じレイヤーを含むことがある
  174. * Docker イメージは異なるイメージの上に作られるので
  175. * これはネットワークを通したイメージ配布速度を上げる
  176. * ストレージの使用量も下げる
  177. * コンテナが共有レイヤのファイルを書き換えても、他のコンテナはそれを見られない
  178. * Docker イメージレイヤーは readonly
  179. * コンテナが実行されるとき、すべてのレイヤーの上に書込み可能なレイヤーが追加される
  180.  
  181. ##### Understanding the Portability Limitations of Docker Images
  182.  
  183. * 理論的には Docker イメージはあらゆる Linux マシン上で動作するが、注意点がある
  184. * マシン間で Linux カーネルが異なると同じように動く保証はない
  185. * アプリにカーネルに関連した要求があるときは注意
  186. * VM にはこのような問題はない
  187. * 特定のハードウェアアーキテクチャを想定したアプリにも同じことが言える
  188.  
  189. #### 1.2.3 Introducing rkt - an alternative to Docker
  190.  
  191. * Docker の成功後、Open Container Initiative (OCI) がコンテナフォーマットとランタイムの標準化のために誕生した
  192. * Docker と同様に、rkt も Linux コンテナエンジン
  193. * rkt はセキュリティと composability、オープンスタンダードへの追従に重点を置いている
  194. * OCI コンテナイメージフォーマットを使用しており、Docker のコンテナイメージも実行できる
  195. * この本では Docker にフォーカスする
  196. * k8s が最初にサポートした唯一のコンテナランタイムだから
  197. * k8s は最近 rkt や他のサポートも始めた
  198. * rkt の解説をしたのは、k8s が Docker 専用のツールだと思われないようにするため
  199.  
  200. ### 1.3 Introducing Kubernetes
  201.  
  202. * おそらく Google がソフトウェアコンポーネントとインフラのデプロイと管理によりよい方法が必要と最初に気づいた会社だろう
  203.  
  204. #### 1.3.1 Understanding its origins
  205.  
  206. * 長い間、Google は Borg (その後、Omega) という内部システムを開発した
  207. * アプリ開発者と運用が数千のアプリとサービスを管理するのを助ける
  208. * インフラの utilization も助けた
  209. * 数十万のマシンを運用すると、少しの稼働率の改善が数百万ドルのコスト削減につながる
  210. * 長い間 Borg は秘密になっていたけど、2014 年に Google がそれらや他の社内システムの経験を元にした k8s を紹介した
  211.  
  212. #### 1.3.2 Looking at Kubernetes from the top of a mountain
  213.  
  214. * k8s を通したデプロイはクラスタのサイズに関わらずいつも同じである
  215.  
  216. ##### Understanding the Core of What Kubernetes Does
  217.  
  218. * k8s のシステムはマスターノードと複数のワーカーノードからなる
  219. * Figure 1.8
  220. * マスターにアプリを submit すると、k8s はワーカーノードのクラスタにデプロイする
  221. * どのノードにどのコンポーネントがデプロイされるかは問題にならないし、問題になってはいけない
  222. * 開発者は同じワーカーノードで運用されないといけないアプリを指定できる
  223. * それぞれのアプリがどこにデプロイされようとも、他のアプリを見つけてやりとりすることが簡単にできる
  224.  
  225. ##### Helping Developers Focus on the Core App Features
  226.  
  227. * k8s はクラスタのための OS と考えられる
  228. * service discovery やスケーリング、ロードバランシング、self-healing、leader election といったことから開発者を解放する
  229. * 開発者はアプリの機能開発に集中でき、どのようにインフラと結合するかに時間を取られなくなる
  230.  
  231. ##### Helping Ops Teams Achieve Better Resource Utilization
  232.  
  233. * k8s 上ではアプリを自由に再配置できるので、リソース稼働率がよりよくなる
  234.  
  235. #### 1.3.3 Understanding the architecture of a Kubernetes cluster
  236.  
  237. * k8s クラスタは 2 種類のノードに分けられる
  238. * k8s Control Plane (master node)
  239. * k8s 全体のコントロールと管理を行う
  240. * worker nodes
  241. * 実際のアプリをデプロイする
  242.  
  243. ##### The Control Plane
  244.  
  245. * Control Plane は複数のコンポネントからなっていて、これは 1 つのノードでも複数のノードでも実行できる
  246. * 高可用性を保証できる
  247. * API Server
  248. * k8s クラスタとやりとりして操作する
  249. * Scheduler
  250. * アプリのスケジューリングを担当する(アプリコンポーネントをワーカーにアサインする)
  251. * Control Manager
  252. * クラスタレベルの機能を実行する(コンポーネントのレプリケーション、ワーカーノードの追跡など)
  253. * etcd
  254. * 全体のクラスタ設定を永続的に保存する分散データストア
  255. * Control Plane 上ではアプリは実行しない
  256.  
  257. ##### The Nodes
  258.  
  259. * Docker, rkt や他のコンテナランタイムでコンテナを実行する
  260. * Kubelet でマスターとノード上のコントロールコンテナとやりとりをする
  261. * Kube-Proxy でアプリコンポーネント間のネットワークトラフィックをプロキシしたりロードバランシングしたりする
  262. * ノード間のネットワークはノード内のコンテナが実際のネットワークに関わらずフラットなネットワークの一部になれるようにセットアップされる
  263.  
  264. #### 1.3.4 Running an application on Kubernetes
  265.  
  266. * アプリディスクリプタの形式で API サーバーにアプリの説明を送ることでアプリを実行する
  267.  
  268. ##### Describing What Containers to Run and How They Should Be Organized
  269.  
  270. * 説明はアプリコンポーネントのコンテナイメージや、それらのコンポーネントが相互にどのように関係するかといった情報が含まれる
  271. * サービスが内部サービスなのか外部サービスなのか、他のコンポーネントから静的 IP で参照されるのかなど
  272.  
  273. ##### Understanding How the Description Results in a Running Container
  274.  
  275. * API サーバーがアプリの説明を処理すると、スケジューラが指定されたコンテナグループを必要とするリソースを元に利用可能なワーカーノードにスケジュールする
  276. * ワーカーノード上の Kubelet が Docker イメージを pull してコンテナを実行する
  277. * Figure 1.9
  278.  
  279. ##### Keeping the Containers Running
  280.  
  281. * アプリが起動すると、k8s は継続的に description を元にアプリの状態を確認する
  282. * 例えば、Web サーバーのインスタンスを 5 つ稼働するように指定したら、インスタンスが 1 つでも止まったら自動的に再起動する
  283. * ワーカーノードごと死んだ場合も、別のワーカーノードに割り当てる
  284.  
  285. ##### Scaling the Number of Copies
  286.  
  287. * コピーの増減もリアルタイムのメトリクス(CPU やメモリ使用量など)を元に自動でやってくれる
  288.  
  289. ##### Hitting a Moving Target
  290.  
  291. * クライアントが簡単にコンテナを探せるように、k8s は単一の静的 IP で公開する
  292. * Kube-proxy がサービスへのリクエストやロードバランシングをいい感じにしてくれるし、コンテナがクラスタ内を移動しても一貫性を保ってくれる
  293.  
  294. #### 1.3.5 Understanding the benefits of using Kubernetes
  295.  
  296. * すべてのサービスが k8s 上に乗ると、Ops チームがデプロイを行うことはなくなる
  297. * 必要なことは k8s をすべてのクラスタノードにインストールしてネットワークを適切に設定するだけ
  298. * 開発者は運用の手助けなくデプロイとアプリの実行ができる
  299. * 一部のアプリは HDD ではなく SSD を使うみたいな場合はハードウェアのことを考えることもあるが、それでも簡単
  300.  
  301. ##### Achieving Better Utilization of Hardware
  302.  
  303. * コンテナを使うことによってアプリが特定のノードに縛られなくなったので、アプリはクラスタ内をいつでも自由に移動できるようになる
  304. * これによりリソースの最適化が k8s によって自動で行われる
  305.  
  306. ##### Health Checking and Self-Healing
  307.  
  308. * サーバーが落ちたときも k8s が自動で回復してくれる
  309.  
  310. ##### Auto-Scaling
  311.  
  312. * 負荷が高まったときも k8s がモニターして自動でスケールしてくれる
  313. * クラウドプロバイダならクラスタ自体のサイズアップやダウンも自動で行う
  314.  
  315. ##### Simplifying Application Development
  316.  
  317. * サービスディスカバリのような機能をアプリ側で開発する必要がなくなる
  318. * 最悪でも k8s API サーバーに情報を問い合わせるぐらい
  319. * k8s は最新バージョンがスラッシングを開始したら自動でロールアウトを止めたりする
  320.  
  321. ### 1.4 Summary
  322.  
  323. * モノリシックアプリはデプロイしやすいがメンテが辛いしスケールしない場合がある
  324. * マイクロサービスはそれぞれのコンポーネントを開発しやすくするがデプロイが難しく 1 つのシステムとして設定管理するのが辛い
  325. * Linux コンテナは VM のメリットに加えて、より軽量でハードウェア最適化できる
  326. * Docker は既存のコンテナ技術をより簡単かつ高速に OS 環境ごと供給できるようにした
  327. * k8s はデータセンター全体をアプリのための単一のコンピューターリソースとする
  328. * 開発者は k8s があれば運用管理者なしでアプリをデプロイできる
  329. * k8s はノードの失敗にも自動で対応してくれるので運用管理者はよく眠れる
Add Comment
Please, Sign In to add comment