2023年2月25日土曜日

minikubeで構築したKubernetes環境にて、マニフェストファイルを使ってPodとServiceを作成する

先日、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 件のコメント:

コメントを投稿

人気の投稿