Kubernetes API
Kubernetesの操作は全てこれで行います。
オブジェクト
k8sクラスタ内のエンティティ(実体)です。「ポッド」、「コントローラ」、「サービス」などのインスタンスとも言える。
ワークロード
オブジェクトのカテゴリを表す用語、コンテナ、ポッド、コントローラのグループを指している。
ワークロードのタイプ
フロントエンド処理
大量のクライアントリクエストに対して短い時間で応答を返す必要がある。これを実現するためには複数のポッドで分担する設計にしなければならない。
バックエンド処理
フロントエンドの業務変化に合わせて対応できる柔軟性が必要、下記内容はどのアプリケーションでも共通に保持しているべき機能
- データストア
- キャッシュ:複数ポッド間のデータ共有
- メッセージング:非同期のシステム間連携
- マイクロサービス:専門業務、共通業務
- バッチ処理(長い時間を要する業務)
バッチ処理(定期実行処理を含む)
バッチ処理は多種多様な種類がある。
- 大量メール送信
- 動画フォーマット変換
- 日次の業務処理
システム運用処理
システム運用はある程度自動化することができます。
コンテナ
Kubernetesではコンテナ単独で実行することはできず必ずポッド内で実行することになる。
ポッド(Pod)
コンテナを実行するためのオブジェクトを指します。1〜複数のコンテナを内包しています。論理的なホストとして振舞います。単一目的で作られたコンテナを部品のように組み合わせることによってより高度な目標を達成するためのプラットフォームです。
機能
- ポッド内のコンテナはポッドのIPとポート番号を共有して、ポッドを外部に向けてポート番号を開くことができます。
- ポッド内部のコンテナ同士は互いに通信できる。
- System Vのプロセス間通信及びPOSIX共有メモリを使用して互いに通信できる。
- ポッドのボリュームをコンテナからクロスマウントしてポッド内でファイルシステムを共有できる。
ポッドは一時的存在
一時的な存在であり、起動と削除ごとに毎回イメージから新しいものが作成されます。ポッドのIPアドレスも起動状態も起動する度にリセットされます。また、ポッドの起動削除はコントローラによって管理されていて、いつの間にかIPアドレスが変わっていたりします。なので、ポッドにリクエストを送りたい場合は必ずサービス名を利用します。
コンテナの実行状態を管理する。
ポッド自身の実行状態管理はコントローラが受け持ちますが、ポッド内部の実行状態の管理はポッドが行います。ポッド内部のコンテナが何らかの理由で停止した場合は自動で起動します。内部のコンテナアプリケーションの監視ができます。
コントローラ(Controller)
ポッドの実行を制御するオブジェクト。処理の種類に応じた複数コントローラを使い分ける必要がある。ポッドに課せられるワークロードのタイプや処理の種類に応じて、適切なコントローラを選択できるようになる。
コントローラのタイプ
デプロイメント
対等な関係にある複数ボットを水平クラスタで構成できます。
ステートフルセット
ポッドと永続ボリュームの組み合わせで制御を行い永続ボリュームを保護を優先する。
ジョブ
バッチ処理のコンテナが正常終了するまで再試行をする。
クーロンジョブ
時間指定で定期的にジョブを生成する。
デーモンセット
K8sクラスタの全ノードで同じポッドを実行するためにある。
レプリカセット
デプロイメントコントローラと連動してポッドのレプリカ数の管理を担当する。
レプリケーションコントローラ
過去のチュートリアルの資料で見かける。次世代コントローラであるデプロイメントの利用が推奨されている。
コンフィグレーション(Configuration)
コンテナのアプリ設定やパスワード等の情報はデプロイされた「名前空間」から取得する必要がある。
サービス(Service)
ポッドとサービス名を具体的に紐づけてクライアントのリクエストをポッドへ転送する役割、起動の度にIPアドレスが変わるため。クライアントはサービスが持つ「代表IPアドレス」へアクセスする必要がある。
Podの集合を抽象化して外部公開する。
- Podの集合に対するDNS名
- Podの集合に対する負荷分散(L4ロードバランサー)
背景
各PodはIPアドレスを持っているが、Podの作成、削除のたびにIPが変化するので使う側が大変になってしまいます。
ServiceがDNS名を持っているので、常に同じ名前でユーザーはアクセスができます。IPアドレスの管理を自動で行なってくれます。また、Portのマッピングも可能です。
定義
Serviceは対象となるPodをSelectorを用いて認識します。
Ingress
L7ロードバランサーで外部公開を行います。
ストレージ(Storage)
ポッドもコンテナ実行時の一時的な存在、データを消失してはいけないので電源オフになってもデータが維持される永続ボリュームに保存する必要がある。
ロールアウト
本番配信中のアプリを稼働中にアップデートする機能
クラスタネットワーク
k8sクラスタ内部のネットワーク、ポッドのIPアドレスとポッドのクラスタ(レプリカ)の代表IPアドレスは、このネットワークのIPアドレスになる。
Flannel
シンプルなL3ネットワークをノード間に構築する。あるノード上のポッドが他のノード上のポッドと疎通できるようにします。
Calico
ノード横断のポッド間通信に加えてネットワークのアクセスポリシーを提供する。
リソース
Namespece-scopedリソース
- Namespaceに属しているリソースでNamespaceを削除時に削除される。
- Namespace内では一意である必要がある。
- 例:Pod、Service、Deployment、DaemonSet、StatefulSet
Cluster-scopedリソース
- クラスタ全体で使われるもの
- 同一クラスター内で名前はユニークである必要がある。
- 例:ClusterRole、ClusterRoleBinding、CustomResourceDefinition
確認方法
以下のコマンドを使うことで対象リソースがどこに属しているか確認できます。
1 |
kubectl api-resources --namespace |
PersistantVolume
永続データの実態です。ストレージを抽象化します。
PersistantVolumeClaim
抽象化されたストレージ(PersistantVolume)を要求します。
この記事へのコメントはありません。