Johnman.md

プログラミングのことや個人的なことを書きます。たぶん。

Learn Kubernetes Basics 終えた【Scale Your App】

Kubernetesチュートリアル Learn Kubernetes Basics を一通りやったので、軽くメモした内容を書いておきます。

前回の記事はこれ。

johnmanjiro13.hatenablog.com

Scale Your App

ここでは次のことを学ぶ。

  • kubectl を使ったアプリケーションのスケーリング

Scaling an application

今までのチュートリアルでは、Pod は一つだけだった。しかし、実際にサービスとして運用する際にトラフィックが増えると、ユーザーの需要に対応するためにアプリケーションを拡張する必要がある。

スケーリングとは、配置内のレプリカの数を変更すること。

Scaling overflow

Deployment をスケールアウトすると、新しい Pod が作成され、使用可能なリソースを持つ Node にスケジュールされる。スケーリングすると、Pod の数が増えて期待する状態になる。Kubernetes も Pod の自動スケーリングをサポートしているが、チュートリアルの範囲外らしい。

プリケーションの複数のインスタンスを実行するには、トラフィックをそれらすべてに分散させる方法が必要になる。そのために、公開された全ての Pod にはネットワークトラフィックを分散する統合ロードバランサがある。サービスはエンドポイントを使用して実行中の Pod を継続的に監視し、トラフィックが使用可能な Pod にのみ送信されるようにする。

アプリケーションの複数のインスタンスを実行すると、ダウンタイムなしでローリングアップデートを実行できる。これは次の記事で。

Learn Kubernetes Basics 終えた【Expose Your App Publicly】

Kubernetesチュートリアル Learn Kubernetes Basics を一通りやったので、軽くメモした内容を書いておきます。

前回の記事はこれ。

johnmanjiro13.hatenablog.com

Expose Your App Publicly

ここでは次のことを学ぶ。

  • Kubernetes の Service について
  • Label と LabelSelecter オブジェクトがどのように関連しているか
  • Service を使ってアプリケーションを Kubernetes Cluster の外に公開する方法

Overview of Kubernetes Services

同じ Kubernetes Cluster の中でも Pods はそれぞれ一意の IP アドレスをもっていて、それらの IP アドレスは公開されていない。なので外部からアクセスすることができないが、Service が外から見えるように公開してくれる。

Kubernetesの Service は、Pod の論理セットとそれらにアクセスするためのポリシーを定義するもの。Service によって依存ポッド間の疎結合が可能になる。サービスは、すべての Kubernetes オブジェクトと同様に、YAML または JSON を使用して定義される。Service がターゲットとする Pod のセットは通常 LabelSelector によって決定される。

ServiceSpec で type を指定することによって、いろいろな方法で公開できる。

  • ClusterIP(default) : クラスタ内の IP アドレスで公開する(外部からは見えない)。サービスは Cluster 内からのみ到達可能。
  • NodePort : NAT を使用して、Cluster 内の選択された Node の同じポートにサービスを公開する。<NodeIP> : <NodePort> を使用して Cluster の外部からサービスにアクセスできるようにする。
  • LoadBalancer : (サポートされている場合)現在のクラウドに外部ロードバランサを作成し、固定の外部 IP をサービスに割り当てる。
  • ExternalName : 名前を持つ CNAME レコードを返すことで、任意の名前(Spec の externalName で指定する)を使用してサービスを公開する。プロキシは使用されない。この Type には v1.7 以上の kube-dn が必要。

Services and Labels

Service は、Label と LabelSelectorを使用して、Pod を特定できる。 Label はオブジェクトに付けられたキーと値のペアであり、さまざまな方法で使用できる。

  • 開発、テスト、および制作用のオブジェクトを指定する
  • バージョンタグを埋め込む
  • タグを使用してオブジェクトを分類する

Learn Kubernetes Basics 終えた【Explore Your App】

Kubernetesチュートリアル Learn Kubernetes Basics を一通りやったので、軽くメモした内容を書いておきます。

前回の記事はこれ。

johnmanjiro13.hatenablog.com

Explore Your App

ここでは次のことを学ぶ。

Kubernetes Pods

  • Kubernetes での最小単位
  • 複数のコンテナのまとまり
  • たとえば、Node.js アプリケーションのコンテナと、Node.js Web サーバによって公開される別のコンテナの両方を含めることができる
  • Pod 内のコンテナは IP アドレスとポート番号を共有し、常に同じ場所に配置され、同じスケジュールに入れられ、同じノード上の共有コンテキストで動作する

