開発日報

窓際エンジニアの開発備忘。日報は嘘です。

【連載】Kubernates入門・GKEデプロイと発展的利用 第2回 ~ KubernatesクラスタとPod ~

はじめに

この連載ではコンテナオーケストレーションツールである。Kubernatesの使い方を学びます。
今回はKubernatesクラスタの概念と、クラスタを構成する各構成要素について実際に手を動かしながら学んでいきます。

サンプルコード

こちらに順次アップしていきますー。

連載記事一覧

連載記事一覧

KunernatesクラスタとNode

KubernetesクラスタKubernetesの様々なリソースを管理する集合です。 NodeはKubernetesクラスタの管理下に登録されているDockerホストで、Kubernetesでコンテナをデプロイするために利用します。

Kubernetesクラスタには全体を管理するサーバであるMasterが最低1つ配置されています。Kubernetesクラスタは、次のようにMasterとNode群によって構成されます。

f:id:yuuu1993g:20191105224558p:plain

ローカル環境のKubernetesに、VMがNodeの1つとして登録されています。kubectl get nodesコマンドでクラスタに参加しているNodeの一覧を取得してみましょう。

$ kubectl get nodes
NAME             STATUS   ROLES    AGE   VERSION
docker-desktop   Ready    master   36h   v1.14.3

クラウドKubernetesを動作させている場合、GCPにおけるGCE、AWSにおけるEC2インスタンスがNodeとなります。

Namespace

Kubernetesクラスタの中に入れ子となる仮想的なクラスタを作成でき、 これをNamespaceと呼びます。

kubectl get namespace
NAME              STATUS   AGE
default           Active   36h
docker            Active   36h
kube-node-lease   Active   36h
kube-public       Active   36h
kube-system       Active   36h

Pod

Pod(ポッド)は1つ以上のコンテナからなる集合体の単位です。 NginxコンテナとGoアプリケーションコンテナのように複数コンテナをセットでまとめたい場合に使用します。

KubernetesではPod単位でコンテナをまとめてデプロイします。

同じPodを複数のNodeに配置する、1つのNodeに複数Pod配置することも可能です。

f:id:yuuu1993g:20191105230212p:plain

ただし、複数Nodeをまたいで1つのPodを配置することはできません。

f:id:yuuu1993g:20191105230301p:plain

Podを作成してデプロイする

Podを作成してデプロイしてみましょう。simple-pod.yamlを次のように作成します。

サンプルコードの[kuba_basic_sample/simple-pod.yaml]を使用しても良いです。

apiVersion: v1
kind: Pod
metadata:
  name: simple-echo
spec:
  containers:
  - name: nginx
    image: gihyodocker/nginx-proxy:latest
    env:
    - name: BACKEND_HOST
      value: localhost:8080
    ports:
    - containerPort: 80
  - name: echo
    image: gihyodocker/echo:latest
    ports:
    - containerPort: 8080

解説します。ここではnginxとechoアプリケーションをデプロイする設定になっています。

・kind:Kubernetesのリソースの種類を指定。ここではPodを指定 ・metadata:リソースに付与するメタデータ
・spec:リソースを定義
・containers:Podを構成するコンテナ群

env属性で環境変数を列挙できます。nginxはリクエストのプロキシ先であるBACKEND_HOSTが必要なので設定しています。

ではローカルKubernetesクラスタに反映してみましょう。

$ kubectl apply -f simple-pod.yaml
pod/simple-echo created

applyは新規作成もしくは変更があったときだけ反映されます。いずれにしろapplyを利用すると良いでしょう。

Podの操作

Podの状態を確認します。STATUSがRunningならPod内の全コンテナが実行状態になっています。READYの分母はPodに定義されたコンテナ数、分子は実行状態になったコンテナ数です。

$ kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
simple-echo   2/2     Running   0          3m58s

コンテナの中に入ってみます。-cで対象のコンテナ名を指定します。

$ kubectl exec -it simple-echo sh -c nginx
#

Pod内コンテナの標準出力を次のように表示できます。-cでコンテナ名を指定します。

$ kubectl logs -f simple-echo -c echo
2019/11/05 14:17:10 start server

Podを削除するにはkubectl delete podを使います。

 $ kubectl delete pod simple-echo
 pod "simple-echo" deleted

マニフェストファイルベースでPod削除も可能です。マニフェストファイルに記述されているリソース全てが削除されます。

 $ kubectl delete -f simple-pod.yaml

Podと内部コンテナのIPアドレス

Podごとに仮想IPアドレスが割り振られます。 Podに割り振られた仮想IPアドレスは、そのPodに所属するすべてのコンテナと共有されます。同一Pod内の全コンテナの仮想IPは同じであるため、次の図のようなコンテナ間通信をすることができます。

f:id:yuuu1993g:20191105233217p:plain

Podからnginxコンテナの80ポートへはlocalhost:80で、proxyコンテナからechoコンテナの8080ポートへはlocalhost:8080で到達できます。Podに割り当てられた仮想IPを使えば、別のPodへの通信も可能です。

環境変数BACKEND_HOSTに指定すべきなのは、PodのIPアドレス:echoコンテナのポートとなります。

まとめ

今回はKubernatesクラスタとPodの概念と作成を行いました。現時点ではまだ内部のアプリケーションにはアクセスできませんが、次回以降、アクセスできるようにしていきます。

次回はReplicasetとDeploymentについて学習します。