先日、minikubeを使ってKubernetes環境を構築し、テスト用のコンテナを動作させるところまで記事にした。また、自作のDockerコンテナイメージを動作させることも成功した。
今までは、毎回kubectl
のコマンドを使ってPodやServiceリソースの作成を行っていたが、毎回手作業となるため効率が悪い。そこで今回は、「マニフェストファイル」を作成してコンテナの作成をしたいと思う。
本記事では、minikubeで構築したKubernetes環境にて、マニフェストファイルを使ってPodとServiceを作成する手順を記載する。
環境
以下に今回構築する各種ソフトウェアのバージョンを記載する。
- ホストOS : AlmaLinux 8.6 (GUI環境を含めインストールする)
- ホストDocker : 20.10.21
- minikube : 1.28.0
また、Dockerコンテナレジストリとして、Harborを用いている。Harborについては、以下記事を参照いただきたい。
以下にminikubeの環境の構成概要図を記載する。
マニフェストファイルの作成
Pod作成用とService作成用の2つのマニフェストファイルを作成する。マニフェストファイルでは、各リソースの名前やラベルなどを設定し、関連付けを行うが、同じような名前が複数個所に記載されるため、簡単に図示したものも記載しておく。
deployment_squid_harbor.yml
以下にマニフェストファイルの設定項目を記載する。
設定項目 | 説明 |
---|---|
.apiVersion | kindで指定するリソースに対して、kubectl api-resources で確認したバージョンを指定する。今回はkindはDeploymentなので、apps/v1 となる。 |
.kind | リソースを指定する。Node、Pod、Service、Deploymentなどを指定する。 |
.metadata.name | Deplymentリソース名を設定する。 |
.metadata.labels | Deplymentリソースのラベルを設定する。 |
.metadata.namespace | リソースを作成するnamespaceを指定する。 |
.spec.replicas | 起動するPodの数を設定する。今回は3に設定しているため、3つのPodが起動する。 |
.spec.selector | 作成するPodのテンプレートのラベルを指定する。matchlabels に記載したラベルを持つテンプレートがPodとして作成される。 |
.spec.template | アプリケーションのテンプレートを設定する。 |
.spec.template.metadata | テンプレートのラベルを設定する。 |
.spec.template.spec | テンプレートの具体的な設定を記載する。今回の場合はコンテナとなるためcontainers を指定する。 |
.spec.template.spec.containers.name | テンプレート名を設定する。 |
.spec.template.spec.containers.image | Harbor上のコンテナイメージを指定している。Harborの場合は、"[HarbotのIPアドレス]/[プロジェクト名]/[イメージ名]:[タグ]"となる |
.spec.template.spec.containers.imagePullPolicy | Pod起動時にコンテナレジストリからPullする際の動作を指定する。ざっくりな説明となるが、Alyways の場合は常にコンテナレジストリに対して問い合わせをし、IfNotPresent の場合はローカルに対象のイメージがない場合のみ問い合わせを行う。Never の場合は常にローカルのイメージを検索し、コンテナレジストリに対して問い合わせを行わない。 |
以下に実際のマニフェストファイルを記載する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: almalinux-squid-deployment
labels:
app: almalinux-squid-deployment
namespace: mynamespace
spec:
replicas: 3
selector:
matchLabels:
app: almalinux-squid
template:
metadata:
labels:
app: almalinux-squid
spec:
containers:
- name: almalinux-squid
image: 192.168.11.54/myproject/almalinux-squid:8.7
imagePullPolicy: Always
service_squid_harbor.yml
以下にマニフェストファイルの設定項目を記載する。
設定項目 | 説明 |
---|---|
.apiVersion | kindで指定するリソースに対して、kubectl api-resources で確認したバージョンを指定する。今回はkindはServiceなので、v1 となる。 |
.kind | リソースを指定する。Node、Pod、Service、Deploymentなどを指定する。 |
.metadata.name | Serviceリソース名を設定する。 |
.metadata.labels | Serviceリソースのラベルを設定する。 |
.metadata.namespace | リソースを作成するnamespaceを指定する。 |
.spec.selector | Serviceリソースに対して紐づけるアプリケーションのラベルを指定する。こちらはDeploymentと異なり、matchlabels は不要(使用不可)となる。 |
.spec.ports | Serviceリソースのポート番号を指定する。 |
.spec.type | Serviceリソースのタイプを指定する。NodePort、ClusterIP、LoadBalancerなどを指定する。今回はNodePortを指定し、Nodeが持つIPアドレスをアクセス先として設定する。 |
以下に実際のマニフェストファイルを記載する。
apiVersion: v1
kind: Service
metadata:
name: almalinux-squid-service
labels:
app: almalinux-squid-service
namespace: mynamespace
spec:
selector:
app: almalinux-squid
ports:
- port: 8080
type: NodePort
マニフェストファイルを使用したリソースの作成手順
1. minikubeを起動
コンテナレジストリへは通常HTTPSでなければ接続できない。今回、接続先のHarborはHTTPのみ通信可能な設定となっていることから、一度minikube環境を削除し、minikubeを再度起動させる際にinsecure-registry
のオプションを指定し接続できるよう設定を行う。
$ minikube delete
$ minikube start --insecure-registry=192.168.11.54
2. namespaceの作成
先ほど作成したマニフェストファイルを適用し、Podを作成してみよう。
今回のPodやServiceリソースを作成するためのnamespaceとして、「mynamespace」を作成する。
$ kubectl create namespace mynamespace
namespace/mynamespace created
$ kubectl get namespace
NAME STATUS AGE
default Active 63d
kube-node-lease Active 63d
kube-public Active 63d
kube-system Active 63d
mynamespace Active 6s
3. マニフェストファイルを適用しPodを作成
マニフェストファイルの適用は、kubectl apply
で実施する。まずは、Podを作成してみよう。
$ kubectl apply -f ./deployment_squid_harbor.yml
deployment.apps/almalinux-squid-deployment created
Podの作成状況を確認すると以下の通り。
$ kubectl get pod -n=mynamespace
NAME READY STATUS RESTARTS AGE
almalinux-squid-76666ccf5c-kwkfb 1/1 Running 0 12s
almalinux-squid-76666ccf5c-p5pqt 1/1 Running 0 12s
almalinux-squid-76666ccf5c-qv744 1/1 Running 0 12s
4. Serviceリソースの作成
Pod作成と同じくkubectl apply
を実行し、Serviceリソースを作成する。
$ kubectl apply -f ./service_squid_harbor.yml
service/almalinux-squid-service created
Serviceリソースの作成状況を確認すると以下の通り。
$ kubectl get service -n=mynamespace
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
almalinux-squid-service NodePort 10.97.104.134 <none> 8080:30647/TCP 11s
以上で、minikubeで構築したKubernetes環境にて、マニフェストファイルを使ってPodとServiceを作成する手順は完了となる。
マニフェストファイルを使用したリソースの削除手順
マニフェストファイルを使用したリソースの作成手順に加え、リソースの削除についても記載する。
といっても、リソースの削除はkubectl delete
コマンドを使えば簡単にできる。
$ kubectl get pod,service -n=mynamespace
NAME READY STATUS RESTARTS AGE
pod/almalinux-squid-76666ccf5c-kwkfb 1/1 Running 0 62m
pod/almalinux-squid-76666ccf5c-p5pqt 1/1 Running 0 62m
pod/almalinux-squid-76666ccf5c-qv744 1/1 Running 0 62m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/almalinux-squid-service NodePort 10.97.104.134 <none> 8080:30647/TCP 3m29s
$ kubectl delete -f ./service_squid_harbor.yml
service "almalinux-squid-service" deleted
$ kubectl delete -f ./deployment_squid_harbor.yml
deployment.apps "almalinux-squid-deployment" deleted
$ kubectl get pod,service -n=mynamespace
NAME READY STATUS RESTARTS AGE
pod/almalinux-squid-76666ccf5c-kwkfb 1/1 Terminating 0 63m
pod/almalinux-squid-76666ccf5c-p5pqt 1/1 Terminating 0 63m
pod/almalinux-squid-76666ccf5c-qv744 1/1 Terminating 0 63m
$ kubectl get pod,service -n=mynamespace
No resources found in mynamespace namespace.
以上で、マニフェストファイルを使用してKubernetesのリソースの作成・削除を実施することができた。
0 件のコメント:
コメントを投稿