このブログを検索

この記事の内容は、個人の見解、検証の範囲のものであり、誤りがある可能性があります。
個人の責任において情報活用をお願いします。


2021年8月31日火曜日

俺とkubernetesと時々vSphere -作ってみよう、PodとService-

このブログは、コンテナのオーケストレーターであるkubernetesについて

自分の知識をまとめることを目的として記事を書いています。

もともとなが~くvSphereのあれやこれやに携わってきたのでvSphereとの類似点や相違点についてもちょっと混ぜていけたりしたらいいかなぁとかも思っています。


今回は前回説明した、Pod、Service、Podへ外部ストレージ領域の追加を実際にどうやったらいいのかという説明をしたいと思います。

まずはPodとServiceについて解説します。


Kubernetesクラスタ内部で何かを作成するとき、コマンドラインでの作成も一応できるのですが基本はymalファイルというものを使います。

yamlファイルとはなにかというと、これから作りたいものの設計図です。


yamlには大きく分けて4つのセクションがあり、それぞれ以下のような役割を持ちます。


  apiVersion:リソース作成時に使用するAPIのバージョンの設定

  kind:どの種類のリソース(Pod、Service等)を作成するかの設定

  metadata:リソースを一意にするための設定(名前、namespace、UID等が該当)

  spec:リソースの状態を設定(Podなら開放するportやCPU、メモリのサイズ等)


実際のPod、Serviceのyamlの例を見てみましょう。

Pod用ymalファイルの例

==========

---

kind: Pod

apiVersion: v1

metadata:

  name: nginx-pod

  labels:

    app: wcp-demo

spec:

  containers:

  - image: nginx

    name: nginx-container

==========

Kind → Podを作成するのでPodを記載

apiVersion → Podが所属しているAPIがv1であるため、v1を記載

metadata → nameには一意となる名前を設定、labelsにはPodに付与するラベル(app: wcp-demo)を設定

spec → containersはコンテナに関する設定を行うフィールド

        imageで作成するコンテナのイメージを指定、nameにはコンテナの名前を設定


Service用ymalファイルの例

==========

---

kind: Service

apiVersion: v1

metadata:

  name: nginx-svc

spec:

  type: NodePort

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

  selector:

    app: wcp-demo


Kind → Serviceを作成するのでServiceを記載

apiVersion → Serviceが所属しているAPIがv1であるため、v1を記載

metadata → nameには一意となる名前を設定

spec → typeで作成するServiceのタイプを設定

           ※ここでは、クラスタのノード全てでアクセスを受け取れるNodePortを指定

        portsはポートに関する設定を行うフィールド

        portはportからtargetPortへのマッピングを行います。利便性のため基本的にはtargetPortと同じ値を入れます。

        protocolは使用する通信のプロトコルを指定

        targetPortはコンテナに転送するportを指定

        selectorは一致するラベルを持ったPodを探し転送先として認識します。

==========


このようなyamlを用意するわけですが、どのようにこのファイルからPodやServiceを作成するのかというと

以下のコマンドを使用します。


  kubectl apply -f <yamlファイルまでのパス>


ここではAdministratorのデスクトップに配置したyamlを使用して実行した例を紹介します。


■Podの作成

  PS C:\Users\Administrator> kubectl apply -f "C:\Users\Administrator\Desktop\nginx-pod.yml"

  pod/nginx-pod created


■Serviceの作成

  PS C:\Users\Administrator> kubectl apply -f "C:\Users\Administrator\Desktop\nginx-pod-svc.yml"

  service/nginx-svc created


作成したPodとServiceはkubectl get <確認したいリソース> で確認可能です。

複数のリソースを確認したい場合は、「,」で区切ります。


■Podの確認

  kubectl get pod

  NAME        READY   STATUS    RESTARTS   AGE

  nginx-pod   1/1     Running   0          14m


■Serviceの確認

  kubectl get service

  NAME        TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE

  service/nginx-svc    NodePort    10.108.236.173   <none>        80:32074/TCP   4s


■PodとService両方確認

  kubectl get pod,svc

  NAME            READY   STATUS    RESTARTS   AGE

  nginx-pod       1/1     Running   0          14m


  NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE

  service/nginx-svc    NodePort    10.108.236.173   <none>          80:32074/TCP   4s


ここで、Serviceの PORT(S) に表示されている80:32074が<Podへ転送するport>:<ユーザーがアクセスするport>

となります。

<ユーザーがアクセスするport>は自動で付与されるため環境によって異なります。


ServiceのタイプがNodePortというKubernetesクラスタを構成しているノードの、どのIPアドレスどれでも

アクセス可能なServiceとなっているため、どれか一台のIPアドレスに<ユーザーがアクセスするport>を

くっつけてブラウザからhttpでアクセスしてみましょう。


  例

   http://192.168.0.100:32074


nginxのページが確認できたと思います。


今回はここまでとなります。

次回は、このpodを削除してもデータが残せるよう永続ボリュームをくっつくけるための内容を説明したいと思います。