第1回において説明しましたが、Kuebernetesの基本はPod/ReplicaSet/Deployment/Serviceの4つのリソースです。今回は実際に構築することにより、以下のアーキテクチャの理解をより深めていきましょう。

Kubernetesのアーキテクチャの基本(第1回の再掲)

今回は単純化のために、サイドカーパターンは適用せず、各Podにおけるnginxとwebは一つに取りまとめています。サイドカーパターンなどコンテナ配置のデザインパターンについて興味のある方は、Design patterns for container-based distributed systemsを読んでみると良いでしょう。

Pod/ReplicaSet/Deployment/Service(第1回の再掲)

Pod、ReplicaSet、Deployment、Serviceを作ってみる

以下の2つの設定ファイル[deploy_node.yaml]、[service_node.yaml]を使ってPod、ReplicaSet、Deployment、Serviceを作ってみましょう。

第2回をご参照ください。

$vi deploy_node.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-deployment
  labels:
    app: hello-pod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-pod
  template:
    metadata:
      labels:
        app: hello-pod
    spec:
      containers:
      - name: hello
        image: hello-node:v1 # 後ほどここをv2に差し替え
        ports:
        - containerPort: 8080

$kubectl apply -f deploy_node.yaml --record

$vi service_node.yaml
apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  selector:
    app: hello-pod
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 8080

$kubectl apply -f service_node.yaml

構築が終わったところで、Pod、ReplicaSet、Deployment、Serviceそれぞれの状態を確認してみましょう。なお、[replicas]に3と指定したので、Podが3つ生成されています。

$kubectl get pods,replicasets,deployments,services
NAME                               READY     STATUS    RESTARTS   AGE
pod/hello-deploy-bf8bf85c8-lspqq   1/1       Running   0          56s
pod/hello-deploy-bf8bf85c8-rsbk8   1/1       Running   0          56s
pod/hello-deploy-bf8bf85c8-wdp5s   1/1       Running   0          56s

NAME                                           DESIRED   CURRENT   READY     AGE
replicaset.extensions/hello-deploy-bf8bf85c8   3         3         3         56s

NAME                                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/hello-deploy   3         3         3            3           56s

NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/hello-service   NodePort    10.104.62.10   <none>        80:30111/TCP   56s
service/kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP        20h

$curl http://localhost:30111/
Hello node World!$

ReplicaSetとDeploymentが3つずつ生成されており、違いがわからないと感じた方もいらっしゃるかもしれません。これらの違いはアプリケーションのバージョンアップの際に表れます。アプリケーションのバージョンごとにReplicaSetが生成されるのに対し、Deploymentは複数バージョンで共通して生成されます。

前回作成したDockerイメージのソースの出力部分を「Hello Node World! v2」と書き換え、hello-node:v2として作成した上で、先ほどの[deploy_node.yaml]の[image: hello-node:v1]の部分を[image: hello-node:v2]に差し替えて適用してみましょう。v2適用直後はReplicasetがv1、v2両方起動しているのに対し、一定時間後にはv2のみに差し替わっています。

$kubectl apply -f deploy_node_v2.yaml --record
deployment.apps/hello-deploy configured
$kubectl get pods,replicasets,deployments,services
NAME                                READY     STATUS              RESTARTS   AGE
pod/hello-deploy-7df74598c5-c8pq8   0/1       ContainerCreating   0          2s
pod/hello-deploy-7df74598c5-flj6m   1/1       Running             0          6s
pod/hello-deploy-7df74598c5-vtrt4   1/1       Running             0          4s
pod/hello-deploy-bf8bf85c8-g8zsr    1/1       Running             0          36s
pod/hello-deploy-bf8bf85c8-jmxdr    1/1       Terminating         0          36s
pod/hello-deploy-bf8bf85c8-kn4td    1/1       Terminating         0          36s

NAME                                            DESIRED   CURRENT   READY     AGE
replicaset.extensions/hello-deploy-7df74598c5   3         3         2         6s
replicaset.extensions/hello-deploy-bf8bf85c8    1         1         1         36s

NAME                                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/hello-deploy   3         4         3            3           36s

$kubectl get pods,replicasets,deployments
NAME                                READY     STATUS        RESTARTS   AGE
pod/hello-deploy-7df74598c5-c8pq8   1/1       Running       0          8s
pod/hello-deploy-7df74598c5-flj6m   1/1       Running       0          12s
pod/hello-deploy-7df74598c5-vtrt4   1/1       Running       0          10s
pod/hello-deploy-bf8bf85c8-g8zsr    1/1       Terminating   0          42s
pod/hello-deploy-bf8bf85c8-jmxdr    1/1       Terminating   0          42s
pod/hello-deploy-bf8bf85c8-kn4td    1/1       Terminating   0          42s

NAME                                            DESIRED   CURRENT   READY     AGE
replicaset.extensions/hello-deploy-7df74598c5   3         3         3         12s
replicaset.extensions/hello-deploy-bf8bf85c8    0         0         0         42s

NAME                                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/hello-deploy   3         3         3            3           42s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1            443/TCP   20h

$kubectl rollout history deployment hello-deploy
deployments "hello-deploy"
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deploy_node.yaml --record=true
2         kubectl apply --filename=deploy_node_v2.yaml --record=true

$curl http://localhost:30111/
Hello Node World! v2$

*  *  *

Kubernetesの代表的なリソースであるPod/ReplicaSet/Deployment/Serviceを使って仮想環境を構築しました。

Kubernetesの最小単位であるPod、冗長化し可用性確保のためのReplicaSet、無停止リリースを実現するDeployment、外部からのアクセスのロードバランスなどの制御を行うServiceサービス。これらを組み合わせて一つのシステムを構築します。

次回はリソースの種類について体系的に解説します。

著者紹介


正野 勇嗣 (SHONO Yuji ) - NTTデータ 課長

2011年まで開発自動化技術のR&Dに従事。その後、開発プロジェクト支援やトラブルシューティング等に主戦場を移す。「ソースコード自動生成」に加えて、JenkinsやMaven等の「ビルド自動化」、JsTestDriverやSelenium等の「テスト自動化」を扱うようになり、多様化する開発自動化技術動向に興味。

最近は第四の自動化であるInfrastructure as Code等の「基盤自動化」の魅力に惹かれている。開発自動化技術に関する雑誌・記事執筆も行う。3児のパパ。