[基礎編] Kubernetes pod でvolume mountとReplica set 試してみた@vagrant

docker

毎日ブログを書くことでなんとなくアウトプットをしているような気がするこの頃です。なんか、とりあえずモチベーションアップのためにブログ作成続けています!

今回はKubernetes (minikube)でvolume Mount とreplica set 試してみました!

環境

  • vagrant
  • Alma Linux 8
  • minikube

です!

検証してみよう!の前に

まず、検証する前に少し説明だけ加えておきます。今回やる内容は、volume Mount を試すのとReplica set を試すことです。gemini に聞いてみます!

Volume Mount とは??

Volume Mountとは、Pod内のコンテナがVolumeにアクセスするための設定です。Podの定義の中で、どのVolumeをコンテナ内のどのパスにマウントするかを指定します。

generated by gemini

???ですね。まあ、コンテナの中の特定のディレクトリとホスト側の特定のディレクトリを共有することができるように設定するみたいなことですね。ホスト側にsample.txt を置いたら、コンテナの中でも同じものが閲覧することができます。

じゃあ、replica set も聞いてみます。

Replica Set ???とは?

Replica Set は、指定された数の Pod のレプリカ(複製)を常に実行し続けることを保証するための Kubernetes のコントローラーです。もし何らかの原因で Pod がダウンしたり削除されたりした場合、Replica Set は自動的に新しい Pod を作成し、常に指定された数の Pod が稼働している状態を維持します。

generated by gemini 

これは直観的になんとなくわかりますね。まあ、auto scaling みたいな感じです。3 台ずっと起動しといてほしいなーーって定義したら、ずっとその台数にしてくれるみたいな感じです。削除されても、3 台に自動的に戻ります。

なんとなく、内容も分かったところで、やっていきましょう!!!

まずは、Volume Mount です。

Volume Mount の検証

manifest ファイルを記載すると、こんな感じになります!

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: nginx
    image: nginx:1.17.2-alpine
    volumeMounts:
    - name: storage
      mountPath: /home/nginx
  volumes:
  - name: storage
    hostPath:
      path: /data/storage
      type: DirectoryOrCreate

spec の中に volumeMounts と hostPath っていうのがそれぞれ項目としてあります。名前が結構わかりやすいので、どっちがどっちか直ぐにわかるかもですが、

  • hostPath = host 側のdisk
  • volumeMounts = コンテナの中のdisk

です。これでapply してみて、問題なく起動していれば大丈夫です!!なんかのエラーが発生して、mount ができないとかがあれば、pod が起動しないことがありますので、kubectl logs やdescribe で詳細なエラーを見てみてください!

Replica set の検証

まずは、manifest ファイルです。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicatest
  labels:
    app: replicatest
spec:
  replicas: 3
  selector:
    matchLabels:
      app: replicatest
  template:
    metadata:
      labels:
        app: replicatest
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

ReplicaSet は少しばかり複雑です。

まずは、apiVersion などが違います。

apiVersion: apps/v1
kind: ReplicaSet

apiVersion は、単なるv1 ではなくて、apps/v1 とする必要があります。これは定義方法なので、カテゴリーみたいな感じだと理解するといいかもです。kind にはReplicaSet と定義する必要があります。pod とは書かないように注意です。

次に、ここですね!

spec:
  replicas: 3
  selector:
    matchLabels:
      app: replicatest

replicas は、何台が持続的に起動状態になるようにしますか?というのを定義する箇所です。そして、selector というのが、下に書くtemplate と連動していて、matchLabels と一緒のものが、pod として起動するようになっています。matchLabels の値と、template のLabel の値が一致しなかったら、pod は起動しないです。

そして、最後にここですね。

  template:
    metadata:
      labels:
        app: replicatest
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

template は、上で少し述べましたが、pod の中身を定義したものですね。どんなpod がReplica として起動してくるかを決める記述になります。今回の場合は、nginx の1.14.2 がのimage が起動するようになっています。

なので、起動して、3台起動していたら、成功です!!!replicas の数字を変えてみて、applyすると台数も変わるので、試してみると面白いかもしれません。

 kubectl get pods
NAME                READY   STATUS    RESTARTS   AGE
replicatest-75bx9   1/1     Running   0          8s
replicatest-dz4m6   1/1     Running   0          8s
replicatest-qssr9   1/1     Running   0          8s

起動方法はいつもと一緒です。

# start
kubectl apply -f <manifest_name>.yml

# delete
kubectl delete -f <manifest_name>.yml

掃除するのは忘れずにしてください。まあ、vagrant の場合は無料ですが。

まとめ

Docker でよく使うようなVolume mount と、あまり使わない auto scaling みたいな、ReplicaSet の立て方を紹介しました。このブログが足掛かりになると嬉しいです!!

troubleshooting 編

Volume で結構詰まりました。

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: nginx
    image: nginx:1.17.2-alpine
    volumeMounts:
    - name: storage
      mountPath: /home/nginx
  volumes:
  - name: storage
    hostPath:
      path: ./data/storage
      type: DirectoryOrCreate

manifest ファイルは上で書いていたのですが、このエラーが発生してずっと小一時間悩みました。。どうも、対応してるhostPath っていうのがあるらしくて、それが原因だったようでした。なんだ、何でもいいわけでもないみたいなので、設計する時は注意ですね。。

NAME   READY   STATUS              RESTARTS   AGE
test   0/1     ContainerCreating   0          118s

  Normal   Scheduled    12s               default-scheduler  Successfully assigned default/test to minikube
  Warning  FailedMount  4s (x5 over 12s)  kubelet            MountVolume.SetUp failed for volume "storage" : hostPath type check failed: /data/storage is not a directory

参照サイトです!

Persistent Volumes
About persistent volumes (hostPath)

コメント

タイトルとURLをコピーしました