はじめに
この連載ではコンテナオーケストレーションツールである。Kubernatesの使い方を学びます。
今回はKubernatesクラスタの概念と、クラスタを構成する各構成要素について実際に手を動かしながら学んでいきます。
サンプルコード
こちらに順次アップしていきますー。
連載記事一覧
KunernatesクラスタとNode
KubernetesクラスタはKubernetesの様々なリソースを管理する集合です。 NodeはKubernetesのクラスタの管理下に登録されているDockerホストで、Kubernetesでコンテナをデプロイするために利用します。
Kubernetesクラスタには全体を管理するサーバであるMasterが最低1つ配置されています。Kubernetesクラスタは、次のようにMasterとNode群によって構成されます。
ローカル環境の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配置することも可能です。
ただし、複数Nodeをまたいで1つのPodを配置することはできません。
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は同じであるため、次の図のようなコンテナ間通信をすることができます。
Podからnginxコンテナの80ポートへはlocalhost:80で、proxyコンテナからechoコンテナの8080ポートへはlocalhost:8080で到達できます。Podに割り当てられた仮想IPを使えば、別のPodへの通信も可能です。
環境変数BACKEND_HOSTに指定すべきなのは、PodのIPアドレス:echoコンテナのポートとなります。
まとめ
今回はKubernatesクラスタとPodの概念と作成を行いました。現時点ではまだ内部のアプリケーションにはアクセスできませんが、次回以降、アクセスできるようにしていきます。
次回はReplicasetとDeploymentについて学習します。