第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児のパパ。