こんにちは、Mashです。
本記事は、近年大注目されているコンテナオーケストレーション技術である Kubernetes について、図解と実機確認例を交えて解説するシリーズとなります。
今回は第3回。K8s環境でのコンテナ展開方法についてご紹介します。
もしまだK8sの検証環境をお持ちでないかたは、前回記事を参考にしてみてください。
- Kubernetesのコンテナリソースである「Pod」を理解する
- Podを展開するYAMLファイルを作成できるようになる
※本シリーズはLinuxコマンドやネットワーク、Dockerの基礎知識がある方を前提としています。
それではいきましょう!
環境
私の検証環境はこのようになっています。
- 検証環境はUbuntu Server 20.04 LTSのサーバ1台構成(MasterとNodeを兼任)
- 検証マシンへSSH接続済み
- kubectlコマンドでK8sクラスタを操作
- ノードがインターネットに接続していること
イメージはこのような状態↓です。

Pod ≒ コンテナ?

K8sを勉強し始めてまずはじめにぶち当たる壁。

Podってなんや。コンテナとなにがちがうん。
こんな感じでKubernetes特有の単語が抽象的な概念としてどんどん登場してきます。
私も初めは何がなにやらでしたが、実は「OS側のなにか」を言い換えているだけだったりするので、それほど難しいものではないことに気づきます。
イメージ図を添えながら説明しますので、ひとつずつしっかり抑えていきましょう。
Podとは
PodはK8sにおける最も小さな管理単位です。
Podには1つ以上のコンテナが含まれ、IPアドレスやポートスペース、そしてボリューム領域を共有します。
イメージはこのような感じ。
「fluentd」はログ収集のソフトウェアのことで、あくまで例として挙げただけなのでここでは気にしなくて大丈夫です。

1Pod1コンテナの場合もあれば、1Podの中に複数種類のコンテナとボリュームを含めることもあります。
ちなみにPodは、えんどう豆の「さや」のことで、まさに複数コンテナを包み込む「さや」をイメージした命名ですね。

K8sでコンテナを扱いたいときには「コンテナ」そのままではなく、「Pod」として扱う必要があるということを覚えておきましょう。
kubectlでPodを作成してみる
それでは実際にPodを作成してみましょう。
今回はPodの中に1つのコンテナを起動するように指定しています。
$ kubectl run --namespace=default --image=mash4work/mash-k8s-nginx:1.0 nginx
各オプションについて説明します。
オプション値 | 説明 |
---|---|
–namespace | K8sにはNamespaceという論理的な区画を作成できるのですが、今回はdefaultという初めから作成されているNamespaceを指定してPodを作成しています。 |
–image | Pod内で起動するコンテナのイメージを定義しています。 今回はわたしが予め用意しておいた少しカスタムしたNginxイメージを指定しています。 |
nginx | Podの名前を定義しています。 ここはお好きな値でかまいません。 |
それではPodが作成できたか確認してみましょう。
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 2m34s 10.42.32.173 k8s-master01 <none> <none>
「nginx」Podが作成されていることが確認できました。
今回サンプルとしてNginxコンテナを立ち上げましたので、HTTPリクエストを投げて稼働確認してみましょう。
さきほど実行した kubectl get pods コマンドでPodのIPアドレスが 10.42.32.173 であることが確認できていますので、コマンドは下記のとおりです。
$ curl http://10.42.32.173/
<p>Hostname of this container is nginx</p>
<p>version 1.0</p>
ちゃんとレスポンスが返ってきました!
迷子にならないように、いまの状態をイメージ図にしておきましょう。
kubectl run コマンドでPodを作成し、curl コマンドでNginxのデフォルトページへアクセスしました。

他にもよく使うコマンドをいくつかご紹介します。
# Podのログを確認
$ kubectl logs nginx
Starting nginx...
Done.
# Podに入り、bashで操作
$ kubectl exec -it nginx -- bash
root@nginx:/# env
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=nginx
(以下略)
root@nginx:/# exit
# Podを削除
$ kubectl delete pods nginx
pod "nginx" deleted
Podを展開するマニフェストを作成する
以上の通りkubectlコマンドを使えばPod作成は行えます。
しかし、第1回でもお伝えしたとおりK8s環境では基本的に手作業による操作ではなく、環境情報を「マニフェスト」でコードとして管理するほうがベターです。
それではさきほど作成したPodをマニフェスト化してみましょう。
YAMLファイルを作成します。
$ vi nginx-pod.yaml
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: mash4work/mash-k8s-nginx:1.0 env: - name: TEST_ENV_VALUE1 value: "01" - name: TEST_ENV_VALUE2 value: "02" ports: - containerPort: 80
さきほど実行したコマンドの内容となんとなく同じであることがおわかりいただけるかなと思います。
- kind で このマニフェストで定義しているリソースの種類を宣言しています(今回はPod)
- metadata でPodリソースのメタデータを定義しています。今回はname属性を使ってPodの名前を宣言しています
- spec がリソースのあるべき姿を宣言するセクションです
Podの場合は、containers属性でコンテナに関する情報を定義します
今回はコンテナ1つだけしか定義していませんが、複数記載することが可能です - そしてコンテナ名、イメージ、環境変数、待受ポートを定義しています
マニフェストからPodを作成してみましょう。
# マニフェストからPodを作成
$ kubectl apply -f nginx-pod.yaml
pod/nginx created
# 状況確認
# STATUSがRunningになっていれば、Pod内のコンテナがすべて正常稼働している
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 50s
# Podに入り、bashで操作
# コンテナの環境変数(env)をチェック
$ kubectl exec -it nginx -- bash
root@nginx:/# env |grep TEST_ENV
TEST_ENV_VALUE1=01
TEST_ENV_VALUE2=02
root@nginx:/# exit
# 次回以降のためPodをお掃除
$ kubectl delete -f nginx-pod.yaml
pod "nginx" deleted
apply サブコマンドでYAMLからリソースを作成することができました!
まとめ
今回はkubectlコマンドとYAMLからPodを作成する方法を学習しました。
なんとなく、「Pod」という概念は理解できましたでしょうか。
ただ、Podひとつひとつを個別で管理することは実運用上ほぼ無く、「Podをいくつ複製しておくか」とか「Podのバージョン管理」などを行う必要があります。
次回はこれらを実現するK8sリソース「ReplicaSet」「Deployment」についてご紹介します。
今回は以上です。
それじゃあまたね。