Kubernetesのマニフェスト(Manifest)ファイルによってNginxを起動させてみます。
関連ページ
関連ページでは、下記のkubectlコマンドによってNginxを起動させましたが、本記事ではマニフェストファイルによって同様の事をおこなってみます。
1 |
kubectl run testnginx --image nginx |
1 |
kubectl expose deployment testnginx --port 80 --type NodePort |
リソースとマニフェストファイルについて
Kubernetesのリソースとマニフェストファイルについて簡単にまとめておきます。
Kubernetesのリソースとは、コンテナ(とりわけDockerコンテナ)によるアプリケーションを構成するいわゆる “部品” としての総称です。例えばPodに対するポート番号や負荷分散などのネットワークの設定は、ServiceやIngressと呼ばれるリソースによって定義していきます。
そして、それらリソースをどのように構成してKubernetesクラスタとしてのアプリケーションをデプロイしていくのかを定義したものがマニフェストファイルです。つまり、リソースの構成をテキストファイルで記述したのがマニフェストファイルです。そもそもKubernetesクラスタ内のリソースはすべてRESTfulとして表示されるようになっています。
マニフェストファイルによってKubernetesクラスタを形成する様子を簡略化したのが下記イラストです。実際にはマスターノードにはクラスタの構成を保存するデータストア(etcd)やクラスタの状態を監視するController Managerなどのコンポーネント、そしてノード側にはAPI Serverと接続するkubeletなどがありますが本記事では説明しません。
以下は本記事で利用する主なリソースです。
Deploymentリソース
ざっくりと表現すれば、Deploymentはアプリケーションのスケーリングやバージョンを管理するリソースです。具体的には「クラスタ内のPodを管理するReplicaSetリソース」を管理します。DeploymentリソースからReplicaSetおよびPodが自動的に作成されます。つまり上述したkubectl runは、このDeploymentとReplicaSet、そしてPodを作成するコマンドです。このDeploymentを利用した管理方法については本記事では説明しませんが、このリソースを利用してNginxコンテナを起動させるマニフェストファイルを作成します。
Serviceリソース
Kubernetesのネットワークの定義をおこなうリソースです。ClusterIP、LoadBalancer、NodePortなどの種類があります。このService以外にもネットワークを扱うリソースとしてIngressがあります。
マニフェストファイルの作成
nginx.yamlという名前のマニフェストファイルを作成しました。DeploymentとServiceによるリソースで構成したマニフェストファイルです。をクリックしてコードを別ウィンドウで開くと、説明と同時に確認しやすくなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
apiVersion: apps/v1 #APIのバージョン kind: Deployment #リソースの種類 metadata: name: test-nginx #名前を付ける spec: selector: #どのPodを起動するか matchLabels: app: nginx #テンプレートを指定 replicas: 3 #レプリカ数(Podの数) template: #作成されるPodのテンプレート metadata: labels: app: nginx #Labelを付ける spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 #ポート番号 --- apiVersion: v1 kind: Service metadata: name: test-service spec: type: NodePort ports: - port: 80 nodePort: 30000 #30000~32767の間で指定 selector: #下記のLabel(ラベル)を指定したPodに伝送 app: nginx |
2行目、22行目
kindにはリソースの種類を設定します。上記マニフェストファイルは、DeploymentおよびServiceで構成したアプリケーションとしてデプロイされます。
9行目
replicasにはクラスタ内に起動させておくPodの数を指定します。この数に合わせて設定されたPod(10行目〜のテンプレート)が起動します。
5行目、14行目、25行目
specにはそれぞれのリソースの種類によって様々な設定項目があります。
20行目
— によってリソースが分けられていますが、ファイル自体を分離しそれぞれのファイルに対してkubectl create(後述)することも可能です。
26行目
Serviceリソースにおけるspecのtypeで、Podに対してクラスタ外部からアクセスするためのNodePortを指定しています。
27〜31行目
30000ポートから接続すると、selectorに指定したapp=nginxというキーと値を持つLabel(ラベル)を指定したPodに伝送されます(上記では12、13行目)。このLabelはリソースをグループ化する機能を持っています。Kubernetesクラスタ内でリソースが増えた場合などに役立ちます。
本記事ではKubernetesクラスタを構成するいくつかのリソースを簡単に説明しましたが、他にもたくさんのリソースが存在します。それらリソースにはどのような機能があり、またリソース同士をどう構成していくのかを学んでいくのがKubernetesの本質です。
デプロイ
実際に上記で作成したマニフェストファイルをデプロイしてみます。
1 |
kubectl create -f nginx.yaml |
Kubernetes APIサーバーにマニフェストファイルが送信されます。
以上で「http://localhost:30000/」にて「Welcome to nginx!」が確認できます。
作成されたPodの一覧を表示させます。poはpodsの略称です。
1 2 3 4 5 6 |
kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE test-nginx-64ff85b579-s54hc 1/1 Running 0 1m 10.1.0.63 docker-for-desktop test-nginx-64ff85b579-sft5d 1/1 Running 0 1m 10.1.0.61 docker-for-desktop test-nginx-64ff85b579-zdmrp 1/1 Running 0 1m 10.1.0.62 docker-for-desktop |
レプリカ数を3に設定したので3つのPodが確認できます。-o wide を付加するとIPとNODE項目も表示されます。また上述したようにKubernetesクラスタはRESTfulで表示可能なので、-o jsonおよび-o yamlを付加するとそれぞれのデータ形式で確認することができます。
作成したPodを削除します。
1 |
kubectl delete -f nginx.yaml |
参照文献