Kubernetes入門(Docker / Kubernetes 実践コンテナ開発入門)
Kubernetes入門
Kubernetes の概念
リソース
-
- Kubernetesの様々なリソースを管理する集合体
- Masterが少なくとも1つは配置される
Node
- Kubernetesクラスタ管理下に登録されているコンテナホスト(コンテナにDockerを使用していればDockerホスト)
- Kubernetesでコンテナをデプロイするために利用される
kubectl get nodes
でnodeの一覧が取得できる
Namespace
Pod
- コンテナの集合体
- 少なくとも1つのコンテナを含む
- Docker と組み合わせる場合はDockerコンテナ単体あるいはDockerコンテナの集合体
- コンテナ間を密結合にする
- 同一Podのコンテナはすべて同一のNodeに配置される
- Podのコンテナでコマンドを実行したい場合は
kubectl exec -it ...
- Pod ごとに固有の仮想IPが割り当てられる
- Podに所属するすべてのコンテナで共有
ReplicaSet
- 同一のPodを複数実行することで可用性を向上を図る
- 同じ仕様のPodを複数生成・管理するためのリソース
Deployment
- ReplicaSetの上位リソース
- アプリケーションのデプロイの基本単位となるリソース
- ReplicaSetを管理・操作するために提供されているリソース
- ReplicaSetは指定されたPodの数の確保、新しいバージョンのPodへの入れ替え、以前のバージョンへのPodのロールバックなどの機能を担う
- Deploymentの更新によってReplicaSetが新しく作成され、ReplicaSetの入れ替えが発生する
Service
- Kubernetesクラスタ内において、Podの集合に対する経路やサービスディスカバリを提供するためのリソース
ClusterIP Service
- ClusterIPではKubernetesクラスタ上の内部IPアドレスにServiceを公開できる
- あるPodからPod群へのアクセスはServiceを介して行うことができる(Service名で名前解決できる)
NodePort Service
- クラスタの外からアクセスできるService
- ClusterIPを作るという意味ではClusterIP Serviceと同じ
- 各ノード上のServiceポートへ接続するためのグローバルなポートを開けるという違いがある
LoadBalancer Service
- 各クラウドプラットフォームで提供されているロードバランサと連携するためのService
ExternalName Service
- selecrotもport定義ももたない特殊なService
- Kubernetesクラスタ内から外部ホストを解決するためのエイリアスを提供する
-
- Kubernetesクラスタの外にServiceを公開するためにはServiceをNodePortで公開することで可能
- L4レイヤ
- L7(例えばHTTP/HTTPS)での制御するときに利用するリソース
- ServiceのKubernetes外への公開とVirtualHostやパスベースでの高度なHTTPルーティングを両立する
- HTTP/HTTPSベースのサービスを公開する場合はIngressを利用することになる
- Kubernetesクラスタの外にServiceを公開するためにはServiceをNodePortで公開することで可能
PersistentVolume/PersistentVolumeClaim
- ストレージの確保する方法
- PersistentVolume
- ストレージの実体
- PersistentVolumeClaim
- ストレージを論理的に抽象化したリソース
- PersistentVolumeと比較して動的に容量を確保することが可能
StorageClass
StatefulSet
- DeploymentはPod仕様に基づきPodを作成するリソース
- StatefulSetは永続化データを持つステートフルなアプリケーション管理に向いている
用語
- マニフェスト
- Kubernetesの各種リソースを定義するファイル
その他操作
Podの中のコンテナにbashでログインしたい
kubectl exec -it ${pod名} -c ${コンテナ名} /bin/bash
ログオフするときは exit
する
exit
困ったこと
chap6.6
ingress でサービスを公開しようとしても、ingressのエラーメッセージは「Some backend services are in UNHEALTHY state」となってつながらない。
サービスにもEXTERNAL-IPが振られていないので、何か問題が発生しているんだけど、わからない。(知っている方教えてください...)
$kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.55.240.1 <none> 443/TCP 16m mysql-master ClusterIP None <none> 3306/TCP 14m mysql-slave ClusterIP None <none> 3306/TCP 14m todoapi ClusterIP 10.55.240.162 <none> 80/TCP 13m todoweb NodePort 10.55.244.187 <none> 80:32516/TCP 13m
所感
Kubernetesは、Googleのコンテナ運用で得られた知見を元にしたソフトウェアサービスであるということから、コンテナ運用に精通しないとなかなかメリットを感じにくいかな...と感じた。Kubernetesの前身はBorgというソフトウェアがベースになっている。サービスが高度に抽象化されているので、なれるまでは障害調査などもつらそう。なかなか勘所がつかみにくそう。
参考
- Docker / Kubernetes 実践コンテナ開発入門