技術メモ

技術メモ

ラフなメモ

Kubernetes入門(Docker / Kubernetes 実践コンテナ開発入門)

Kubernetes入門

Kubernetes の概念

リソース

  • Kubernetesクラスタ

    • Kubernetesの様々なリソースを管理する集合体
    • Masterが少なくとも1つは配置される
  • Node

    • Kubernetesクラスタ管理下に登録されているコンテナホスト(コンテナにDockerを使用していればDockerホスト)
    • Kubernetesでコンテナをデプロイするために利用される
    • kubectl get nodes でnodeの一覧が取得できる
  • Namespace

    • クラスタの中に仮想的なクラスタを作成できる
    • kubectl get namespace で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

  • Ingress

    • Kubernetesクラスタの外にServiceを公開するためにはServiceをNodePortで公開することで可能
      • L4レイヤ
    • L7(例えばHTTP/HTTPS)での制御するときに利用するリソース
    • ServiceのKubernetes外への公開とVirtualHostやパスベースでの高度なHTTPルーティングを両立する
    • HTTP/HTTPSベースのサービスを公開する場合はIngressを利用することになる
  • PersistentVolume/PersistentVolumeClaim

    • ストレージの確保する方法
    • PersistentVolume
      • ストレージの実体
    • PersistentVolumeClaim
      • ストレージを論理的に抽象化したリソース
      • PersistentVolumeと比較して動的に容量を確保することが可能
  • StorageClass

    • PersistentVolumeが確保するストレージの種類を定義できるリソース
    • GCPのストレージには標準とSSDが存在する
  • StatefulSet

    • DeploymentはPod仕様に基づきPodを作成するリソース
    • StatefulSetは永続化データを持つステートフルなアプリケーション管理に向いている

用語

その他操作

Podの中のコンテナにbashでログインしたい

kubectl exec -it ${pod名} -c ${コンテナ名} /bin/bash

ログオフするときは exit する

exit

困ったこと

chap6.6

ingress でサービスを公開しようとしても、ingressのエラーメッセージは「Some backend services are in UNHEALTHY state」となってつながらない。

f:id:tutuz:20190303172012p:plain

サービスにも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 実践コンテナ開発入門