前回の記事で書いた Deployment は直接コンテナを作成するのではなく、コンテナを内部にもった Pods を作成する。ノードに障害が発生した場合は、同じ Pod が Cluster 内の他の使用可能なノードにスケジュールされる。

Kubernetes Nodes

  • 前述した Pod はすべて Node の上で動く
  • Node は複数 Pod をもち、master は Cluster 内の Node 間で Pod のスケジュールを自動的に処理する
  • すべての Node は最低でも以下を実行する
    • kubelet : Kubernetes master と Node 間で通信をするプロセス。マシン上で動作している Pod とコンテナを管理する。
    • Container runtime (like docker, rkt) : コンテナイメージを pull し、解凍し、アプリケーションを実行する。

Troubleshooting with kubectl

デプロイされたアプリケーションやその環境の情報を取得するコマンド一覧。

  • kubectl get : リソースのリストを取得
  • kubectl describe : リソースの詳細情報を表示
  • kubectl logs : Pod 内のコンテナのログを表示
  • kubectl exec : Pod 内のコンテナでコマンドを実行

Pod 内にコンテナが1つしかない場合、コンテナ名を省略できる。

kubectl めちゃくちゃ便利ですね。

Learn Kubernetes Basics 終えた【Deploy an App】

Kubernetesチュートリアル Learn Kubernetes Basics を一通りやったので、軽くメモした内容を書いておきます。

前回の記事はこれ。

johnmanjiro13.hatenablog.com

Deploy an App

ここでは次のことを学ぶ。

  • kubectl を使ったアプリケーションのデプロイ

シンプルですね。

Deployment

Kubernetes Cluster を準備したら、コンテナ化されたアプリケーションを Cluster 上にデプロイできる。

このデプロイ、ローリングアップデートなどを管理するのがDeployment。 デプロイされたインスタンスが停止・削除された場合には、Deployment Controller が同一 Cluster 内の別のノード上のインスタンスに置き換えてくれる。

デプロイの流れ

  1. アプリケーションのインスタンスを実行できる適切なノードを探す(利用可能なノードは1つだけ)
  2. ノード上でアプリケーションを動かすようスケジュールする
  3. 必要な場合は新しいノードでインスタンスを再スケジュールするようクラスタを設定する

各コマンド

  • kubectl run

    • Kubernetes 上でアプリを動かす
    • deployment name と Docker Hub の image location が必要
    • 必要に応じて port も設定する
  • kubectl get deployments

アプリケーションは Kubernetes 内で動いていて、同じ Cluster 内の Pod や Service からは見えるが、外からは見えない。kubectl を使えば、APIエンドポイントを通して公開することができる。

  • kubectl proxy
    • 通信をクラスタ全体のプライベートネットワークに転送するプロキシを作れる
    • (今回のチュートリアルでは)curl http://localhost:8001/version で叩ける
    • APIサーバは Pod 名に基づいてそれぞれの Pod で自動的にエンドポイントをつくる。これもプロキシ経由でアクセス可能

この結果、アプリケーションを Kubernetes 上にデプロイして公開し、curl で叩くところまでできるようになります。

Learn Kubernetes Basics 終えた【Creating a Cluster】

Kubernetesチュートリアル Learn Kubernetes Basics を一通りやったので、軽くメモした内容を書いておきます。

Creating a Cluster

ここでは次のことを学ぶ。

Kubernetes Cluster

Kubernetes の基本構造。
Cluster は Master とそれ以外の Nodeから成り、各 Node は Node processes (Kubelet) を持つ。

Kubelet は、各 Node を管理し、Masterと通信するためのもの。また、Node は Docker や rkt などのコンテナ操作用のツールも持つ。トラフィックを処理する Kubernetes Cluster には、最低3つのノードが必要。

Minikube

Linux 仮想マシンを立ち上げて、そこで Kubernetes クラスタを動作させてくれる。Kubernetes Basics ではこの Minikube を使ってチュートリアルを進めていく。

  • minikube version : Minikube のバージョンを確認する。
  • minikube start : Cluster をスタートする。

kubectl

Kubernetes を扱うためのコマンド。このコマンドを使うと Cluster の作成から Rollout まであらゆることができる。

  • kubectl version : バージョンを確認するコマンド。表示される内容には server versionclient version がある。server version はサーバー上の Kubernetes のバージョンで、 client version は kubectl のバージョン。
  • kubectl cluster-info : Cluster の情報を表示する。チュートリアルでは Kubernetes master と KubeDNS が動いているはず。
  • kubectl get nodes : Cluster 上のノードの一覧を表示する。ここで表示される STATUSReady になっていたら、アプリケーションを受け入れる準備ができている。