目的
業務で kubernetes の理解が必要になりました。
机上調査結果をまとめます。
手段
- 机上調査(概要理解を目的に)
- 検証(セットアップ、基本設定理解)
まずは机上調査
公式ドキュメントを読んでいきます。
kubernetes とは
コンテナ化されたアプリケーションの展開、スケーリング、管理の自動化をするためのオープンソースコンテナプラットフォーム。
つまり、多数のコンテナ稼働環境で良い感じに動かしてくれる OSS ですね。
Google は 2014 年に kubernetes プロジェクトをオープンソース化した。
- 基本を理解する
- 過去を振り返ると
- 仮想化ができる前の時代におけるデプロイ
- 物理サーバ上でアプリのリソースを制限する設定はない→リソース割り当て問題が発生
- リソース確保のために物理サーバ増加→運用・維持管理の手間
- 仮想化を使ったデプロイ
- アプリを NW 毎に隔離可能→アプリ間のセキュリティレベルを提供
- 物理リソースの使用率向上→ H/W コスト削減、スケーラビリティ向上
- コンテナを使ったデプロイ
- VMと同様に、コンテナは各自のファイルシステム、CPUの共有、メモリ、プロセス空間を持っている
- 基盤インフラストラクチャからの分離→実行環境の移動が容易
- 仮想化ができる前の時代におけるデプロイ
- Kubernetes が必要な理由と提供する機能
- サービスディスカバリーと負荷分散;k8s は負荷分散してくれる
- 自動化されたロールアウトとロールバック:マニュフェストで増減を自動化
- 自動ビンパッキング:リソース活用
- 自己修復:コンテナ増減
- 機密情報と構成管理:OAuthトークンなどちゃんと管理してくれる
- Kubernetes にないもの
- 構成言語など特に指定はない、と言っている
- 過去を振り返ると
Kubernetes のコンポーネント
いくつが用語が出てくる。
- 用語
- クラスター
- ノード:ワーカーマシンの集合
- マスターノード:クラスター内のワーカーノードとPodを管理
- ワーカーノード:Pod をホストする
- Pod:
- コントロールプレーン:クラスター内のワーカーノードとPodを管理
最初のスライドだとイマイチよくわかりません。
- コントロールプレーンコンポーネント
- クラスターに関する全体的な決定(スケジューリング)とイベント検出/応答を行う
- kube-apiserver : Kubernetest API を外部に提供する Kubernetest コントロールプレーンのコンポーネント。また、Kubernetest API コントロールプレーンのフロントエンドになる
- etcd : 一貫性、高可用性を持ったキーバリューストア。Kubernetes 全てのクラスター情報の保存場所として利用する。バックアップ要
- kube-scheduler : コントロールプレーン上で動作するコンポーネント。新規に作成された Pod にノード割り当て有無を監視、ノード無ければ Pod 内で実行するノードを選択する
- kube-controller-manager : 複数のコントローラープロセスを実行する?(ちょっと何言ってるか...)
- cloud-controller-manager : クラウド特有の制御ロジックを組み込む Kubernetes の control plane コンポーネント
- ノードコンポーネント
- kubelet : クラスター内の各ノードで実行されるエージェント。各コンテナがPodで実行されていることを保証する
- kube-proxy : クラスター内の各 node で動作しているネットワークプロキシ。Node のネットワークルールをメンテナスする
- コンテナランタイム : コンテの実行を担当する S/W。Dokcer, containerd,等をサポートする
- アドオン
- DNS : クラスター DNS を持つべき
- Web UI : GUI のこと
- コンテナリソース監視 : 監視データを閲覧可能
- クラスターレベルログ : ログ管理
Kubernetes API
control palne は API server。API サーバは、エンドユーザ、クラスター、外部コンポーネントが相互通信できるように HTTP API を公開する。(詳細は必要になれば参照)
Kubernetes オブジェクトを理解する
YAML フォーマットでオブジェクトを理解するコーナー!!
- Kubernetesオブジェクトを理解する
- アプリ実行、リソース割り当て、ポリシー設定可能(再起動、アップグレード、耐障害性ポリシーなど)
- クラスターの望ましい状態を宣言し、kubernetest はそれを維持してくれる
- 基本的に設定変更等は Kubernetes API を実行する。CLIツール(kubectl)を Kubernetes API 命令にコンバートして実行される
- オブジェクトのspec(仕様)とstatus(状態)
- 要するに yaml で書いた状態を維持してくれる
- Kubenetesオブジェクトを記述する
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 #バージョン指定
kind: Deployment # 種類?
metadata:
name: nginx-deployment # 名前
spec:
selector:
matchLabels:
app: nginx # アプリ指定
replicas: 2 # tells deployment to run 2 pods matching the template #Pod数指定
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2 # イメージ指定
ports:
- containerPort: 80 # nginx の公開ポート
Pod
Pod は Kubernetes 内で作成・管理可能なコンピューティングの最小デプロイユニット。
Pod は1つまたは複数のコンテナグループであり、ストレージやネットワークの共有リソースを持ち、コンテナの実行方法に関する仕様を持っている。
- Podとは何か?
- Dockerの概念を使って説明すると、Pod は共有の名前空間と共有ファイルシステムのボリュームを持つDockerコンテナグループに似ている。(コンテナ群+名前空間と共有ファイルシステム)
- Podを使用する
- 単一コンテナを実行するPod と 複数コンテナを実行するPodがある
- アプリを水平スケールさせる場合は複数Podを使用するべき
- Podが複数コンテナを管理する方法
- サイドカーとか使おうね
- Podを利用する
- Podはある程度一時的で使い捨てできる存在として設計されている
- Pod とコンテナコントローラー
- コントローラーはノード動作停止を検知し、代わりのPod を作成する
- Pod テンプレート
- workload リソース向けのコントローラーは、PodをPodテンプレートを元に作成し、代わりにPodを管理する
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
# これがPodテンプレートです
spec:
containers: # コンテナ指定
- name: hello # 名前
image: busybox # イメージ指定
command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600'] # コマンド
restartPolicy: OnFailure # 復旧ポリシー?
# Podテンプレートはここまでです
- リソースの共有と通信
- Pod内のストレージ
- Pod は共有ストレージであるボリュームの集合を指定可能
- Pod ネットワーク
- 各 Pod には、各アドレスファミリーごとにユニークなIPアドレスがアサインされる。ここはdocker に似ている
- コンテナの特権モード
- priviledge フラグで特権モードを有効化可能
- static Pod
- static Pod は、API サーバーに管理されない、特定ノード上でkubelet デーモンによって直接管理される Pod を指す
- Pod内のストレージ
Pod の概観
- Pod について理解する
- Kubernetes アプリケーションの基本的な実行単位
- Pod はクラスターで実行されているプロセスを表す
- ネットワーキング
- 各Pod は固有のIPアドレスを割り当てられる
- ストレージ
- ストレージぼりゅーのセットを指定可能
- Pod を利用する
- Kubernetesはコントローラーと呼ばれる高レベルの中小概念を使用し、それは比較的使い捨て可能なPodインスタンスの管理を行う
- Podとコントローラー
- 1つまたはそれ以上のPodを含むコントローラーの例は3つ。
- Deployment
- StatefulSet
- DaemonSet
- 1つまたはそれ以上のPodを含むコントローラーの例は3つ。
- Podテンプレート
- Podテンプレートはクッキーの抜き型のようなもの
ここまでの感想
正直早いタイミングで手を動かし始めた方が良いと思いました。
ざっくり概念は伝わってきますが、登場人物は多すぎて "Pod は最小実行単位" くらいしか記憶に残っていない感じです。
ブラウザで実行可能なチュートリアルがあるようなのでそちらに進みたいと思います。