「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
- K8sとも呼ばれる。
- ギリシャ語で航海長またはパイロットを意味する。
- ネットワークインフラなどの自動展開やスケーリングといったコンテナの運用を自動化するための、
フリーソフトウェアによって構成されるコンテナオーケストレーションプラットフォーム。
経緯 †
- オープンソースソフトウェアとして公開したことで、
MicrosoftやRed Hatといった多くのIT企業が開発に参加表明。
- 2017年初頭に、Kubernetesをサポートする
Public Cloud は Google Cloud Platformのみだった。
- 2017年2月に、Microsoft AzureがKubernetesの公式サポートを表明、
クラウド業界は次第にKubernetesにシフトするようになった。
- オラクルやVMwareといった企業もCNCFに参加を表明
- GoogleやMicrosoft Azureとは競合関係にあるAWSも参加
- 2017年10月に、DockerがKubernetesサポートすることを発表。
- 2018年1月時点でLinux Foundationの傘下にある
CNCFが管理するオープンソースプロジェクトとなっている。
アーキテクチャ †
- ネットワークで接続された複数のLinux上にクラスタを構築することで動作する。
- クラスタは主に複数のマスター (master) とノード (node) から構成される。
- マスターがクラスターの管理を行い、
- コンテナは各ノード上にデプロイされる。
- マスターやノードを構成するコンポーネントは下記のようになっている。
- マスターとノードのコンポーネントは同一のマシン上に存在してもよく、
最小の構成では1台からなるKubernetesクラスタが構築出来る。
マスター †
kube-apiserver †
Kubernetes APIを外部に公開するためのコンポーネント。
etcd †
Kubernetesクラスタの情報を保存する分散キーバリューストア。
kube-scheduler †
ポッドをどのノードに対してデプロイするかを選択するコンポーネント。
kube-controller-manager †
Kubernetesクラスタの各種コントローラを実行するコンポーネント。
cloud-controller-manager †
- Kubernetesとプラットフォームとなっている
クラウドプロバイダとの相互作用を担うコンポーネント。
- 各クラウドプロバイダに特化した機能を提供し、パフォーマンスを向上する。
その他アドオン †
- Kubernetesクラスタ内での名前解決を行うDNSサーバ
- 各種Web UIやクラスタ単位でロギングを行うコンポーネント(fluentd, etc.)
- , etc.
ノード †
kubelet †
- ノード上に常駐し、ノードの生存をクラスタに対して通知する。
- 自身に対するポッドの割り当てが行われたかどうかを監視して
- ボリュームのマウント、
- コンテナのダウンロード/デプロイ、
- ポッドの生存確認
などを行い、クラスタに通知する機能も担う。
kube-proxy †
外部やapiserverからのアクセスを、
ノード上の各ポッドに対して転送し、
ポッドへのアクセスを抽象化するコンポーネント。
Docker †
実際にコンテナを動作させるバックエンドに利用される。
supervisord †
kubeletとdockerが正しく動作し続けるように監視及び管理するコンポーネント。
fluentd †
クラスタレベルでのロギングを補助する。
コントローラ †
Deployments †
- CLIを使用したり、yaml や JSON で定義をコントローラに渡したりして展開できる。
- ポッドだけでなくサービスの定義や、各種要素の詳細な設定を定義して一括で適用できる。
ReplicaSet? †
- 負荷分散や、SLAの維持のためレプリカ数のポッドが利用可能であることを保証する。
- ポッドがどのノードで動くかはスケジューラーによって決定される。
DaemonSet? †
- ノードが単一のポッドのコピーを稼働させることを保証する。
- 全ノードや特定のノード群に対してある機能を実行しておきたい場合に使う。
StatefulSet? †
- データベースなどステートフルなポッドが必要な場合はステートフルセットを使って展開。
- ステートフルセットを使うとストレージやネットワーク名などが保持される。
ポッド †
概要 †
- いくつかのコンテナをグループ化したもの。
- ポッド単位で作成、開始、停止、削除といった操作を行う。
- 1つのコンテナを作成したいときも「コンテナが1つ含まれるポッド」を作成する。
特徴 †
以下の特徴がある。
- ポッド内のコンテナは、同一ホスト上に配備される。
- ポッド内のコンテナは、仮想NICやプロセステーブルを共有する。
→ つまり、同じIPを使えたり、互いのプロセスが見えたりする。
- 各ポッドには固有のIPアドレスがあり、ポートスペース全体を所有している。
- ポッド内のコンテナはストレージを共有できる。
- ポッドには、ポッドをグループするための1つ以上のラベルを指定できる。
- 一般的には、サーバと、そのサーバと共に実行する補助サービスを含める。
- Webサーバ
- APサーバ
- DBサーバ
- KVSサーバ
ボリューム †
- 抽象化されたポッドと疎結合なリソースで、ポッドに紐づく。
- ポッド内のコンテナがデータを読み書きできるディスク領域。
- 様々な種類が提供されている。
種類や用途 †
ボリュームには様々な種類や用途がある。
ボリューム・タイプ †
- emptyDir
- ポッド用の一時的なディスク領域
- ポッドが terminate されると削除される。
- hostPath
ノード(ホスト)の任意の領域をマウントできる。
- PersistentVolume?(PV)
- 永続化領域として確保されるボリューム。
- PVは個別にリソースを作成して利用する必要がある。
- 後述する PersistentVolumeClaim?(PVC)経由で利用する。
- PersistentVolumeClaim?(PVC)
- PV の要求を行うリソース。
- PVC は要求された内容(容量、ラベル)から
適切な PV を探し、ボリュームを割り当てる。
- プロビジョニングの方法として以下の2つの方法がある。
- Static : 予め PV を作成
- Dynamic : PVC が作成した際に動的に PV を作成
サービス †
ネットワーク機能を提供するコンポーネント
用途 †
- ポッドに対して通信をルーティングする。
- ポッドに対する通信を維持する(SLA、負荷分散)
サービス・タイプ †
以下の種類がある。
- ExternalName?
特定の DNS エントリを作成
- NodePort?
「ノードのIP:特定のポート」を特定のサービス(ClusterIP:特定のポート)に転送
トレンド †
Dockerとの関係 †
- コンテナとしてもDockerに依存しない「cri-o」と言う
軽量コンテナランタイムの1.0が2017/10/17にリリースされた。
- cri-oはコンテナランタイムとして最適化されているため、
Dockerコマンドのようなコンテナ、イメージを操作する機能などを備えていない。
- アプリケーションの開発フェーズにおいてDockerが使われる。
PaaSの上モノ部分 †
OpenShiftの「s2i」に相当するものが色々出ており、
(microsoftの「draft」やGoogleの「Skaffold」など)
玉石混合で、なにがベストプラクティスなのか固まっていない。
Helm → Compose on Kubernetes
参考 †
Qiita †
Publickey †
Kubernetes †
Concepts †
https://kubernetes.io/docs/concepts/
- Overview
- Cluster Architecture
- Workloads
- Services, Load Balancing, and Networking
- Storage
- Configuration
- Security
- Policies
- Scheduling
- Cluster Administration
- Extending Kubernetes
Kubectl †
サブシステム †
マイクロソフト系技術情報 Wiki †